本地完全连接层-Pytorch

时间:2019-12-23 12:27:26

标签: pytorch

假设我们在分类层之前具有kN个神经元的特征表示。现在,分类层将生成仅具有本地连接的大小为N的输出层。

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

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

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

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

1 个答案:

答案 0 :(得分:2)

当前在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