具有padding ='SAME'的Tensorflow/Keras Conv2D层的行为异常 [英] Tensorflow/Keras Conv2D layers with padding='SAME' behave strangely

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

问题描述

我的问题:

我进行的一项简单实验表明,在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.

  1. 那怎么可能?
  2. 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屋!

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