具有padding =’SAME’的Tensorflow / Keras Conv2D层的行为异常

Tensorflow/Keras Conv2D layers with padding='SAME' behave strangely

我的问题:

我进行的一项简单实验表明,在Keras / TF的conv2d层中使用padding='SAME'与在先前的零填充层中使用padding='VALID'有所不同。

  • 那怎么可能?
  • Keras / TF垫是否在张量周围对称地归零?
  • 实验说明-只要您有兴趣进一步阅读:

    我使用onnx2keras包将我的Pytorch模型转换为keras / TF。

    onnx2keras在ONNX模型中遇到带有padding > 0的卷积层时,它会将其转换为具有valid填充(即无填充!)的Keras'Conv2D,其后是Keras'ZeroPadding2D层。这非常有效,并且返回的输出与Pytorch网络产生的输出相同。

    我还以为它没有简单地使用padding='SAME'感到奇怪,因为大多数参考文献都说Keras / TF使用零填充,就像Pytorch一样。

    不过,我修补了onnx2keras并使其生成具有padding='SAME'Conv2D层,而不是使用先前的零填充层的'VALID'填充的现有解决方案。这使得生成的模型返回的输出与具有零填充层的模型返回的输出不同,并且当然与我的Pytorch模型不同,后者在补丁发布之前都是相同的。


    Keras中的padding='Same'表示当输入大小和内核大小不完全匹配时,可以根据需要添加填充以弥补重叠。

    padding ='Same'的示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # Importing dependency
    import keras
    from keras.models import Sequential
    from keras.layers import Conv2D

    # Create a sequential model
    model = Sequential()

    # Convolutional Layer
    model.add(Conv2D(filters=24, input_shape=(5,5,1), kernel_size=(2,2), strides =(2,2) ,padding='Same'))

    # Model Summary
    model.summary()

    代码输出-

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Model:"sequential_20"
    _________________________________________________________________
    Layer (type)                 Output Shape              Param #  
    =================================================================
    conv2d_28 (Conv2D)           (None, 3, 3, 24)          120      
    =================================================================
    Total params: 120
    Trainable params: 120
    Non-trainable params: 0
    _________________________________________________________________

    图形表示形式:
    下图显示了当padding ='Same'时输入的填充(input_shape =(5,5,1),kernel_size =(2,2),步幅=(2,2))。

    enter image description here

    -------------------------------------------------- -------------------------------------------------- --------------

    Keras中的padding='Valid'表示未添加填充。

    padding ='Valid'的示例:Conv2D使用了与我们上面用于padding ='Same'相同的输入。即(input_shape = {5,5,1),kernel_size = {2,2),步幅=(2,2))

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # Importing dependency
    import keras
    from keras.models import Sequential
    from keras.layers import Conv2D

    # Create a sequential model
    model = Sequential()

    # Convolutional Layer
    model.add(Conv2D(filters=24, input_shape=(5,5,1), kernel_size=(2,2), strides =(2,2) ,padding='Valid'))

    # Model Summary
    model.summary()

    代码输出-

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Model:"sequential_21"
    _________________________________________________________________
    Layer (type)                 Output Shape              Param #  
    =================================================================
    conv2d_29 (Conv2D)           (None, 2, 2, 24)          120      
    =================================================================
    Total params: 120
    Trainable params: 120
    Non-trainable params: 0
    _________________________________________________________________

    图形表示形式:
    下图显示了当padding ='Valid'时没有为输入添加填充(input_shape =(5,5,1),kernel_size =(2,2),步幅=(2,2))。
    enter image description here

    -------------------------------------------------- -------------------------------------------------- --------------

    现在让我们尝试使用与padding='Valid'相同的代码作为输入(input_shape =(6,6,1),kernel_size =(2,2),步幅=(2,2))。在此,padding='Valid'的行为应与padding='Same'相同。

    代码-

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # Importing dependency
    import keras
    from keras.models import Sequential
    from keras.layers import Conv2D

    # Create a sequential model
    model = Sequential()

    # Convolutional Layer
    model.add(Conv2D(filters=24, input_shape=(6,6,1), kernel_size=(2,2), strides =(2,2) ,padding='Valid'))

    # Model Summary
    model.summary()

    代码输出-

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Model:"sequential_22"
    _________________________________________________________________
    Layer (type)                 Output Shape              Param #  
    =================================================================
    conv2d_30 (Conv2D)           (None, 3, 3, 24)          120      
    =================================================================
    Total params: 120
    Trainable params: 120
    Non-trainable params: 0
    _________________________________________________________________