Pytorch如何约束神经网络中权重/偏置的范围

笔者由于在做可解释机器学习,后来在pytorch的discussion上终于找到了相应的解决方案,应该是全中文社区唯一能用的,英文社区也只仅有一个地方提到了这个,这里给大家看下我是怎么实现约束神经网络的权重和偏置的。

方法一:

首先编写模型结构:

class Model(nn.Module):
    def __init__(self):
        super(Model,self).__init__()
        self.l1=nn.Linear(100,50)
        self.l2=nn.Linear(50,10)
        self.l3=nn.Linear(10,1)
        self.sig=nn.Sigmoid()
    
    def forward(self,x):
        x=self.l1(x)
        x=self.l2(x)
        x=self.l3(x)
        x=self.sig(x)
        return(x

然后编写限制权重范围的类:

class weightConstraint(object):
    def __init__(self):
        pass
    
    def __call__(self,module):
        if hasattr(module,'weight'):
            print("Entered")
            w=module.weight.data
            w=w.clamp(0.5,0.7) #将参数范围限制到0.5-0.7之间
            module.weight.data=w

最后实例化这个类,对权重进行限制:

# Applying the constraints to only the last layer
constraints=weightConstraint()
model=Model()
#模型训练的时候再写下面这段代码:
model._modules['l3'].apply(constraints)

方法二:

在模型train的时候,对参数的范围进行限制:

loss = criterion(out, var_y)
optimizer.zero_grad()
loss.backward()
optimizer.step()

for p in net.parameters():
    p.data.clamp_(0, 99)

将权重和偏执的范围限制到0-99之间。

仅限制权重的范围,不限制偏执的范围:

for p in net.parameters():
        p.register_hook(lambda grad: torch.clamp(grad, 0,10))
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值