首页 > 解决方案 > TensorFlow 和 PyTorch 中的 Conv2D 填充

问题描述

我正在尝试将TensorFlow模型转换为PyTorch但遇到问题padding。我的相关平台代码如下:

TensorFlow

conv1 = tf.layers.conv2d(
                inputs=input_layer,
                filters=32,
                kernel_size=[5, 5],
                padding="same",
                activation=tf.nn.relu,
                name = "conv1")

PyTorch

conv1 = nn.Conv2d(1, 32, kernel_size=5, stride=1, padding=2)

我有几个问题:

  1. 上面的代码是等价的吗?
  2. 如果我们在中使用填充,padding在左/右/上/下添加了多少个 s ?sametensorflow
  3. 如果我们使用in ,padding在 left/right/top/bottom 上添加了多少个 s ?padding=2pytorch
  4. 如果上述两个代码片段不等价,那么我们如何制作相同的conv层?

提前致谢。

标签: tensorflowpytorchconv-neural-network

解决方案


要回答您的问题:

Pytorch 没有 padding = 'same' 的原因很简单,因为它的动态计算图与 Tensorflow 静态图相比。

  1. 由于使用了不同的填充,这两个代码并不等效。

  2. 'Same' 填充尝试在左右均匀填充,但如果要添加的列数是奇数,则会在右侧添加一个额外的列。

  3. Pytorch 中的 'Padding = 2' 在两侧应用 2 个隐式填充。

  4. Pytorch 1.9 为 un-stride 或 stride = 1 卷积添加了 padding = 'same'。这将适用于您的用例。

但是对于 stride > 2 填充需要手动添加。

这是执行“相同”填充的良好实现:-

https://github.com/rwightman/pytorch-image-models/blob/master/timm/models/layers/padding.py#L28


推荐阅读