【问题标题】:PyTorch: Sigmoid of weights?PyTorch:权重的 Sigmoid?
【发布时间】:2019-05-30 05:19:06
【问题描述】:

我是神经网络/PyTorch 的新手。我正在尝试制作一个接收向量x 的网络,第一层是h_j = w_j^T * x + b_j,输出是max_j{h_j}。唯一的事情是我希望 w_j 被限制在 0 和 1 之间,通过使用 w_j = S(k*a_j),其中 S 是 sigmoid 函数,k 是一些常数,a_j 是实际的权重变量(@ 987654329@ 只是a_j 的一个函数)。我如何在 PyTorch 中做到这一点?我不能只使用torch.nn.Linear 层,必须在权重的 sigmoid 函数中添加其他/附加内容?

附带问题,对于最后一个输出层,我可以使用torch.max 来获得前一层输出的最大值吗?这是否表现良好,或者是否有一些torch.nn.Max 或一些我不明白需要发生的汇集的东西?

谢谢!

【问题讨论】:

  • 我很困惑 - 层输出可以通过 sigmoid 或任何在 0 和 1 之间变化的单调函数。这称为激活函数,您可以使用各种函数集可以调用(虽然我不熟悉 pytorch,但我几乎肯定这将是内置的 - 请参阅 here) - 最后一层输出可以通过 softmax 函数传递,该函数本质上是总和的加权指数。
  • Softmax 是我一直在寻找的(对于附带问题)!对于第一部分,问题是我不想将层输出通过 sigmoid,只有权重变量,然后将在线性层中使用。
  • 为什么你想要介于 0 和 1 之间的权重?据我所知,这通常不是它的工作原理
  • @DavidMontgomery 我正要评论类似的东西。除非我们根据 reg 回归等研究某种正则化过程。
  • @Chinny84 它也会改变反向传播,所以你也必须考虑这一点

标签: python pytorch


【解决方案1】:

我真的不知道你为什么要这样做,但你可以声明一个自定义层,如下所示,将 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 

完成此操作后,您可以像在代码中使用线性层一样使用它。

【讨论】:

  • 谢谢!我正在使用 sigmoid 来确保权重在 0 和 1 之间 - 它们代表了在人与人之间分配的物品之类的东西,并且每个物品的分配次数不能超过一次或少于 0 次。
  • @AWhite 如果这个答案适合您的需要.. 接受它;)
猜你喜欢
  • 2020-05-08
  • 2019-04-27
  • 2021-01-08
  • 1970-01-01
  • 2020-03-15
  • 2019-05-01
  • 2021-12-05
  • 2021-01-23
  • 1970-01-01
相关资源
最近更新 更多