XiNian_dada's Blog - 支持向量机
type: channel
link: https://www.leeinx.com/tag/%E6%94%AF%E6%8C%81%E5%90%91%E9%87%8F%E6%9C%BA/
items: ACASB-JavaSpringBoot+Python异构双引擎项目实战 - 2 - 一些问题

ACASB-JavaSpringBoot+Python异构双引擎项目实战 - 2 - 一些问题
type: item
date: 2026-02-13T02:15:00+08:00
description: 继上回，方案看似很好，所以我设计了一个19维度的参数，从归一化后（统一调整为400*400大小的图像），大概是不同颜色的占比、图像中的线条结构等信息，然后拿去训练了一个浅层的神经网络（128 64 32），先测试了一下简单的二分类，即把宫廷建筑和平民建筑分类，效果很好。我以为这就完了，结果按照预期方案进行四分类的时候出乱子了，发现训练效果非常容易就过拟合了把所有样本映射到这样一个二维图上，问题很明显了，官员阶级的建筑风格混合了其他三个阶级的风格，导致神经网络很难学习到相关的信息，所以我开始考虑支持向量机来进行分类任务了。支持向量机 SVM借用知乎上的图，支持向量机的原理是通过找出一个最大间隔，将东西分类而我们的输入数据有19维的数据，即所有样本在一个19维的超平面里，我们的目的是找到另外的超平面，将样本大致分为四类当然，我们现有的MLP也没有落下，我重新设计了一个新的Hybrid MLP，他是把SVM中某个样本距离边界的距离再作为一个输入交给MLP，扩展了MLP的输入，初步看起来效果还挺好图片真实标签SVM预测Baseline MLPHybrid MLProyal/1.jpg皇帝皇帝 ✓皇帝 ✓皇帝 ✓prince/1.jpg亲王亲王 ✓官员 ✗亲王 ✓official/1.jpg官员平民 ✗平民 ✗平民 ✗civi/1.jpg平民平民 ✓平民 ✓平民 ✓official/5.jpg官员官员 ✓官员 ✓官员 ✓official/10.jpg官员官员 ✓官员 ✓官员 ✓在第二组测试里，SVM提供的新维度的输入正好纠正了原本MLP的预测数据，这样就成功的结合了支持向量机和MLP各自的优势但是新的问题又出现了，我注意到所有的预测，信度都偏低，比如上述六个预测的信度分别为0.49 0.45 0.57 0.87 0.77 0.91，很多的信度明显偏低我当时认为的主要原因应该是训练样本的相似度有些高（目前条件被迫限制了每类样本只有50个左右），19维特征太少，这是很典型的小样本训练。还有在第一组测试中，虽然hybrid MLP的信度为0.49，但SVM的信度高达0.8，还可能是SVM决策值和原始特征的融合方式有点问题所以接下来的问题貌似很清楚了，增加MLP的复杂度，多训练几轮按照这个方法来，信度明显上升了，但是准确度却发生了下降？信度表图片真实标签优化前Hybrid优化后Hybrid提升royal/1.jpg皇帝0.49610.7968+60.6%prince/1.jpg亲王0.45520.6163+35.4%official/1.jpg官员0.57100.7844+37.4%civi/1.jpg平民0.87430.7936-9.2%准确度表模型优化前优化后变化SVM65.91%59.09%-6.82%Hybrid MLP63.64%59.09%-4.55%Baseline MLP56.82%47.73%-9.09%接下来，我尝试获取到现在的神经网络在训练集上的表现怎么样，发现无论是SVM还是HybridMLP，准确度都大于90%，而原始的MLP准确度仅有60%复制SVM 混淆矩阵 真实\预测 皇帝 亲王 官员 平民 皇帝 51 0 1 3 亲王 0 51 1 1 官员 1 1 48 1 平民 3 3 4 49 HybridMLP 混淆矩阵 真实\预测 皇帝 亲王 官员 平民 皇帝 50 0 1 4 亲王 1 50 1 1 官员 1 1 48 1 平民 1 2 5 51看起来还不错，但作为建筑判断，我总觉得19维的参数不太够，于是又增加了很多新的参数，比如HSV偏度，LBP纹理等等，信度又明显提升了，准确度接近95%正当我沉浸在胜利的快感中，我的直觉告诉我出大事了过拟合：来了奥我把测试集拿去进行测试，显然意外发生了我的神经网络在测试集上的准确度表现低于40%，这意味着我的MLP完全是在瞎猜而且我重复进行了五次测试，准确度都惊人的统一，这证明了我的神经网络完全记住了训练集里的答案，首先让我怀疑的是这接近50维的参数，可能是维度过大导致MLP什么都学不到，而且样本量偏少，导致了训练效果不好且容易过拟合，所以我进行了一些数据增强，比如对50%的样本进行水平翻转、小角度偏转、亮度偏移等等，把样本量扩大了一倍，然后将MLP中的神经元个数所哦见到原来的一半，开启早停防止过拟合复制from torchvision import transforms# 数据增强变换 self.transform_augment = transforms.Compose([ transforms.RandomResizedCrop(224, scale=(0.8, 1.0)), # 随机裁剪 transforms.RandomHorizontalFlip(p=0.5), …