带有 padding='SAME' 的 Tensorflow/Keras Conv2D 层的行为很奇怪 [英] Tensorflow/Keras Conv2D layers with padding='SAME' behave strangely

查看:40
本文介绍了带有 padding='SAME' 的 Tensorflow/Keras Conv2D 层的行为很奇怪的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的问题:

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

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

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

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

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

我还觉得奇怪的是,它没有简单地使用 padding='SAME',因为大多数参考资料都说 Keras/TF 使用零填充,就像 Pytorch 一样.>

尽管如此,我修补了 onnx2keras 并使其生成带有 padding='SAME'Conv2D 层而不是 'VALID' 用前面的零填充层填充.这使得生成的模型返回与零填充层不同的输出,当然与我的 Pytorch 模型不同,后者在补丁之前是相同的.

解决方案

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

padding='Same' 示例:

# 导入依赖进口keras从 keras.models 导入顺序从 keras.layers 导入 Conv2D# 创建一个序列模型模型 = 顺序()# 卷积层model.add(Conv2D(filters=24, input_shape=(5,5,1), kernel_size=(2,2), strides =(2,2),padding='Same'))# 模型总结模型摘要()

代码的输出 -

型号:sequential_20"_________________________________________________________________层(类型)输出形状参数#==================================================================conv2d_28 (Conv2D)(无、3、3、24)120==================================================================总参数:120可训练参数:120不可训练的参数:0_________________________________________________________________

图示:下图显示了 padding='Same' 时输入的填充 (input_shape=(5,5,1), kernel_size=(2,2), strides =(2,2)).

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

padding='Valid' 在 Keras 中表示不添加填充.

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

# 导入依赖进口keras从 keras.models 导入顺序从 keras.layers 导入 Conv2D# 创建一个序列模型模型 = 顺序()# 卷积层model.add(Conv2D(filters=24, input_shape=(5,5,1), kernel_size=(2,2), strides =(2,2),padding='Valid'))# 模型总结模型摘要()

代码的输出 -

型号:sequential_21"_________________________________________________________________层(类型)输出形状参数#==================================================================conv2d_29 (Conv2D) (None, 2, 2, 24) 120==================================================================总参数:120可训练参数:120不可训练的参数:0_________________________________________________________________

图示:下图显示当 padding='Valid' 时没有为输入添加填充 (input_shape=(5,5,1), kernel_size=(2,2), strides =(2,2)).

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

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

代码 -

# 导入依赖进口keras从 keras.models 导入顺序从 keras.layers 导入 Conv2D# 创建一个序列模型模型 = 顺序()# 卷积层model.add(Conv2D(filters=24, input_shape=(6,6,1), kernel_size=(2,2), strides =(2,2),padding='Valid'))# 模型总结模型摘要()

代码的输出 -

型号:sequential_22"_________________________________________________________________层(类型)输出形状参数#==================================================================conv2d_30 (Conv2D) (无、3、3、24) 120==================================================================总参数:120可训练参数:120不可训练的参数:0_________________________________________________________________

My question:

A straightforward experiment that I conducted showed that using padding='SAME' in a conv2d layer in Keras/TF is different from using padding='VALID' with a preceding zero-padding layer.

  1. How is that possible?
  2. Does Keras/TF pads zeros symmetrically around the tensor?

Explanation of the experiment - just if you're interested in reading further:

I used the onnx2keras package to convert my Pytorch model into keras/TF.

When onnx2keras encounters a convolutional layer with padding > 0 in the ONNX model, it translates it to Keras' Conv2D with valid padding (i.e., no padding!), preceded by Keras' ZeroPadding2D layer. This works very well and returns outputs that are identical to those produced by the Pytorch network.

I yet thought it was strange that it didn't simply used padding='SAME', as most of the references say that Keras/TF use zero padding, just like Pytorch does.

Nevertheless, I patched onnx2keras and made it produce me Conv2D layers with padding='SAME' rather than the existing solution of 'VALID' padding with a preceding zero-padding layer. This made the resulting model return different outputs than the one with the zero-padding layer, and of course different from my Pytorch model, which was identical until the patch.

解决方案

padding='Same' in Keras means padding is added as required to make up for overlaps when the input size and kernel size do not perfectly fit.

Example of 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()

Output of the code -

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
_________________________________________________________________

Pictorial Representation: Below image shows how the padding for the input (input_shape=(5,5,1), kernel_size=(2,2), strides =(2,2)) when padding='Same'.

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

padding='Valid' in Keras means no padding is added.

Example of padding='Valid': Have used same input for Conv2D that we used above for padding = 'Same' .i.e. (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()

Output of the code -

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
_________________________________________________________________

Pictorial Representation: Below image shows there is no padding added for the input (input_shape=(5,5,1), kernel_size=(2,2), strides =(2,2)) when padding='Valid'.

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

Now lets try same code that we used for padding='Valid' for the input (input_shape=(6,6,1), kernel_size=(2,2), strides =(2,2)). Here padding='Valid' should behave same as padding='Same'.

Code -

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

Output of the code -

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
_________________________________________________________________

这篇关于带有 padding='SAME' 的 Tensorflow/Keras Conv2D 层的行为很奇怪的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆