【发布时间】:2020-05-15 10:18:17
【问题描述】:
我是 Python 3.7.7 和 Tensorflow 2.1.0 的新手,我正在努力理解 Conv2DTranspose。我试过这段代码:
def vgg16_decoder(input_size = (7, 7, 512)):
inputs = Input(input_size, name = 'input')
conv1 = Conv2DTranspose(512, (2, 2), dilation_rate = 2, name = 'conv1')(inputs)
model = Model(inputs = inputs, outputs = conv1, name = 'vgg-16_decoder')
opt = Adam(lr=0.001)
model.compile(optimizer=opt, loss=keras.losses.categorical_crossentropy, metrics=['accuracy'])
return model
这是它的摘要:
Model: "vgg-16_decoder" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= input (InputLayer) (None, 7, 7, 512) 0 _________________________________________________________________ conv1 (Conv2DTranspose) (None, 9, 9, 512) 1049088 ================================================================= Total params: 1,049,088 Trainable params: 1,049,088 Non-trainable params: 0 _________________________________________________________________
但我想从conv1 输出(None, 14, 14, 512)。
我已将过滤器大小更改为(3, 3),并得到以下摘要:
Model: "vgg-16_decoder" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= input (InputLayer) (None, 7, 7, 512) 0 _________________________________________________________________ conv1 (Conv2DTranspose) (None, 11, 11, 512) 2359808 ================================================================= Total params: 2,359,808 Trainable params: 2,359,808 Non-trainable params: 0 _________________________________________________________________
我正在尝试使用Conv2DTranspose:
# A piece of code from U-NET implementation
up6 = Conv2D(512, 2, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal', name = 'up6')(UpSampling2D(size = (2,2), name = 'upsp1')(drop5))
及其摘要:
drop5 (Dropout) (None, 16, 16, 1024) 0 conv5_2[0][0] __________________________________________________________________________________________________ upsp1 (UpSampling2D) (None, 32, 32, 1024) 0 drop5[0][0] __________________________________________________________________________________________________ up6 (Conv2D) (None, 32, 32, 512) 2097664 upsp1[0][0] __________________________________________________________________________________________________
它将输入上采样 2 并更改其过滤器的数量。
如何使用 Conv2DTranspose 做到这一点?
更新:
我认为,或者我想,我做到了,但我不明白我做了什么:
conv1 = Conv2DTranspose(512, (2, 2), strides = 2, name = 'conv1')(inputs)
根据前面的说法,我得到了这样的总结:
Model: "vgg-16_decoder" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= input (InputLayer) (None, 7, 7, 512) 0 _________________________________________________________________ conv1 (Conv2DTranspose) (None, 14, 14, 512) 1049088 ================================================================= Total params: 1,049,088 Trainable params: 1,049,088 Non-trainable params: 0 _________________________________________________________________
如果您想纠正我或解释我在这里所做的事情,欢迎您。
更新 2:
顺便说一句,我正在尝试创建一个 VGG-16 解码器。这是我的 VGG-16 编码器的代码:
def vgg16_encoder(input_size = (224,224,3)):
inputs = Input(input_size, name = 'input')
conv1 = Conv2D(64, (3, 3), activation = 'relu', padding = 'same', name ='conv1_1')(inputs)
conv1 = Conv2D(64, (3, 3), activation = 'relu', padding = 'same', name ='conv1_2')(conv1)
pool1 = MaxPooling2D(pool_size = (2,2), strides = (2,2), name = 'pool_1')(conv1)
conv2 = Conv2D(128, (3, 3), activation = 'relu', padding = 'same', name ='conv2_1')(pool1)
conv2 = Conv2D(128, (3, 3), activation = 'relu', padding = 'same', name ='conv2_2')(conv2)
pool2 = MaxPooling2D(pool_size = (2,2), strides = (2,2), name = 'pool_2')(conv2)
conv3 = Conv2D(256, (3, 3), activation = 'relu', padding = 'same', name ='conv3_1')(pool2)
conv3 = Conv2D(256, (3, 3), activation = 'relu', padding = 'same', name ='conv3_2')(conv3)
conv3 = Conv2D(256, (3, 3), activation = 'relu', padding = 'same', name ='conv3_3')(conv3)
pool3 = MaxPooling2D(pool_size = (2,2), strides = (2,2), name = 'pool_3')(conv3)
conv4 = Conv2D(512, (3, 3), activation = 'relu', padding = 'same', name ='conv4_1')(pool3)
conv4 = Conv2D(512, (3, 3), activation = 'relu', padding = 'same', name ='conv4_2')(conv4)
conv4 = Conv2D(512, (3, 3), activation = 'relu', padding = 'same', name ='conv4_3')(conv4)
pool4 = MaxPooling2D(pool_size = (2,2), strides = (2,2), name = 'pool_4')(conv4)
conv5 = Conv2D(512, (3, 3), activation = 'relu', padding = 'same', name ='conv5_1')(pool4)
conv5 = Conv2D(512, (3, 3), activation = 'relu', padding = 'same', name ='conv5_2')(conv5)
conv5 = Conv2D(512, (3, 3), activation = 'relu', padding = 'same', name ='conv5_3')(conv5)
pool5 = MaxPooling2D(pool_size = (2,2), strides = (2,2), name = 'pool_5')(conv5)
opt = Adam(lr=0.001)
model = Model(inputs = inputs, outputs = pool5, name = 'vgg-16_encoder')
model.compile(optimizer=opt, loss=keras.losses.categorical_crossentropy, metrics=['accuracy'])
return model
【问题讨论】:
标签: python tensorflow conv-neural-network