隐藏层的前两个神经元应该连接到输出层的第一个神经元
看来您正在寻找这种模式:
tensor([[1., 0., 0.],
[1., 0., 0.],
[0., 1., 0.],
[0., 1., 0.],
[0., 0., 1.],
[0., 0., 1.]])
可以使用torch.block_diag获得:
mask = torch.block_diag(*[torch.ones(2,1),]*output_size)
有了这个,您可以将您的网络定义为:
net = nn.Sequential(nn.Linear(input_size, hidden_size),
MaskedLinear(hidden_size, output_size, mask))
如果你愿意,你甚至可以在自定义层中实现它:
class LocalLinear(nn.Linear):
def __init__(self, *args, kernel_size=2, **kwargs):
super().__init__(*args, **kwargs)
assert self.in_features == kernel_size*self.out_features
self.mask = torch.block_diag(*[torch.ones(kernel_size,1),]*self.out_features)
def forward(self, input):
return F.linear(input, self.weight, self.bias)*self.mask
并像这样定义它:
net = nn.Sequential(nn.Linear(input_size, hidden_size),
LocalLinear(hidden_size, output_size))