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
建议的答案是错误的。你不能在这里简单地使用 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
和用于线性回归的系数之间的单调映射。
另一种可能性是通过指数函数:
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 风格。