在Keras中加载权重后添加DropOut

时间:2018-09-06 09:12:49

标签: python tensorflow keras nlp transfer

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

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

我的情况1就是这样

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

  6. 定义模型中其他未更改的辍学

  7. 加载砝码。我得到了错误。

第二种情况

  1. model1已定义。

  2. 训练模型。

  3. 节省权重

  4. 将model1权重加载到model1

  5. ....

  6. 通过更改辍学定义的
  7. model2。

  8. 尝试使用for循环将model1的权重设置为model 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的新手,所以我努力走得更远。

1 个答案:

答案 0 :(得分:1)

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

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

由于仅Dropout图层具有属性rate,因此当您找到具有此属性的图层时,可以对其进行更改。在这里,我使用0.5作为辍学概率,您可以输入所需的值。

编辑:如果您要逐层设置权重,则可以将if中的for汇总到各个层中

重要:此后,您必须再次编译模型:

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

同样,此处传递的参数仅出于示例目的,因此请根据您的问题进行相应的更改