我正在尝试构建一个用于分类狗的CNN。实际上,我的数据集包含5个狗的类别。我有50张狗的图片,分为40张用于训练,10张用于测试。我基于AlexNet预训练模型训练了我的网络,迭代次数在10万到14万之间,但准确率始终在20%到30%之间。实际上,我对AlexNet进行了如下调整以适应我的问题:我更改了最后一个全连接网络的名称,并将num_output设置为5。此外,我还更改了第一个全连接层(fc6)的名称。
那么,为什么即使我使用了数据增强(裁剪),这个模型仍然失败了呢?
鉴于我的数据量较少且与AlexNet数据集类似(如迁移学习中提到的),我是否应该在网络的顶层使用线性分类器?还是我的数据集与AlexNet的原始数据集差异很大,我应该在网络的早期训练线性分类器?
这是我的求解器配置:
net: "models/mymodel/train_val.prototxt"test_iter: 1000test_interval: 1000base_lr: 0.01lr_policy: "step"gamma: 0.1stepsize: 100000display: 20max_iter: 200000momentum: 0.9weight_decay: 0.0005snapshot: 1000snapshot_prefix: "models/mymodel/my_model_alex_net_train"solver_mode: GPU
回答:
虽然你没有提供很多调试信息,但我怀疑你已经进行了严重的过拟合。一般来说,模型训练的“最佳点”取决于轮次(epochs),而不是迭代次数(iterations)。在ILSVRC风格的数据集上,单节点的AlexNet和GoogleNet通常在50到90个轮次内完成训练。即使你的批次大小只有1,你也已经训练了2500个轮次,而只有5个类别。每个类别只有8张图片,AlexNet的拓扑结构对于这种情况来说是严重的过度设计,可能会适应每张照片的个体特征。
考虑一下:你只有40张训练照片,但第一层卷积层有96个核,第二层有256个核。这意味着你的模型可以为每张照片在第一层卷积上使用超过2个核,在第二层使用超过6个核!你无法获得特征的共性,也无法进行平均……与其让边缘检测泛化到识别面部,你得到的将是专门针对每张照片调整的滤波器。
简而言之,你的模型被训练去寻找“波莉阿姨的狗站在厨房柜前绿色地毯上,左边有一片阳光”的场景。它不需要学习区分巴辛吉犬和巴吉犬,只需要识别每张照片中随机出现的任何东西即可。