填充为 ='SAME' 的 Tensorflow/Keras Conv2D 层表现异常

标签 tensorflow keras conv-neural-network zero-padding

我的问题:

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

  • 这怎么可能?
  • Keras/TF 是否在张量周围对称地填充零?

  • 实验说明 - 如果您有兴趣进一步阅读:

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

    onnx2keras遇到一个带有 padding > 0 的卷积层在 ONNX 模型中,它将其转换为 Keras 的 Conv2Dvalid填充(即没有填充!),前面是 Keras 的 ZeroPadding2D层。这非常有效,并返回与 Pytorch 网络产生的输出相同的输出。

    我还觉得奇怪的是它不是简单地使用 padding='SAME' ,正如大多数引用资料所说,Keras/TF 使用零填充,就像 Pytorch 一样。

    尽管如此,我还是修补了 onnx2keras并让它生产了我 Conv2D层与 padding='SAME'而不是 'VALID' 的现有解决方案用前面的零填充层填充。这使得生成的模型返回与零填充层不同的输出,当然与我的 Pytorch 模型不同,后者在补丁之前是相同的。

    最佳答案

    padding='Same'在 Keras 中意味着当输入大小和内核大小不完全适合时,根据需要添加填充以弥补重叠。

    padding='Same' 示例:

    # 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()
    

    代码的输出 -
    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), strides =(2,2))。

    enter image description here

    -------------------------------------------------- -------------------------------------------------- --------------
    padding='Valid'在 Keras 中意味着不添加填充。

    padding='Valid' 示例:对 Conv2D 使用了与我们上面用于 padding = 'Same' 相同的输入。即(input_shape=(5,5,1), kernel_size=(2,2), strides =(2,2))
    # 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()
    

    代码的输出 -
    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), strides =(2,2))。
    enter image description here

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

    现在让我们尝试使用与 padding='Valid' 相同的代码对于输入 (input_shape=(6,6,1), kernel_size=(2,2), strides =(2,2))。 这里padding='Valid'行为应该与 padding='Same' 相同.

    代码 -
    # 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()
    

    代码的输出 -
    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
    _________________________________________________________________
    

    关于填充为 ='SAME' 的 Tensorflow/Keras Conv2D 层表现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60323897/

    相关文章:

    python - ValueError : Variable d_w1/Adam/does not exist, 或不是用 tf.get_variable() 创建的

    python - ModuleNotFoundError : No module named 'tf'

    python - 如何在 conda 环境中安装 keras 2.0.5 版本

    machine-learning - 卷积神经网络会受到梯度消失的影响吗?

    python - 在 TensorFlow 中使用 CNN 进行信号处理。类型错误 : DataType float32 for attr 'Tlabels' not in list of allowed values: int32, int64

    tensorflow - 在神经网络中使用卷积层

    tensorflow - Anaconda 安装的 Tensorflow 缺少 contrib 框架中的 'audio_ops'

    python - 将 tensorflow 梯度应用于特定输入

    python - 显示图像时尺寸无效

    python - 将 .png 文件转换为 .nii(NiFti 文件)