进行迁移学习时,如何在vgg16内添加customm层?

时间:2019-09-12 22:28:13

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

我正在尝试通过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()

1 个答案:

答案 0 :(得分:0)

由于VGG16第7层需要128个过滤器,因此您需要将其与最终的Conv2D匹配

model.add( Conv2D(128, (3, 3), activation='relu', padding='same', name='block66_conv3_m') )

如果尺寸匹配,则应该能够构建模型,但是不清楚要实现的目标。您将其添加到VGG16模型中间的方法将意味着所有下游层都需要重新培训