【问题标题】:Worse performance with transfer learning in convolutional neural network卷积神经网络中的迁移学习性能更差
【发布时间】:2017-05-22 06:37:42
【问题描述】:

我正在使用 MatConvNet 中的卷积神经网络进行情绪识别。我有一个主要的大数据集(A 有 40.000 张图片)和两个更难、更小的数据集(B、C 有 5.000 张图片)具有相同的类。当我在数据集 A 上使用随机权重初始化运行我的网络时,我得到了 70% 的准确率。

因此,我想通过在同一网络架构上的数据集 B 和 C 上预训练的权重进行初始化来提高性能。在数据集 A 上微调我的网络时,我只从预训练网络中获取三个初始层(conv、relu、pool)。但是,我得到的结果低于随机权重。我还尝试了所有层,六个第一层和一个第一层。

我是否正确理解并实施它?我使用来自预训练网络的权重,而不是前三层中的随机权重(实际上只是在第一层 - conv)。现在我不确定我是否理解这个概念。

我使用以下代码进行微调:

net = load('net-epoch-100.mat');
trainOpts.learningRate = [0.004*ones(1,25), 0.002*ones(1,25), 
0.001*ones(1,25), 0.0005*ones(1,25)];  %I set much higher training rate
                                       %for pretraining on datasets B and C
net.layers=net.layers(1:end-13);       %only taking first three layers from pretrained net
... the rest of the layers

【问题讨论】:

    标签: initialization neural-network transfer matconvnet pre-trained-model


    【解决方案1】:

    “在数据集 A 上微调我的网络时,我只从预训练网络中获取三个初始层(conv、relu、pool)。”

    由于 relu 和 pool 不可训练,您基本上只使用了预训练网络中的一层。第一个 conv 层只是进行一些边缘检测,不捕获任何高级视觉概念。 迁移学习的最佳实践是使用来自高层的 ImageNet 预训练特征。您可以先在大型数据集上对其进行微调,然后在小型数据集上对其进行微调。

    【讨论】:

    • 感谢@DataHungry 的回答。我也尝试对 3 个 conv 层做同样的事情,但结果也更糟。我会按照您的建议尝试使用 ImageNet。您知道如何在 Matlab 中实现“高级预训练特征”吗?我加载预训练的网络,从中获取一些第一层,然后使用我自己的层?
    • @Nicole 您应该保留预训练网络的大部分层,而不仅仅是最初的几个层。我建议你:(1)加载预训练的网络。 (2) 去掉最后几层。 (3)附加几层以适应你的问题
    • 现在我的准确率提高了近 10%!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-17
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-25
    相关资源
    最近更新 更多