向 tensorflow.python.keras.models.Model 添加一个新层

我正在使用 Python 3.7.7。和张量流 2.3.0。

我想从 U-Net 网络中提取编码器并添加它GlobalAveragePooling2D

我使用函数式 API 来定义 U-Net:

inputs = Input(shape=img_shape)


conv1 = Conv2D(64, (5, 5), activation='relu', padding='same', data_format="channels_last", name='conv1_1')(inputs)

conv1 = Conv2D(64, (5, 5), activation='relu', padding='same', data_format="channels_last", name='conv1_2')(conv1)

pool1 = MaxPooling2D(pool_size=(2, 2), data_format="channels_last", name='pool1')(conv1)

conv2 = Conv2D(96, (3, 3), activation='relu', padding='same', data_format="channels_last", name='conv2_1')(pool1)

conv2 = Conv2D(96, (3, 3), activation='relu', padding='same', data_format="channels_last", name='conv2_2')(conv2)

pool2 = MaxPooling2D(pool_size=(2, 2), data_format="channels_last", name='pool2')(conv2)


conv3 = Conv2D(128, (3, 3), activation='relu', padding='same', data_format="channels_last", name='conv3_1')(pool2)

conv3 = Conv2D(128, (3, 3), activation='relu', padding='same', data_format="channels_last", name='conv3_2')(conv3)

pool3 = MaxPooling2D(pool_size=(2, 2), data_format="channels_last", name='pool3')(conv3)


conv4 = Conv2D(256, (3, 3), activation='relu', padding='same', data_format="channels_last", name='conv4_1')(pool3)

conv4 = Conv2D(256, (4, 4), activation='relu', padding='same', data_format="channels_last", name='conv4_2')(conv4)

pool4 = MaxPooling2D(pool_size=(2, 2), data_format="channels_last", name='pool4')(conv4)


conv5 = Conv2D(512, (3, 3), activation='relu', padding='same', data_format="channels_last", name='conv5_1')(pool4)

conv5 = Conv2D(512, (3, 3), activation='relu', padding='same', data_format="channels_last", name='conv5_2')(conv5)


我这样做是因为 U-Net 已经经过预训练,所以我需要从预训练模型中获取编码器。

但我收到以下错误:

AttributeError: 'Model' object has no attribute 'shape'

在行:

encoder_output = GlobalAveragePooling2D()(encoder_input)

我也尝试过,但没有成功:

encoder_output = GlobalAveragePooling2D()(encoder_input.get_layer('conv5_2'))

和:

encoder_output = GlobalAveragePooling2D()(encoder_input.layers[-1].output)

如何将GlobalAveragePooling2D图层添加到old_model


饮歌长啸
浏览 138回答 1
1回答

慕桂英546537

我找到了一种方法。from tensorflow.python.keras.models import Modelfrom tensorflow.python.keras.layers import GlobalAveragePooling2Dencoder_input = Model(inputs=old_model.layers[0].input, outputs=old_model.layers[14].output)encoder_output = GlobalAveragePooling2D()(encoder_input.layers[-1].output)encoder = Model(encoder_input.input, encoder_output, name='encoder')summary新模型 ( ) 的是encoder:Model: "encoder"_________________________________________________________________Layer (type)                 Output Shape              Param #   =================================================================input_1 (InputLayer)         [(None, 200, 200, 1)]     0         _________________________________________________________________conv1_1 (Conv2D)             (None, 200, 200, 64)      1664      _________________________________________________________________conv1_2 (Conv2D)             (None, 200, 200, 64)      102464    _________________________________________________________________pool1 (MaxPooling2D)         (None, 100, 100, 64)      0         _________________________________________________________________conv2_1 (Conv2D)             (None, 100, 100, 96)      55392     _________________________________________________________________conv2_2 (Conv2D)             (None, 100, 100, 96)      83040     _________________________________________________________________pool2 (MaxPooling2D)         (None, 50, 50, 96)        0         _________________________________________________________________conv3_1 (Conv2D)             (None, 50, 50, 128)       110720    _________________________________________________________________conv3_2 (Conv2D)             (None, 50, 50, 128)       147584    _________________________________________________________________pool3 (MaxPooling2D)         (None, 25, 25, 128)       0         _________________________________________________________________conv4_1 (Conv2D)             (None, 25, 25, 256)       295168    _________________________________________________________________conv4_2 (Conv2D)             (None, 25, 25, 256)       1048832   _________________________________________________________________pool4 (MaxPooling2D)         (None, 12, 12, 256)       0         _________________________________________________________________conv5_1 (Conv2D)             (None, 12, 12, 512)       1180160   _________________________________________________________________conv5_2 (Conv2D)             (None, 12, 12, 512)       2359808   _________________________________________________________________global_average_pooling2d (Gl (None, 512)               0         =================================================================Total params: 5,384,832Trainable params: 5,384,832Non-trainable params: 0_________________________________________________________________None我希望以下输出形状是正确的:_________________________________________________________________global_average_pooling2d (Gl (None, 512)               0         =================================================================但是在Transfer learning & fine-tuning中有类似的输出形状。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python