Pytorch 中缺乏 L1 正则化的稀疏解决方案

2023-12-22

我正在尝试在简单神经网络的第一层(1 个隐藏层)上实现 L1 正则化。我查看了 StackOverflow 上的其他一些帖子,这些帖子使用 Pytorch 应用 l1 正则化来弄清楚应该如何完成(参考文献:在 PyTorch 中添加 L1/L2 正则化? https://stackoverflow.com/questions/42704283/adding-l1-l2-regularization-in-pytorch, 在 Pytorch 中,如何将 L1 正则化器添加到激活中? https://stackoverflow.com/questions/44641976/in-pytorch-how-to-add-l1-regularizer-to-activations)。无论我将 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 in range(0,len(xtr),batchsize):
        ind=per[i:i+batchsize]
        bx,by=xtr[ind],ytr[ind]            
        optimizer.zero_grad()
        output, l1out=net(bx)
#        l1reg=l1loss(net.lin1)    
        loss=crit(output,by)+lmbda*l1loss(net.lin1)
        loss.backward()
        optimizer.step()
    print('Epoch [%i/%i], Loss: %.4f' %(epoch+1,it, np.float32(loss.data.numpy())))

corr=0
tot=0
for x,y in list(zip(xte,yte)):
    output,_=net(x)
    _,pred=torch.max(output,-1)
    tot+=1 #y.size(0)
    corr+=(pred==y).sum()
print(corr)

注意:数据有 10 个特征(2 个类别和 800 个训练样本),并且只有前 2 个是相关的(根据设计),因此人们会假设真正的零应该很容易学习。


您的使用情况layer.weight.data从其自动微分上下文中删除参数(这是一个 PyTorch 变量),使其在优化器获取梯度时成为常量。这会导致梯度为零并且不会计算 L1 损失。

如果您删除.data,范数是由 PyTorch 变量计算的,并且梯度应该是正确的。

有关 PyTorch 自动微分机制的更多信息,请参阅此文档文章 http://pytorch.org/docs/stable/autograd.html或这个tutorial http://pytorch.org/tutorials/beginner/blitz/autograd_tutorial.html.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Pytorch 中缺乏 L1 正则化的稀疏解决方案 的相关文章

随机推荐

  • 我们如何在 React Native 应用程序中设置 .env?

    我们如何设置 env在反应本机应用程序中 如何在react native中进行环境设置 我使用 react native dotenv 包 安装它并将 react native dotenv 预设添加到项目根目录下的 babelrc 文件中
  • XBAP 与 FireFox 和 Windows 7

    Firefox 依赖 NET 3 5 安装程序安装的扩展和插件来运行 XBAP 不幸的是 在 Windows 7 中已经安装了 NET 3 5 运行时 有谁知道如何获取这些插件 扩展 以便您可以实际将 XBAP 部署到 Windows 7
  • Flex:当文本太长时换行

    我在想是否可以使用css来实现以下功能flexbox 在布局中 原来有2个div彼此相邻 左侧包含一组图标并具有固定宽度 右侧包含文本 可能会很长 有没有办法 如何使用只有CSS 尤其是Flexbox 当文本太长时 div 会换行 在第一个
  • 别名可变原始指针 (*mut T) 是否会导致未定义的行为?

    mut T and mut T导致编译错误 这太棒了 两次可变借用在客观上是错误的 Is mut T and mut T未定义的行为还是这是完全有效的事情 也就是说 可变指针别名有效吗 更糟糕的是 mut T and mut T实际上编译并
  • 使计算属性依赖于 emberjs 中另一个对象的所有属性

    是否可以使一个属性依赖于另一个对象的所有属性 例如 也在jsfiddle中 http jsfiddle net xgZ94 2 html javascript App Em
  • Doctrine - 存储 ArrayCollection 键

    每当我将 ArrayCollection 与 Doctrine ORM 2 3 PHP gt 5 4 一起使用 并将对象值与集合中的键相关联时 例如当使用set方法 值被正确存储在数据库中 但是当我想从实体检索集合时 不会检索键 而是使用数
  • 如何使用 .NET Core 使用 UTC 时间验证 JWT

    目前我正在使用 JWT Bearer Authentication 编写 ASP NET Core WebApi 为了使 API 可以从不同时区访问 我使用以下模式来设置字段nbf 不是之前 和exp 过期 在我的 JWT 内到 UTC 时
  • 如何从 WPF 自动化 Microsoft Word 2003?

    我有一个 WPF 窗口 使用 C 作为后面的代码 其中有一些文本字段 我想要的是 当用户按下打印按钮时 我想获取这些字段上的信息并使用 Microsoft Word 2003 模板 该模板有一些空白字段 需要使用来自 WPF 窗口的这些信息
  • Spring拦截器中如何使用@ExceptionHandler?

    我正在使用 spring mvc 为客户端创建restful api 我有一个用于检查访问令牌的拦截器 public class AccessTokenInterceptor extends HandlerInterceptorAdapte
  • 如何检查矩阵中的每个值是否在R中其他两个矩阵中的对应值之间?

    我有一个矩阵 我想将其与其他两个矩阵进行比较 以查看矩阵中的每个条目是否包含在其他两个矩阵的值内或值之外 例如 如果我的矩阵是 gt M 1 2 3 1 0 1278982 0 4600544 1 3271033 2 0 1079272 1
  • 使用 Spring 在 Swagger UI 上收到 404 错误

    我正在将 swagger UI 与 Spring boot 应用程序集成 当我点击 swagger ui html 时 我收到 404 错误 我的配置类如下 Configuration EnableSwagger2 Import Swagg
  • 有条件地从列表中获取总和

    我有一个类属性详细信息 public class PropertyDetails public int Sequence get set public int Length get set public string Type get se
  • NightwatchJS 和 WebdriverIO 有什么区别?

    正如标题所述 Nightwatch js 和 Webdriver io 有什么区别 看起来它们具有相同的语法并且做几乎相同的事情 它们有何不同 我需要在他们之间做出选择 我已经多次使用这些工具编写了测试套件 Webdriver io 允许您
  • 出现错误 - 运行本机反应时无法识别的命令“run-android”,

    当尝试在我的模拟器上运行本机反应时 我收到此错误 react native run android 错误无法识别的命令 run android 我的模拟器已连接并且正在运行 有什么想法吗 包 json name iaapp version
  • 全屏意图不启动 Activity,但在 Android 10 上显示通知

    我尝试使用下一个代码启动广播接收器的活动 Intent i new Intent context AlarmNotification class i setFlags Intent FLAG ACTIVITY NEW TASK Intent
  • 如何调整轴以从 r 图中的零原点开始

    为了绘制三个变量 x1 x2 和 x3 的经验累积密度 我在 r 中使用了以下内容 plot ecdf x1 col blue main Distribution XYZ xlab x i ylab Prob x i lt y lines
  • 匹配点的正则表达式

    想知道最好的匹配方式是什么 test this from blah blah blah email protected cdn cgi l email protection blah blah 是 使用Python 我试过了re split
  • 如何获取Android系统颜色?

    我正在寻找获取 Android 系统颜色 设备中使用的颜色主题的方法 Using android color 我没有得到正确的颜色 例如 我的设备中的背景颜色是BLACK 菜单背景颜色为DARKGREY 值来自android color 在
  • 如何在代码中处理游标上的 IllegalStateException?

    当我调试我的应用程序时突然弹出此错误 我该如何处理这种错误 我不知道是在哪里以及如何引起的 Daemon System Thread lt 5 gt HeapWorker Suspended exception IllegalStateEx
  • Pytorch 中缺乏 L1 正则化的稀疏解决方案

    我正在尝试在简单神经网络的第一层 1 个隐藏层 上实现 L1 正则化 我查看了 StackOverflow 上的其他一些帖子 这些帖子使用 Pytorch 应用 l1 正则化来弄清楚应该如何完成 参考文献 在 PyTorch 中添加 L1