在 Keras 中加载权重后添加 DropOut
Add DropOut after loading the weights in Keras
我在做迁移学习之王。我所做的是首先用大数据集训练模型并保存权重。然后我通过冻结图层来使用我的数据集训练模型。但我看到有些过度拟合。因此,我尝试更改模型的 dropout 并加载权重,因为数字在变化,而 dropout 也在变化。我发现很难改变辍学。
直接我的问题是,是否可以在加载权重时更改模型的丢失?
我的场景1就是这样
- 模型已定义。
- 训练模型。
- 列表项
- 节省重量。
...
重新定义dropout 其他在模型中没有改变
- 加载权重。我得到了错误。
第二个场景
model1 已定义。
训练模型。
保存权重
加载模型1权重到模型1
.....
model2 通过改变 dropouts 定义。
尝试使用 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'])
同样,此处传递的参数仅供参考,因此请根据您的问题进行相应更改。
我在做迁移学习之王。我所做的是首先用大数据集训练模型并保存权重。然后我通过冻结图层来使用我的数据集训练模型。但我看到有些过度拟合。因此,我尝试更改模型的 dropout 并加载权重,因为数字在变化,而 dropout 也在变化。我发现很难改变辍学。
直接我的问题是,是否可以在加载权重时更改模型的丢失?
我的场景1就是这样
- 模型已定义。
- 训练模型。
- 列表项
- 节省重量。
...
重新定义dropout 其他在模型中没有改变
- 加载权重。我得到了错误。
第二个场景
model1 已定义。
训练模型。
保存权重
加载模型1权重到模型1
.....
model2 通过改变 dropouts 定义。
尝试使用 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'])
同样,此处传递的参数仅供参考,因此请根据您的问题进行相应更改。