如何在 pytorch conv2d 中制作过滤器

Posted

技术标签:

【中文标题】如何在 pytorch conv2d 中制作过滤器【英文标题】:How can I make a filter in pytorch conv2d 【发布时间】:2021-12-31 09:39:37 【问题描述】:

我是 pytorch 的新手,我自己一直在做代码卷积。

为了对输入数据应用卷积,我使用了 conv2d。

在文档中,

torch.nn.Conv2d(in_channels, out_channels, kernel_size ...)

但是过滤器在哪里?为了进行卷积,我们应该使用内核对输入数据进行处理。但是只有内核大小,而不是内核的元素。

例如,有一个输入数据 5x5 和 2x2 内核,所有 4 个内核元素都是 1,那么我可以制作 4x4 输出。那么内核的元素可以放在哪里呢?

【问题讨论】:

【参考方案1】:

可以使用Conv2d 对象的weight 参数访问过滤器权重。例如,

>>> c = torch.nn.Conv2d(in_channels=2, out_channels=2, kernel_size=3)
>>> c.weight
Parameter containing:
tensor([[[[ 0.2156,  0.0930, -0.2319],
      [ 0.1333, -0.0846,  0.1848],
      [ 0.0765, -0.1799, -0.1273]],

     [[ 0.1173,  0.1650, -0.0876],
      [-0.1353,  0.0616, -0.1136],
      [-0.2326, -0.1509,  0.0651]]],


    [[[-0.2026,  0.2210,  0.0409],
      [-0.0818,  0.0793,  0.1074],
      [-0.1430, -0.0118, -0.2100]],

     [[-0.2025, -0.0508, -0.1731],
      [ 0.0217, -0.1616,  0.0702],
      [ 0.1903, -0.1864,  0.1523]]]], requires_grad=True)

权重默认由sampling from a uniform distribution 初始化。您还可以使用各种weight initialization schemes 初始化权重。

如果要手动更改权重,可以直接修改weight参数来实现。例如,要将所有权重设置为 1,请使用,

>>> c.weight.data = torch.ones_like(c.weight)
>>> c.weight
Parameter containing:
tensor([[[[1., 1., 1.],
      [1., 1., 1.],
      [1., 1., 1.]],

     [[1., 1., 1.],
      [1., 1., 1.],
      [1., 1., 1.]]],


    [[[1., 1., 1.],
      [1., 1., 1.],
      [1., 1., 1.]],

     [[1., 1., 1.],
      [1., 1., 1.],
      [1., 1., 1.]]]], requires_grad=True)

请注意,在训练期间,卷积层通常是计算图的一部分,它们的权重会在进行backward() 调用时自动更新。

【讨论】:

我有一个问题。为什么 c.weight 中有 4 个过滤器?只有一个还不够? @JAEMTO 因为在我使用的示例中,我设置了in_channels=2out_channels=2。默认情况下,每个输入通道都卷积到每个输出通道。要控制此行为,您可以将 groups 参数修改为 Conv2d。 (部分参考:***.com/q/46536971/5987698、pytorch.org/docs/stable/generated/torch.nn.Conv2d.html)。 我知道了,在 conv2d 中,如果默认情况下通过从均匀分布中采样来初始化权重,那么与 xavier 均匀分布有什么区别?【参考方案2】:

您可以使用functional conv2d 函数,它接受一个额外的过滤器张量(作为参数weights)。 nn.Conv2d 层依赖此操作,但自动处理过滤器/权重的学习,这通常更方便

【讨论】:

以上是关于如何在 pytorch conv2d 中制作过滤器的主要内容,如果未能解决你的问题,请参考以下文章

我们如何在 PyTorch 中将线性层的输出提供给 Conv2D?

比较 Conv2D 与 Tensorflow 和 PyTorch 之间的填充

如何在 Tensorflow 2 中获取 Conv2D 内核值

Pytorch的conv2d实现图像边缘检测和均值模糊

如何确定 Keras Conv2D 函数中的“过滤器”参数

Pytorch一文搞懂nn.Conv2d的groups参数的作用