我是神经网络/ PyTorch的新手。我正在尝试制作一个包含向量x
的网络,第一层是h_j = w_j^T * x + b_j
,输出是max_j{h_j}
。唯一的事情是,我希望通过w_j
将w_j = S(k*a_j)
限制在0和1之间,其中S是S型函数,k
是一些常数,而{{1} }是实际的重量变量(a_j
只是w_j
的函数)。如何在PyTorch中做到这一点?我不能只使用a_j
图层,权重的Sigmoid函数中还必须添加其他内容吗?
侧面问题,对于最后一个输出层,我是否可以仅使用torch.nn.Linear
来获取上一层输出的最大值?这是否表现良好,或者是否存在一些torch.max
或一些我不理解的需要合并的东西?
谢谢!
答案 0 :(得分:0)
我真的不确定为什么要这样做,但是您可以如下声明一个自定义图层,以将Sigmoid应用于权重。
class NewLayer(nn.Module):
def __init__ (self, input_size, output_size):
super().__init__()
self.W = nn.Parameter(torch.zeros(input_size, output_size))
# kaiming initialization (use any other if you like)
self.W = nn.init.kaiming_normal_(self.W)
self.b = nn.Parameter(torch.ones(output_size))
def forward(self, x):
# applying sigmoid to weights and getting results
ret = torch.addmm(self.b, x, torch.sigmoid(self.W))
return ret
执行此操作后,就可以像在代码中使用线性图层一样使用它。