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)
建议的答案是错误的。这里不能简单地使用 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和用于线性回归的系数之间的单调映射。
| 归档时间: |
|
| 查看次数: |
3218 次 |
| 最近记录: |