keras非负重量约束的等价物是什么?

keras非负重量约束的等价物是什么?,keras,pytorch,torch,Keras,Pytorch,Torch,Keras可选择强制学习模型的权重为正: tf.keras.constraints.NonNeg() 但我在pytorch中找不到类似的方法,有人知道我如何强制线性模型的权重都为正值吗 尝试在其他论坛上问这个问题,但答案没有帮助 假设我有一个非常简单的线性模型,如下所示,我应该如何更改它 class Classifier(nn.Module): def __init__(self,input , n_classes): super(Classifier, self).

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

tf.keras.constraints.NonNeg()
但我在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
我想做NonNeg()所做的事情,但在pytorch中,我不想改变它所做的事情

这是在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

你可以这样定义你自己的图层。。。但我很好奇你为什么要这么做

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.abs(self.weight)) + self.bias

基本上,它使用的是重量的绝对值。

但是不使用abs,而是将负值转换为0不是更好吗?因为如果我们使用abs,那么一个大负数的重量将变成一个大正数,这不是NonNeg所做的,那么我应该如何改变代码来代替abs来做这件事呢?keras NonNeg会做这件事吗。如果您想复制NonNeg的功能,那么请理解它的功能,并转换我发布的代码。