代码之家  ›  专栏  ›  技术社区  ›  machinery

ResNet(2D图像)与全连接网络(1D输入)的连接

  •  0
  • machinery  · 技术社区  · 4 年前

    我在Keras(TensorFlow 2)中使用预构建的ResNet,方式如下:

    from tensorflow.keras.applications.resnet50 import ResNet50
    base_model = ResNet50(weights=None, include_top=False, input_shape=(39,39,3))
    x = base_model.output
    x = GlobalAveragePooling2D()(x)
    x = Dropout(0.5)(x)
    output_tensor = Dense(self.num_classes, activation='softmax')(x)
    cnn_model = Model(inputs=base_model.input, outputs=output_tensor)
    opt = Adam(lr=0.001)
    cnn_model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=['accuracy', tf.keras.metrics.AUC()])
    

    模型的输入( base_model.input )都是 39 x 39 x 3 图像。此外,我现在还想为模型提供一个包含额外信息的20维向量(即。 20 x 1 ). 我可以通过两种不同的方式做到这一点:

    1. 将20维向量附加到 GlobalAveragePooling2D 步骤。
    2. 为20维向量创建一个额外的全连接网络,并在 全局平均池2D 步骤。理想情况下,两个网络同时训练,但我不知道这是否可能。

    我可以为这两个选项调整我的模型吗?

    0 回复  |  直到 4 年前
        1
  •  1
  •   KiLJ4EdeN    4 年前

    这应该可以做到, 在全局平均池化之后,注释掉密集层以将它们连接起来。

    from tensorflow.keras.applications.resnet50 import ResNet50
    from tensorflow.keras.layers import GlobalAveragePooling2D, Dropout, Dense
    from tensorflow.keras.optimizers import Adam
    from tensorflow.keras.models import Model
    import tensorflow as tf
    
    
    base_model = ResNet50(weights=None, include_top=False, input_shape=(39, 39, 3))
    x1 = base_model.output
    x1 = GlobalAveragePooling2D()(x1)
    x1 = Dropout(0.5)(x1)
    
    input_2 = tf.keras.layers.Input(shape=(20, 1))
    x2 = tf.keras.layers.Flatten()(input_2)
    # comment this if needed.
    x2 = tf.keras.layers.Dense(16, activation='relu')(x2)
    
    x = tf.keras.layers.Concatenate()([x1, x2])
    
    output_tensor = Dense(self.num_classes, activation='softmax')(x)
    cnn_model = Model(inputs=[base_model.input, input_2], outputs=output_tensor)
    opt = Adam(lr=0.001)
    cnn_model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=['accuracy', tf.keras.metrics.AUC()])
    print(cnn_model.summary())
    
        2
  •  1
  •   user58338    4 年前

    是的,这两种选择都有意义,并且在Keras中都是可能的。对于#2,您可以定义另一个模型,该模型将20D向量作为输入,并将其传递到一个完全连接的层,然后将该输出与池化层的输出连接起来。对于这两个选项,您都必须调整最终的模型输入,以包括base_model输入和20D向量。

    推荐文章