我正在尝试通过vgg16使用转移学习。我的主要概念是训练vgg16的前几层,并添加我自己的层,后言添加vgg16中的其余层,并在末尾添加我自己的输出层。为此,我按以下顺序进行:(1)加载图层和freez图层,(2)添加我的图层,(3)加载其余的图层(输出图层除外)[这是我遇到以下错误的地方]和freez该层,(4)添加输出层。我的方法可以吗?如果没有,那么我在哪里做错了?这是错误:
ValueError:输入0与图层block3_conv1不兼容:预期输入形状的轴-1的值为128,但形状为(无,64、56、64)
完整的代码在这里,可以更好地理解:
vgg16_model= load_model('Fetched_VGG.h5')
vgg16_model.summary()
model= Sequential()
#add vgg layer (inputLayer, block1, block2)
for layer in vgg16_model.layers[0:6]:
model.add(layer)
#frees
# Freezing the layers (Oppose weights to be updated)
for layer in model.layers:
layer.trainable = False
#add custom
model.add(Conv2D(64, (3, 3), activation='relu', padding='same', name='block66_conv1_m') )
model.add( Conv2D(64, (3, 3), activation='relu', padding='same', name='block66_conv2_m') )
model.add( Conv2D(64, (3, 3), activation='relu', padding='same', name='block66_conv3_m') )
model.add( MaxPooling2D((2, 2), strides=(2, 2), name='block66_pool_m'))
# add vgg layer (block 3 to last layer (except the output dense layer))
for layer in vgg16_model.layers[7:-1]:
model.add(layer)
# Freezing the layers (Oppose weights to be updated)
for layer in model.layers:
layer.trainable = False
# add out out layer
model.add(Dense(2, activation='softmax', name='predictions'))
model.summary()
答案 0 :(得分:0)
由于VGG16第7层需要128个过滤器,因此您需要将其与最终的Conv2D匹配
model.add( Conv2D(128, (3, 3), activation='relu', padding='same', name='block66_conv3_m') )
如果尺寸匹配,则应该能够构建模型,但是不清楚要实现的目标。您将其添加到VGG16模型中间的方法将意味着所有下游层都需要重新培训