keras NonNeg 权重约束等价于什么?

问题描述 投票:0回答:2

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 中,不想改变它所做的事情。

这是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
keras pytorch torch
2个回答
3
投票

建议的答案是错误的。你不能在这里简单地使用 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

想法是找到

self.weight
和用于线性回归的系数之间的单调映射。


2
投票

另一种可能性是通过指数函数:

import torch
import torch.nn as nn

class ExpLinear(nn.Module):
    def __init__(self, in_features, out_features):
        super().__init__()
        self.in_features = in_features
        self.out_features = out_features
        self.weights= nn.Parameter(torch.Tensor(out_features, in_features))
        self.bias= nn.Parameter(torch.Tensor(out_features))

    def forward(self, input):
        return nn.functional.linear(input, self.weights.exp(), self.bias.exp())

这个模板也可以与绝对值函数一起使用,我认为它比公认的答案(来自@Serge de Gosson de Varennes)更具 Python 风格。

© www.soinside.com 2019 - 2024. All rights reserved.