我建立并训练了基于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)
仅显示了我添加的最后一层。那么如何改变我自己的training_model的可训练层呢?还是有另一种方式获得相同的结果?
答案 0 :(得分:0)
This可能是解决方案。我使用以上代码创建了基于vgg16的模型。然后,我通过运行以下代码来更改最后一层的权重:model.layers[1].set_weights(trained_model.layers[1].get_weights())
。自从我向vgg16添加4层以来,我通过将层索引从1更改为4来执行了此代码。我还没有尝试过该模型。如果这不是正确的解决方案,我将很高兴阅读您的回答。