我试图建立一个CNN来对狗进行分类。事实上,我的数据集由5类狗组成。我将50张狗的图像分成了40张用于训练的图像和10张用于测试的图像。 我基于AlexNet预训练模型训练了我的网络超过100,000次和140,000次迭代,但准确度始终在20%到30%之间。 事实上,我已经将AlexNet改编成我的问题,如下所示:我将最后一个完全连接的网络的名称和num_output更改为5.此外,我更改了第一个完全连接的图层的名称(fc6)。
为什么这个模型甚至失败了? ve使用了数据增加(裁剪)?
我应该在网络的顶层使用线性分类,因为我有一些数据并且类似于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
答案 0 :(得分:1)
虽然您没有给我们提供太多的调试信息,但我怀疑您已经完成了一些严重的过度拟合。一般来说,模型的训练“最佳位置”取决于时代,而不是迭代。单节点AlexNet和GoogleNet,基于ILSVRC风格的数据库,可在50-90个时期内进行训练。即使你的批量大小只有1,你也只训练了2500个时期,只有5个班级。每个类只有8个图像,AlexNet拓扑结构严重过度杀伤,可能适用于每张照片。
考虑一下:你只有40张训练照片,但第一个卷积层有96个内核,第二个卷入层有256个内核。这意味着您的模型可以在conv1中花费超过2个内核,在每个每个照片中在conv 2中花费6个内核!你没有共同的功能,没有平均...而不是边缘检测推广到寻找面孔,你将有专门的过滤器调整到单个照片。
简而言之,您的模型经过培训,可以在厨房橱柜前面的绿色地毯上找到“姨妈波莉的狗,左边有一片太阳。”它不需要学习区分basenji和basset,只是为了识别每张照片中随机方便的东西。