您将如何优化预训练 neural network
以将其应用于单独的问题?您是否会在预训练模型中添加更多层并在您的数据集上对其进行测试?
例如,如果任务是使用CNN对壁纸组进行分类,我敢肯定,即使它们都是图像分类器,也不能直接从对图像猫和狗进行训练的预训练网络进行分类。
您将如何优化预训练 neural network
以将其应用于单独的问题?您是否会在预训练模型中添加更多层并在您的数据集上对其进行测试?
例如,如果任务是使用CNN对壁纸组进行分类,我敢肯定,即使它们都是图像分类器,也不能直接从对图像猫和狗进行训练的预训练网络进行分类。
Do Read - When Transfer Learning is Disadvantageous ?(感谢@media) (对我来说看起来很有信息,所以在这里添加以使这个答案成为一个完整的答案......)
回答你的问题..(从这里开始)
迁移学习就是你要找的东西。。
当我们接到一个深度学习任务时,比如说,一个涉及在图像数据集上训练卷积神经网络 (Covnet) 的任务,我们的第一反应是从头开始训练网络。然而,在实践中,像 Covnet 这样的深度神经网络有大量的参数,通常在数百万的范围内。在小数据集(小于参数数量的数据集)上训练 Covnet 会极大地影响 Covnet 的泛化能力,通常会导致过度拟合。
因此,在实践中,更常见的是,通过在我们拥有的较小数据集上继续训练(即运行反向传播)来微调在 ImageNet(1.2M 标记图像)等大型数据集上训练的现有网络。假设我们的数据集在上下文中与原始数据集(例如 ImageNet)没有太大差异,预训练模型将已经学习到与我们自己的分类问题相关的特征。
何时微调模型?
一般来说,如果我们的数据集在上下文中与训练预训练模型的数据集没有太大差异,我们应该进行微调。在像 ImageNet 这样的大型多样化数据集上预训练的网络在其早期层中捕获了曲线和边缘等通用特征,这些特征与大多数分类问题相关且有用。
当然,如果我们的数据集代表一些非常特定的领域,例如医学图像或汉字手写体,并且无法找到该领域的预训练网络,那么我们应该考虑从头开始训练网络。
另一个问题是,如果我们的数据集很小,在小数据集上微调预训练网络可能会导致过度拟合,特别是如果网络的最后几层是全连接层,例如 VGG 网络。根据我的经验,如果我们有几千个原始样本,并实施了常见的数据增强策略(平移、旋转、翻转等),微调通常会给我们带来更好的结果。
如果我们的数据集真的很小,比如少于一千个样本,更好的方法是将全连接层之前的中间层的输出作为特征(瓶颈特征)并在其之上训练一个线性分类器(例如 SVM)它。SVM 特别擅长在小数据集上绘制决策边界。
微调技术
以下是微调实施的一些一般准则:
常见的做法是截断预训练网络的最后一层(softmax 层),并将其替换为与我们自己的问题相关的新的 softmax 层。例如,ImageNet 上的预训练网络带有一个包含 1000 个类别的 softmax 层。
如果我们的任务是对 10 个类别进行分类,那么网络的新 softmax 层将是 10 个类别而不是 1000 个类别。然后我们在网络上运行反向传播来微调预训练的权重。确保执行交叉验证,以便网络能够很好地泛化。
使用较小的学习率来训练网络。由于我们期望预训练的权重与随机初始化的权重相比已经相当不错,因此我们不想太快和太多地扭曲它们。一种常见的做法是使初始学习率比用于临时训练的学习率小 10 倍。
冻结预训练网络的前几层的权重也是一种常见的做法。这是因为前几层捕获了与我们的新问题相关的通用特征,如曲线和边缘。我们希望保持这些权重不变。相反,我们将让网络专注于在后续层中学习特定于数据集的特征。
在这种情况下,您需要再次训练它们,就好像我没有错,那么壁纸不是一类 Image-net 模型。从头开始构建模型并不难(最好是较浅的模型)也在这里做..)
如需进一步阅读,