假设我们在分类层之前具有kN个神经元的特征表示。现在,分类层将生成仅具有本地连接的大小为N的输出层。
也就是说,使用输入神经元在k N到k N + N的位置计算输出的第k个神经元。因此,输入层中的每N个位置(步幅为N)都会在输出端给出单个神经元值。
这是在Keras中使用conv1dlocal完成的,但是,PyTorch似乎没有此功能。
标准线性层的权重矩阵:kNxN = kN ^ 2个变量
具有局部线性层的权重矩阵:(kx1)@N次= NK个变量
答案 0 :(得分:2)
当前在PyTorch问题跟踪器上对此进行了分类,与此同时,您可以使用fold
和unfold
得到类似的行为。看到这个答案:
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