在 Keras 中加载权重后添加 DropOut

Add DropOut after loading the weights in Keras

我在做迁移学习之王。我所做的是首先用大数据集训练模型并保存权重。然后我通过冻结图层来使用我的数据集训练模型。但我看到有些过度拟合。因此,我尝试更改模型的 dropout 并加载权重,因为数字在变化,而 dropout 也在变化。我发现很难改变辍学。

直接我的问题是,是否可以在加载权重时更改模型的丢失?

我的场景1就是这样

  1. 模型已定义。
  2. 训练模型。
  3. 列表项
  4. 节省重量。
  5. ...

  6. 重新定义dropout 其他在模型中没有改变

  7. 加载权重。我得到了错误。

第二个场景

  1. model1 已定义。

  2. 训练模型。

  3. 保存权重

  4. 加载模型1权重到模型1

  5. .....

  6. model2 通过改变 dropouts 定义。

  7. 尝试使用 for 循环将模型 1 的权重设置为模型 2,除了 对于丢失层。我收到一个错误。

这是我得到的错误。

 File "/home/sathiyakugan/PycharmProjects/internal-apps/apps/support-tools/EscalationApp/LSTM_Attention_IMDB_New_open.py", line 343, in <module>
    NewModel.layers[i].set_weights(layer.get_weights())
  File "/home/sathiyakugan/PycharmProjects/Python/venv/lib/python3.5/site-packages/keras/engine/base_layer.py", line 1062, in set_weights
    str(weights)[:50] + '...')
ValueError: You called `set_weights(weights)` on layer "lstm_5" with a  weight list of length 1, but the layer was expecting 3 weights. Provided weights: [array([[ 0.      ,  0.      ,  0.      , ...,  0....

正确的方法是什么?由于我是Keras的新手,我正在努力更进一步。

我建议您使用函数 model.load_weights("weights_file.h5") 加载权重,然后尝试以下操作:

for layer in model.layers:
    if hasattr(layer, 'rate'):
        layer.rate = 0.5

因为只有Dropout层有属性rate,当你找到一个有这个属性的层时,你可以改变它。这里我使用0.5作为Dropout概率,你可以设置你想要的值。

编辑:如果您逐层设置权重,您可以在层 for 中聚合上述 if

重要:之后你必须再次编译模型:

from keras.optimizers import SGD
model.compile(optimizer=SGD(lr=1e-3, momentum=0.9), loss='categorical_crossentropy', metrics=['accuracy'])

同样,此处传递的参数仅供参考,因此请根据您的问题进行相应更改。