【问题标题】:Local fully connected layer - Pytorch本地全连接层——Pytorch
【发布时间】:2020-04-14 17:54:36
【问题描述】:

假设我们在分类层之前有一个包含 kN 个神经元的特征表示。现在,分类层产生一个大小为 N 的输出层,只有本地连接。

也就是说,输出的第 k 个神经元是使用从 kN 到 kN+N 位置的输入神经元计算的。因此,输入层中的每 N 个位置(步长为 N)在输出处给出单个神经元值。

这是在 Keras 中使用 conv1dlocal 完成的,但是 PyTorch 似乎没有这个。

标准线性层中的权重矩阵:kNxN = kN^2 个变量

带有局部线性层的权重矩阵:(kx1)@N 次 = NK 个变量

【问题讨论】:

    标签: pytorch


    【解决方案1】:

    这目前在 PyTorch 问题跟踪器上进行分类,同时您可以使用 foldunfold 获得类似的行为。看到这个答案:

    https://github.com/pytorch/pytorch/issues/499#issuecomment-503962218

    class LocalLinear(nn.Module):
        def __init__(self,in_features,local_features,kernel_size,padding=0,stride=1,bias=True):
            super(LocalLinear, self).__init__()
            self.kernel_size = kernel_size
            self.stride = stride
            self.padding = padding
    
            fold_num = (in_features+2*padding-self.kernel_size)//self.stride+1
            self.weight = nn.Parameter(torch.randn(fold_num,kernel_size,local_features))
            self.bias = nn.Parameter(torch.randn(fold_num,local_features)) if bias else None
    
        def forward(self, x:torch.Tensor):
            x = F.pad(x,[self.padding]*2,value=0)
            x = x.unfold(-1,size=self.kernel_size,step=self.stride)
            x = torch.matmul(x.unsqueeze(2),self.weight).squeeze(2)+self.bias
            return x
    

    【讨论】:

      猜你喜欢
      • 2019-03-30
      • 2023-01-25
      • 2019-08-05
      • 2017-12-14
      • 2022-01-13
      • 2019-05-04
      • 2019-11-23
      • 2021-09-01
      • 2019-10-28
      相关资源
      最近更新 更多