【问题标题】:Keras how to change trainable layers of a loaded modelKeras 如何更改已加载模型的可训练层
【发布时间】:2019-05-31 22:51:17
【问题描述】:

我构建并训练了一个基于 vgg16 网络的网络。在原始网络中,我冻结了 vgg16 的所有层,只训练了我在 vgg16 末尾添加的最后 4 层。现在我想通过更改可训练层以使用我自己的权重而不是 ImageNet 权重来加载和重新训练这个模型。最初我尝试通过使用以下代码更改 vgg16 的可训练层和模型权重来构建相同的模型。

# Load the VGG model
vgg_conv = VGG16(weights='imagenet', include_top=False, input_shape=(image_size, image_size, 3))

# Freeze n number of layers from the last
for layer in vgg_conv.layers[:-8]: layer.trainable = False 

# Check the trainable status of the individual layers
for layer in vgg_conv.layers: print(layer, layer.trainable)          

# Create and compile the model
model = createModel()
trained_model = keras.models.load_model(trained_dir)
model.set_weights(trained_model.get_weights())
model.compile(loss='categorical_crossentropy', optimizer=optimizers.RMSprop(lr=lr), metrics=['acc'])

但这给了我这个错误:

ValueError: 无法为形状为“(3, 3, 256, 512)”的张量“Placeholder_869:0”提供形状 (3, 3, 3, 64) 的值

当我检查原始网络和新网络的权重时,我发现一些权重的形状不同。我还尝试更改原始网络的可训练层,但for layer in trained_model.layers: print(layer, layer.trainable) 仅显示我添加的最后一层。那么如何改变我自己的trained_model的可训练层呢?还是有其他方法可以获得相同的结果?

【问题讨论】:

    标签: python keras conv-neural-network


    【解决方案1】:

    This 可能是可能的解决方案。我用上面的代码创建了一个基于 vgg16 的模型。然后我通过运行以下代码更改了最后一层的权重:model.layers[1].set_weights(trained_model.layers[1].get_weights())。由于我向 vgg16 添加了 4 层,因此我通过将层索引从 1 更改为 4 来执行此代码。我还没有尝试过该模型。如果这不是正确的解决方案,我很乐意阅读您的答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-07
      • 1970-01-01
      • 1970-01-01
      • 2017-07-28
      • 2020-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多