【问题标题】:padding in conv2Dconv2D 中的填充
【发布时间】:2019-08-05 01:14:48
【问题描述】:

我在 keras 中使用以下代码

from keras.layers import Input, Dense, Conv2D, MaxPooling2D, UpSampling2D
from keras.models import Model
from keras import backend as K

input_img = Input(shape=(28, 28, 1))  # adapt this if using `channels_first` image data format

x = Conv2D(16, (3, 3), activation='relu', padding='same')(input_img)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
encoded = MaxPooling2D((2, 2), padding='same')(x)

# at this point the representation is (4, 4, 8) i.e. 128-dimensional

x = Conv2D(8, (3, 3), activation='relu', padding='same')(encoded)
x = UpSampling2D((2, 2))(x)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
x = UpSampling2D((2, 2))(x)
x = Conv2D(16, (3, 3), activation='relu')(x)
x = UpSampling2D((2, 2))(x)
decoded = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(x)

但是,如果我使用倒数第二个 Conv2D 块:“x = Conv2D(16, (3, 3), activation='relu')(x)" with padding='same',代码会给我错误。我不明白填充相同是有问题的,如果我删除这个填充行,代码可以正常工作。请问有人吗? 谢谢

【问题讨论】:

    标签: python tensorflow keras


    【解决方案1】:

    发生这种情况是因为“相同”的行为与 strides !=1 不一致。您是否尝试过将步幅指定为 1? 问题详细讨论here

    【讨论】:

    • 如果我添加一个 strides=(1,1), with padding='same' 然后我得到错误:检查目标时出错:预期 conv2d_14 有 (32,32,1) 但得到数组形状 (28,28,1) 没有填充和 strides=(1,1) 正在工作,但又一次,没有填充和没有跨步的代码正在工作。那么上面代码中的其他 Conv2D 块是不是我认为没有定义跨步,只有过滤器和内核大小??
    【解决方案2】:
    input_img = Input(shape=(28, 28, 1))  
    
    x = Conv2D(32, (3, 3), activation='relu', padding='same')(input_img)
    x = MaxPooling2D((2, 2), padding='same')(x)
    x = Conv2D(32, (3, 3), activation='relu', padding='same')(x)
    encoded = MaxPooling2D((2, 2), padding='same')(x)
    
    
    # at this point the representation is (7, 7, 32) 
    
    x = Conv2D(32, (3, 3), activation='relu', padding='same')(encoded)
    x = UpSampling2D((2, 2))(x)
    x = Conv2D(32, (3, 3), activation='relu', padding='same')(x)
    x = UpSampling2D((2, 2))(x)
    decoded = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(x)
    

    现在,如果我使用上面的代码,我不需要从倒数第二个 conv2D 块及其工作中省略 padding='same'

    【讨论】:

      猜你喜欢
      • 2018-11-13
      • 1970-01-01
      • 2021-02-15
      • 2018-05-12
      • 2019-12-02
      • 2019-03-29
      • 2020-05-06
      • 2019-09-05
      • 2020-09-18
      相关资源
      最近更新 更多