我正在尝试在简单神经网络的第一层(1 个隐藏层)上实现 L1 正则化。我查看了 StackOverflow 上的一些其他帖子,这些帖子使用 Pytorch 应用 l1 正则化来弄清楚它应该如何完成(参考:在 PyTorch 中添加 L1/L2 正则化?,在 Pytorch 中,如何将 L1 正则化添加到激活中?)。无论我将 lambda(l1 正则化强度参数)增加多高,我都不会在第一个权重矩阵中得到真正的零。为什么会这样?(代码如下)
import torch
import torch.nn as nn
import torch.nn.functional as F
import numpy as np
class Network(nn.Module):
def __init__(self,nf,nh,nc):
super(Network,self).__init__()
self.lin1=nn.Linear(nf,nh)
self.lin2=nn.Linear(nh,nc)
def forward(self,x):
l1out=F.relu(self.lin1(x))
out=F.softmax(self.lin2(l1out))
return out, l1out
def l1loss(layer):
return torch.norm(layer.weight.data, p=1)
nf=10
nc=2
nh=6
learningrate=0.02
lmbda=10.
batchsize=50
net=Network(nf,nh,nc)
crit=nn.MSELoss()
optimizer=torch.optim.Adagrad(net.parameters(),lr=learningrate)
xtr=torch.Tensor(xtr)
ytr=torch.Tensor(ytr)
#ytr=torch.LongTensor(ytr)
xte=torch.Tensor(xte)
yte=torch.LongTensor(yte)
#cyte=torch.Tensor(yte)
it=200
for epoch in range(it):
per=torch.randperm(len(xtr))
for i …Run Code Online (Sandbox Code Playgroud)