【问题标题】:Supplying weights to nn.functional.conv2d in PyTorch在 PyTorch 中为 nn.functional.conv2d 提供权重
【发布时间】:2023-04-07 18:26:01
【问题描述】:

我正在尝试学习接受 3 个通道并输出 3 个通道的 3x3 conv2d 层的权重。对于本次讨论,请在每种情况下考虑偏差 = 0。然而,conv 层的权重是间接学习的。我有一个 2 层的多层感知,第一层有 9 个节点,第二层有 9 个节点。然后,2d conv 层的权重正是使用此 MLP 学习的权重,即nn.Linear(9,9)。我知道在这种情况下我将不得不使用nn.functional.conv2d(input,weight)。但是具体如何从MLP中提取权重并用于卷积还不清楚,可以想到以下。

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        m=nn.Linear(9,9)
    def forward(self, x):
        # some operations involving MLP `m`
        return nn.Functional.conv2d(x,m.weight)

有人可以在 PyTorch 中提供一个简短的虚拟代码来实现这种允许反向传播的训练配置吗?

【问题讨论】:

    标签: pytorch


    【解决方案1】:

    使用kernel_size=3 从 3 个输入通道到 3 个输出通道的卷积具有 81 个权重(而不是 9 个)。如果您使用groups=3,则可以将此数字减少到 27。

    您可以执行以下操作:

    class Net(nn.Module):
      def __init__(self):
        super(Net, self).__init__()
        self.hyper = nn.Linear(9, 9)  # output the required number of parameters
    
      def forward(self, x):
        # do stuff with self.hyper(x)  
        y = nn.Functional.conv2d(x, self.hyper.weight.reshape((3, 3, 3, 3)))  # add padding and other parameters
        return y
    

    【讨论】:

    • 在这个解决方案中,MLP 的 o/p 是卷积层的权重,这不是我想要的。 MLP 的权重变成了 conv 的权重,类似于self.hyper.weights。因此,nn.Linear(9,9) 是正确的。
    • @MohitLamba 请查看我的更新。您在训练时可能会遇到一些困难(通过计算图中的节点两次...)它可能需要为 backward 使用一些非默认标志。
    猜你喜欢
    • 2020-06-14
    • 1970-01-01
    • 2020-01-28
    • 1970-01-01
    • 1970-01-01
    • 2019-07-06
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多