keras 微调模型

参考 此处 

最近新down了一个源码,写的非常“精彩”,我之前的想法 他都用代码复现了,idea被复现 悔我不会写代码。。。但是想到一个新模型想在他的基础上训练看看结果,于是就掉入了 keras的坑。 下面一起来看看如何冻结前面的已训练好的层,只训练后面的模型吧。

看到 有方法说

  • 通过trainable(布尔值)对特定层进行构造,使某一层不可被训练:
frozen_layer = Dense(32, trainable=False)

 那是否是 把不需要训练的层都加上 trainable=False ,直接load 进之前的model权重 就可以训练我新加的层了??(好像想得太简单 caffe 是这样。。)

看官网

1 load进VGG16的卷积权重

2 添加我们先前定义的完全连接模型,并加载其权重 (这里很奇怪 自己新定义的层 没有权重咋办)

3 冻结VGG16模型的层到最后一个卷积块

注:1 为了执行微调,所有层都应该以经过适当训练的权重开始:例如,您不应该将随机初始化的完全连接网络置于经过预先训练的卷积基之上。这是因为由随机初始化的权重触发的大梯度更新将破坏卷积基中的学习权重。在我们的例子中,这就是为什么我们首先训练顶级分类器,然后才开始微调卷积权重。(貌似很麻烦的样子)

2 为了防止过拟合,我们选择只对最后一个卷积块进行微调,而不是对整个网络进行微调,因为整个网络将具有非常大的熵容量,因此具有过拟合的强烈趋势。由低级卷积块学习的特征比那些更高级的块更一般、更不抽象,因此保持前几个块的固定(更一般的特征)和只微调最后一个块(更专门的特征)是明智的。

3 微调应该以非常慢的学习速率进行,并且通常使用SGD优化器而不是诸如RMSProp之类的自适应学习速率优化器。这是为了确保更新的数量保持非常小,以便不破坏之前学习的特性。

在实例化VGG基并加载其权重之后,我们在顶部添加我们之前训练的完全连接的分类器:

 

(所以 它新加入的层都使用  mode.add的形式 加入的,和caffe中直接在prototxt上面加不一样?真的不便捷  但或许更严谨

还要在load进冻结的层的权重之后操作,可是如果我的网络文件是直接调用的 又嵌套进别的文件 加载权重咋办 我的天。。这是问题一    问题二是新加的层 没有自己训练的权重 还不能直接初始化了? 我有点晕)

然后,我们继续冻结所有想要冻结的卷积层

意思就是冻结到第25层,然后编译模型 用较低的学习率。(基本就完成了吧)

 这是他训练数据的一些参数配置。 及提高准确率的意见

Here are a few more approaches you can try to get to above 0.95:

  • more aggresive data augmentation  数据扩增
  • more aggressive dropout    加 dropout
  • use of L1 and L2 regularization (also known as "weight decay")   用L1 L2正则话
  • fine-tuning one more convolutional block (alongside greater regularization)  用正则化微调

现在的问题就是上哪去弄 我添加的层的权重,不如直接随机初始化试试。。

https://keras.io/getting-started/faq/#how-can-i-freeze-keras-layers

猜你喜欢

转载自blog.csdn.net/koreyoshichen/article/details/84783895