3

我的问题:

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

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

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

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

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

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

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

4

1 回答 1

6

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

填充='相同'的示例:

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

在此处输入图像描述

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

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)) 添加填充。 在此处输入图像描述

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

现在让我们尝试我们用于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
_________________________________________________________________
于 2020-04-02T13:08:12.227 回答