keras NonNeg 权重约束相当于什么?

One*_*nly 7 torch keras pytorch

Keras 可以选择强制学习模型的权重为正:

tf.keras.constraints.NonNeg()
Run Code Online (Sandbox Code Playgroud)

但我在 pytorch 中找不到相当于这个的东西,有谁知道如何强制我的线性模型的权重全部为正数?

尝试在其他论坛上询问这个问题,但答案没有帮助。

假设我有一个非常简单的线性模型,如下所示,我应该如何更改它?

class Classifier(nn.Module):

    def __init__(self,input , n_classes):
        super(Classifier, self).__init__()

        self.classify = nn.Linear( input  , n_classes)

     def forward(self, h ):

        final = self.classify(h)
        return final
Run Code Online (Sandbox Code Playgroud)

我想做的正是 NonNeg() 所做的事情,但在 pytorch 中,不想改变它所做的事情。

这是NonNeg在keras中的实现:

class NonNeg(Constraint):
    """Constrains the weights to be non-negative.
    """

    def __call__(self, w):
        w *= K.cast(K.greater_equal(w, 0.), K.floatx())
        return w
Run Code Online (Sandbox Code Playgroud)

Ser*_*nes 6

建议的答案是错误的。这里不能简单地使用 torch.abs,因为绝对函数是非单调映射。负输入值和正输入值将给出相同的输出值。处理这个问题的正确方法如下:

import torch
import torch.nn as nn

class PosLinear(nn.Module):
    def __init__(self, in_dim, out_dim):
        super(PosLinear, self).__init__()
        self.weight = nn.Parameter(torch.randn((in_dim, out_dim)))
        self.bias = nn.Parameter(torch.zeros((out_dim,)))
        
    def forward(self, x):
        return torch.matmul(x, torch.exp(self.weight)) + self.bias
Run Code Online (Sandbox Code Playgroud)

这个想法是找到self.weight和用于线性回归的系数之间的单调映射。