我的问题:
我进行的一个简单的实验表明,使用 padding='SAME'
在 Keras/TF 中的 conv2d 层与使用 padding='VALID'
不同带有前面的零填充层。
实验说明 - 如果您有兴趣进一步阅读:
我用了
onnx2keras
将我的 Pytorch 模型转换为 keras/TF 的包。当
onnx2keras
遇到一个带有 padding > 0
的卷积层在 ONNX 模型中,它将其转换为 Keras 的 Conv2D
与 valid
填充(即没有填充!),前面是 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))。
-------------------------------------------------- -------------------------------------------------- --------------
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
_________________________________________________________________
关于填充为 ='SAME' 的 Tensorflow/Keras Conv2D 层表现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60323897/