【问题标题】:How can I dynamically change size of the kernel in conv2d (PyTorch)?如何在 conv2d (PyTorch) 中动态更改内核的大小?
【发布时间】:2021-11-13 12:32:07
【问题描述】:

如何在 PyTorch 中设置动态内核大小?

我正在将图像传递给我的网络,并且我想将我的内核设置为根据输入的偏心率来改变 sizestride。另外,我想使用圆形而不是平方内核。

这听起来可能吗?我试图谷歌但没有运气。非常感谢任何帮助!

编辑:为了更清楚一点:输入图像的大小都相同,一旦网络初始化,我不需要更改内核大小。我只需要一个行为或多或少类似于this(底部图像)的转换层。基本上,内核会根据离心率改变大小,以便在中心获得高分辨率,而在外围获得越来越低的分辨率(通过汇集更大和重叠的区域)。

【问题讨论】:

  • 如何准确定义圆内核

标签: python pytorch computer-vision conv-neural-network


【解决方案1】:

是的,您可以在转发功能中轻松完成..

例如,在这段代码中,我调用了一个布尔函数,如果结果为 True,我使用 conv1,否则我使用 conv2。

    def forward(self, x):
        """
        In the forward function we accept a Tensor of input data and we must return
        a Tensor of output data. We can use Modules defined in the constructor as
        well as arbitrary operators on Tensors.
        """
        if boolean_func(x):
            x = self.conv1(x)
        else:
            x = self.conv2(x)
        out = self.dense1(x)
        return out

在你的情况下,你可以定义两个卷积层,并根据输入的条件使用你想要的那个。

在反向传播过程中,由于存储在图中的计算信息,您使用的层的权重将在没有任何干预的情况下更新。

【讨论】:

  • 这假设我事先知道有多少尺寸。理想情况下,我想避免这种情况,并使用比例因子或最大/最小来定义一个尺寸范围作为偏心率的函数。此外,在您的示例中,这两层将具有不同的权重。
  • 改变内核大小会改变层训练参数的数量,我认为不可能在同一层动态改变它...
  • 对不起,我可能不太清楚。一旦建立网络,训练参数的数量(以及内核的大小)将不会改变。一旦网络初始化,我不打算改变内核的大小/步幅。
猜你喜欢
  • 1970-01-01
  • 2023-03-22
  • 2021-10-23
  • 1970-01-01
  • 2021-01-02
  • 2017-12-05
  • 1970-01-01
  • 1970-01-01
  • 2020-06-20
相关资源
最近更新 更多