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

问题描述 投票:0回答:1

我建立并训练了一个基于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:无法为Tensor'Plamber_869:0'提供形状值(3,3,3,64),其形状为'(3,3,256,512)'

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

python keras conv-neural-network
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.