感谢您查看我的问题。我正在尝试基于一些预训练模型进行图像分类,这些图像需要被分类到40个类别中。我想使用VGG和Xception预训练模型将每张图像转换为两个1000维度的向量,并将它们堆叠成一个1*2000维度的向量作为我的网络的输入,网络的输出为40维度。网络有两个隐藏层,一个有1024个神经元,另一个有512个神经元。
结构:图像-> vgg(1*1000维度), xception(1*1000维度)->(1*2000维度)作为输入 -> 1024个神经元 -> 512个神经元 -> 40维度输出 -> softmax
然而,使用这种结构我只能达到大约30%的准确率。所以我的问题是,如何优化我的网络结构以达到更高的准确率?我对深度学习是新手,所以我并不完全确定我当前的设计是否“正确”。我非常期待您的建议
回答:
我不是完全理解您的网络架构,但有些部分看起来不太对劲。
有两种主要的迁移学习场景:
-
卷积网络作为固定特征提取器。使用预训练网络(VGG和Xception中的任何一个都可以,不需要两个),移除最后一层全连接层(这一层的输出是针对不同任务如ImageNet的1000个类别得分),然后将卷积网络的其余部分作为新数据集的固定特征提取器。例如,在AlexNet中,这将为每张图像计算一个4096-D的向量,包含分类器之前的隐藏层的激活。一旦您提取了所有图像的4096-D代码,为新数据集训练一个线性分类器(例如线性SVM或Softmax分类器)。
提示#1:只使用一个预训练网络。
提示#2:不需要为您自己的分类器设置多个隐藏层。
-
微调卷积网络。第二种策略是不仅在新数据集上替换和重新训练卷积网络顶部的分类器,还通过继续反向传播来微调预训练网络的权重。可以微调卷积网络的所有层,或者可以保持一些早期的层固定(由于过拟合的担忧)并只微调网络的某些更高层次的部分。这是基于观察到的,卷积网络的早期特征包含更多通用特征(例如边缘检测器或颜色斑点检测器),这些特征对许多任务应该是有用的,但卷积网络的晚期层对原始数据集中包含的类的细节变得越来越具体。
提示#3:保持早期预训练层固定。
提示#4:使用较小的学习率进行微调,因为您不希望其他预训练层过快过多地扭曲。
这种架构更接近我见过的解决相同问题的架构,并且有更高的几率达到高准确率。