我的问题:
我进行的一项简单实验表明,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),步幅=(2,2))。
padding='Valid'
在Keras中,意味着不添加任何填充。
padding ='Valid'的示例: Conv2D使用了与我们上面用于padding ='Same'相同的输入。即(input_shape =(5,5,1),kernel_size =(2,2),步幅=(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))。
现在让我们尝试用于padding='Valid'
输入的相同代码(input_shape =(6,6,1),kernel_size =(2,2),步幅=(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
_________________________________________________________________
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句