【问题标题】:Why does Tensorflow have different dimensions for its Conv2D weights then Pytorch does?为什么 Tensorflow 的 Conv2D 权重的维度与 Pytorch 不同?
【发布时间】:2020-04-13 20:26:34
【问题描述】:

当我注意到 tensorflow 和 pytorch 对于 2d cnns 具有不同大小的权重张量时,我正在将用 tensorflow v1.13 编写的旧项目转换为 pytorch v1.4.0。

这是我的张量流代码

cnn = tf.layers.conv2d(img_tensor, 16, (3, 3), (1, 1), padding='SAME', name='cnn_1')
cnn = tf.layers.conv2d(cnn, 32, (3, 3), (1, 1), padding='SAME', name='cnn_2')

init = tf.global_varaibles_initializer()
with tf.Session() as sess:
   sess.run(init)
   vars = {v.name:v for v in tf.trainable_variables()}
   print(sess.run(vars['cnn_2/kernel:0']).shape)

结果

(3, 3, 1, 32)

这是我的 pytorch 代码

class Net(Module):
   def __init__(self):
      super(Net, self).__init__()
      self.create_cnn()

   def create_cnn(self):
      self.cnn_layers = Sequential(
         Conv2d(1,16,3,padding=1)
         Conv2d(16,32,3,padding=1)
      )

   def forward(self, x):
      return self.cnn_layers(x)

def weights_init(m):
   if type(m) == Conv2d:
      if(m.bias.shape[0] == 32):
         print(m.weight.data.shape)

model = Net()
model.apply(weights_init)

结果

torch.Size([32,16,3,3])

出现这种情况的原因是因为我的 pytorch 模型不起作用,所以我开始一次一层地比较 tensorflow 和 pytorch 之间的输出。为了使它起作用,我必须将两个模型的权重设置为相同的值。好吧,我得到了第二个 cnn 层,当它因为尺寸错误而无法设置权重时感到很困惑。稍微摸索了一下,我发现了这种差异。

我看起来 tensorflow 在所有通道中都使用相同的内核,而 pytorch 的每个通道都有一个唯一的内核。如果是这种情况,我如何在 pytorch 中复制它?

【问题讨论】:

    标签: python tensorflow deep-learning pytorch conv-neural-network


    【解决方案1】:

    重新阅读 pytorch 文档后,我注意到 groups 属性与此完全相关。这将教会我不要浏览文档的某些部分。通过设置 groups=in_channels,我现在可以根据需要获得大小 (32, 1, 3, 3)。

    编辑: 所以更尴尬的是,在我的测试代码中,我将输入输入到两个 cnn 层,而不是菊花链。当我实际运行上面编写的代码时,tensorflow 中的第二个 cnn 实际上确实具有大小为 (3, 3, 16, 32) 的权重。

    但至少我学会了分组。

    【讨论】:

      猜你喜欢
      • 2022-11-22
      • 2021-01-08
      • 1970-01-01
      • 1970-01-01
      • 2019-03-29
      • 1970-01-01
      • 1970-01-01
      • 2021-05-23
      • 1970-01-01
      相关资源
      最近更新 更多