具有padding ='SAME'的Tensorflow/Keras Conv2D层的行为异常 [英] Tensorflow/Keras Conv2D layers with padding='SAME' behave strangely
问题描述
我的问题:
我进行的一项简单实验表明,在Keras/TF的conv2d层中使用padding='SAME'
与在先前的零填充层中使用padding='VALID'
有所不同.
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.
- 那怎么可能?
- Keras/TF是否在张量周围对称地置零?
实验说明-只要您有兴趣进一步阅读:
我使用onnx2keras
软件包将Pytorch模型转换为keras/TF.
I used the onnx2keras
package to convert my Pytorch model into keras/TF.
当onnx2keras
在ONNX模型中遇到带有padding > 0
的卷积层时,它将使用valid
填充(即,没有填充!)将其转换为Keras的Conv2D
,其后是Keras的ZeroPadding2D
层.这样效果很好,并且返回的输出与Pytorch网络产生的输出相同.
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.
我还以为它并没有简单地使用padding='SAME'
感到奇怪,因为大多数参考文献都说Keras/TF使用零填充,就像Pytorch一样.
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.
尽管如此,我还是修补了onnx2keras
并使其生成具有padding='SAME'
的Conv2D
层,而不是现有的带有先前零填充层的'VALID'
填充的解决方案.这使得生成的模型返回的输出与具有零填充层的模型返回的输出不同,并且当然与我的Pytorch模型不同,后者在补丁发布之前都是相同的.
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'
表示当输入大小和内核大小不完全匹配时,可以根据需要添加填充以弥补重叠.
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.
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),步幅=(2,2)).
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'
表示未添加填充.
padding ='Valid'的示例::对于Conv2D,我们使用了与上面用于padding ='Same'相同的输入. (input_shape =(5,5,1),kernel_size =(2,2),步幅=(2,2))
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()
代码输出-
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)).
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'.
现在让我们尝试使用与padding='Valid'
相同的代码作为输入(input_shape =(6,6,1),kernel_size =(2,2),步幅=(2,2)). 此处padding='Valid'
的行为应与padding='Same'
相同.
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'
.
代码-
# 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
_________________________________________________________________
这篇关于具有padding ='SAME'的Tensorflow/Keras Conv2D层的行为异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!