为啥我的基于 Alexnet 的 CNN 分类失败?

Posted

技术标签:

【中文标题】为啥我的基于 Alexnet 的 CNN 分类失败?【英文标题】:Why my CNN based on Alexnet fails in classification?为什么我的基于 Alexnet 的 CNN 分类失败? 【发布时间】:2017-09-06 12:32:37 【问题描述】:

我正在尝试构建一个 CNN 来对狗进行分类。事实上,我的数据集由 5 类狗组成。我将 50 张狗的图像分成 40 张用于训练的图像和 10 张用于测试的图像。 我已经基于 AlexNet 预训练模型训练了我的网络,经过 100,000 和 140,000 次迭代,但准确度始终在 20% 到 30% 之间。 事实上,我已经对 AlexNet 进行了如下调整:我将最后一个全连接网络的名称和 num_output 更改为 5。此外,我还更改了第一个全连接层 (fc6) 的名称。

那么为什么即使我使用了数据增强(裁剪)这个模型也失败了?

我应该在我的网络顶层使用线性分类,因为我有一点数据并且类似于 AlexNet 数据集(如这里提到的transfer learning),还是我的数据集与 AlexNet 的原始数据集非常不同,并且我应该在早期的网络中训练线性分类器?

这是我的求解器:

net: "models/mymodel/train_val.prototxt"
test_iter: 1000
test_interval: 1000
base_lr: 0.01
lr_policy: "step"
gamma: 0.1
stepsize: 100000
display: 20
max_iter: 200000
momentum: 0.9
weight_decay: 0.0005
snapshot: 1000
snapshot_prefix: "models/mymodel/my_model_alex_net_train"
solver_mode: GPU

【问题讨论】:

您的批量大小是多少? solver 文件的训练参数是什么?还有许多其他考虑因素,但这些都是一个好的开始。 【参考方案1】:

虽然你没有给我们太多的调试信息,但我怀疑你做了一些严重的过拟合。一般来说,模型的训练“最佳位置”取决于时期,而不是迭代。单节点 AlexNet 和 GoogleNet,在 ILSVRC 风格的数据库上,训练 50-90 个 epoch。即使您的批量大小只有 1 个,您也已经训练了 2500 个 epoch,只有 5 个类。每个类只有 8 张图片,AlexNet 拓扑严重过度杀伤,很可能适用于每张单独的照片。

考虑一下:您只有 40 张训练照片,但第一个卷积层有 96 个内核,第二个卷积层有 256 个。这意味着对于每张照片,您的模型可以在 conv1 中花费超过 2 个内核,在 conv 2 中花费 6 个内核!你没有共同的特征,没有平均...而不是边缘检测泛化到寻找人脸,你将有专门的过滤器调整到个别照片。

简而言之,您的模型经过训练,可以在厨房橱柜前的绿色地毯上找到“波莉阿姨的狗,左侧有一片阳光”。它不必学习区分巴塞特和巴塞特,只需识别每张照片中随机方便的内容即可。

【讨论】:

您能解释一下 epoch 和迭代之间的区别以及如何固定 epoch 的数量吗? 在这里,让我为您搜索...answer。您可以更改您的solver.prototxt 文件中的迭代次数。 感谢您的帮助,所以我的问题的解决方案是拥有更多数据? 更多数据是一种可能;没有一个解决方案。最合适的解决方案取决于您的应用程序和范例。

以上是关于为啥我的基于 Alexnet 的 CNN 分类失败?的主要内容,如果未能解决你的问题,请参考以下文章

AlexNet详解

[人工智能-深度学习-32]:卷积神经网络CNN - 常见分类网络- AlexNet

CNN网络:AlexNet

[Python图像识别] 五十.Keras构建AlexNet和CNN实现自定义数据集分类详解

CNN-2: AlexNet 卷积神经网络模型

步态识别基于深度学习的步态识别系统的MATLAB仿真,包括ALEXNET,改进CNN,GOOGLENET