假设我们在分类层之前有一个包含 kN 个神经元的特征表示。现在,分类层生成大小为 N 且仅具有局部连接的输出层。
也就是说,输出处的第 k 个神经元是使用从 k N 到 k N+N 位置处的输入神经元计算的。因此,输入层中的每 N 个位置(步长为 N)在输出处给出单个神经元值。
这是在 Keras 中使用 conv1dlocal 完成的,但是,PyTorch 似乎没有这个。
标准线性层中的权重矩阵:kNxN = kN^2 个变量
带局部线性层的权重矩阵:(kx1)@N次=NK个变量
目前,这已在 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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2339 次 |
| 最近记录: |