【问题标题】:how to perform Deconvolution/TransConvolution in Keras?如何在 Keras 中执行反卷积/反卷积?
【发布时间】:2019-01-04 07:01:24
【问题描述】:

我的模型结构如下:

层(类型)输出形状参数#

conv2d_31 (Conv2D)           (None, 40, 40, 16)        160       
_________________________________________________________________
max_pooling2d_4 (MaxPooling2 (None, 20, 20, 16)        0         
_________________________________________________________________
conv2d_32 (Conv2D)           (None, 20, 20, 32)        12832     
_________________________________________________________________
max_pooling2d_5 (MaxPooling2 (None, 10, 10, 32)        0         
_________________________________________________________________
conv2d_33 (Conv2D)           (None, 10, 10, 64)        100416    
_________________________________________________________________
max_pooling2d_6 (MaxPooling2 (None, 5, 5, 64)          0         
_________________________________________________________________
flatten_2 (Flatten)          (None, 1600)              0         
_________________________________________________________________
dense_3 (Dense)              (None, 1024)              1639424   
_________________________________________________________________
dropout_2 (Dropout)          (None, 1024)              0         
_________________________________________________________________
dense_4 (Dense)              (None, 1)                 1025      
_________________________________________________________________
activation_52 (Activation)   (None, 1)                 0      

我想将反卷积应用于任何特定层并绘制结果。我想我应该使用 Conv2DTranspose 层,但我似乎无法理解其中涉及的论点。请帮忙

【问题讨论】:

    标签: python keras convolution deconvolution


    【解决方案1】:

    注意命名法。

    反卷积不是转置卷积,尽管这些术语可以互换使用。要使用的正确术语是转置卷积。这就是为什么 Keras 中甚至不存在“反卷积”层,而 Conv2DTransposed 存在的原因。

    您可以尝试通过 Model API 而不是 Sequential API 构建您的深度学习模型。

    这样,您可以将 Conv2DTransposed 添加到特定层,并查看转置卷积的结果。

    您可以将转置卷积层视为上采样层。前者具有可学习的参数,而后者仅通过插值将图像的大小加倍/三倍等。

    查看 Functional API(模型 API)的 Keras 文档:https://keras.io/models/model/

    查看转置卷积的 Keras 文档:https://keras.io/layers/convolutional/

    查看这个 github 帐户以直观地了解转置卷积:https://github.com/vdumoulin/conv_arithmetic

    【讨论】:

    • a = Input(shape=(40,40,1)) b = Conv2D(16, kernel_size=3, strides=1, padding = 'same', activation='relu',data_format= 'channels_last')(a) c = Conv2DTranspose(16, kernel_size=3, strides=1, padding='same', activation='relu', data_format='channels_last')(b) model2 = Model(inputs=a, output=c) 这会产生错误:预期 conv2d_transpose_4 有 4 个维度,但得到的数组形状为 (2064, 1)
    • 我测试了您的代码 sn-p 并且在我的情况下运行良好。使用 model.summary() 验证。确保正确输入数据。第一个观察是检查您输入的是灰度图像还是 RGB 图像,因为模型设置为仅接受灰度图像。总参数:2,480 可训练参数:2,480 不可训练参数:0
    最近更新 更多