【发布时间】: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