如何使用前10层经过预先训练的模型,例如VGG19 keras?

时间:2019-08-08 04:37:36

标签: python tensorflow keras transfer-learning vgg-net

我正在尝试将VGG19的前10层用于图像分类任务的转移学习。

我尝试使用前10层,但是当我将其添加到顺序模型并显示摘要时,我得到了一个错误。

basemodel = VGG19(include_top = False)    
x = basemodel.layers[-10]    
model = Sequential()    
model.add(keras.layers.Conv2D(32,(7,7),input_shape = (256,256,3),activation = 'relu'))    
model.add(x)    
model.summary()

3 个答案:

答案 0 :(得分:0)

我运行模型,错误是: <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@1.0.0/dist/tf.min.js"></script> epochs: <input type="number" id="epochs" value="50" /> learning rate: <input type="number" id="learning_rate" value="0.04" /> <button id="train">Train</button>

ValueError: Input 0 is incompatible with layer block4_conv1: expected axis -1 of input shape to have value 256 but got shape (None, 250, 250, 32)删除输入形状 并将其添加到basemodel:

keras.layers.Conv2D

或者如果您想使用Imagenet:

basemodel = VGG19(include_top = False,input_shape=(256,256,3),weights='None')

拟合模型,让我知道发生了任何错误。

答案 1 :(得分:0)

您仅从VGG模型中提取了一层,然后以错误的方式连接了它们。 这里是正确的方法之一:

basemodel = VGG19(include_top = False)    
model = tf.keras.Sequential(basemodel.layers[:10])
model.add(keras.layers.Conv2D(32, (7, 7), activation = 'relu'))
model.summary()

请注意,VGG的第一层是InputLayer,因此您应该使用basemodel.layers[:11]

请注意,要微调模型,最好固定VGG层的权重:

for layer in model.layers[:10]:
    layer.trainable = False

答案 2 :(得分:0)

问题是不是添加前 10 层,而是从顶部添加第 10 层。此外,该层的输入应具有 256 的倍数的通道。只需将代码替换为:

model.add(keras.layers.Conv2D(256,(7,7),input_shape = (256,256,3),activation = 'relu'))