【问题标题】:How to add customm layers inside vgg16 when doing transfer learning?进行迁移学习时如何在 vgg16 中添加自定义层?
【发布时间】:2020-01-14 20:01:36
【问题描述】:

我正在尝试使用 vgg16 进行迁移学习。我的主要概念是训练vgg16的前几层,然后添加我自己的层,然后添加vgg16的其余层,最后添加我自己的输出层。为此,我遵循以下顺序:(1)加载层和冻结层,(2)添加我的层,(3)加载其余层(输出层除外)[这是我遇到以下错误的地方]并冻结层,(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()

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 我想在 Vgg16 模型中添加一个图层。我想要做的是这样的:(1)从block1到block3使用Vgg16层(2)添加我的自定义层(3)添加其余的vgg层。通过这种方式,我想看看模型对我的数据的影响。定制模型是否正确?
    • 是的,我理解您的方法,但不清楚您为什么要这样做。您在第 3 步中添加的 VGG 层将具有取决于原始层的权重,它们不适用于您的自定义层。您必须训练在第 2 步和第 3 步中添加的所有层。
    • 这意味着不可能在 VGG 的层之间包含任何层,对吧?我想在现有的 vgg 层之间包含一些层,并且只训练我包含的层并冻结 VGG 层以查看它如何用于我的二进制对象分类任务。从您的回答看来,我的方法似乎是错误的,好像我冻结了在第 3 步中添加的层,它们不会根据第 2 层生成的权重进行更新。所以,没有必要这样做,而不是训练层在第 2 步和第 3 步中添加了对吗?
    • 我会说它不太可能奏效,如果你有足够的数据,最好在第 2 步和第 3 步中训练所有层。如果你的训练数据有限并且想要利用预训练的模型你最好自定义最终层。
    • 你的意思是自定义最后两个全连接层?
    猜你喜欢
    • 2017-09-14
    • 2019-10-15
    • 2019-10-29
    • 2019-06-28
    • 2021-06-03
    • 2019-12-17
    • 2019-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多