繁体   English   中英

Keras 如何更改已加载模型的可训练层

[英]Keras how to change trainable layers of a loaded model

我基于 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:无法为张量“Placeholder_869:0”提供形状 (3, 3, 3, 64) 的值,其形状为“(3, 3, 256, 512)”

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM