权重衰减的简单示例代码,采用L2正则项

简介: 权重衰减的简单示例代码,采用L2正则项

创造数据

x的数据维度为(200,100)

w的数据维度为(100,1)

利用data_iter获得批次数据

import torch
from torch.utils import data
import torch.nn as nn
n_examples=200
n_features=100
true_w=torch.randn(100,1)
true_b=torch.tensor(0.54)
x_=torch.randn(200,100)
y_=x_@true_w+true_b
y_+=torch.normal(0,0.01,y_.shape)
def data_iter(x,y,batch_size):
    n_example=len(x)
    indices=torch.randperm(n_example)
    for i in range(0,n_example,batch_size):
        batch_indices=indices[i:min(i+batch_size,n_example)]
        yield x[batch_indices],y[batch_indices]

只对参数w进行权重衰减,b不需要

方式一

在优化器的参数中,利用字典的方式指名对待不同的参数实行不同的执行原则

wd=3
net=nn.Linear(100,1)
loss_function=nn.MSELoss()
optimizer=torch.optim.SGD([{'params':net.weight,
                           'weight_decay':wd},
                          {'params':net.bias}],lr=0.03)
epochs=3
for epoch in range(epochs):
    net.train()
    losses=0.0
    for x,y in data_iter(x_,y_,batch_size=20):
        y_hat=net(x)
        loss=loss_function(y_hat,y)
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        losses+=loss.item()
    print(losses)

方式二

方式二用了两个优化器,第一个掌管参数w的优化,第二个负责偏置b的优化,但是这样较为麻烦,需要两次梯度清0,且进行两次梯度更新

wd=3
net=nn.Linear(100,1)
loss_function=nn.MSELoss()
optimizer_w=torch.optim.SGD([net.weight],lr=0.03,weight_decay=wd)
optimizer_b=torch.optim.SGD([net.bias],lr=0.03)
epochs=3
for epoch in range(epochs):
    net.train()
    losses=0.0
    for x,y in data_iter(x_,y_,batch_size=20):
        y_hat=net(x)
        loss=loss_function(y_hat,y)
        optimizer_w.zero_grad()
        optimizer_b.zero_grad()
        loss.backward()
        optimizer_w.step()
        optimizer_b.step()
        losses+=loss.item()
    print(losses)


目录
相关文章
|
4月前
|
自然语言处理
在ModelScope中,你可以通过设置模型的参数来控制输出的阈值
在ModelScope中,你可以通过设置模型的参数来控制输出的阈值
100 1
|
2月前
|
机器学习/深度学习 计算机视觉 Python
`GridSearchCV` 是一种穷举搜索方法,它会对指定的参数网格中的每一个参数组合进行交叉验证,并返回最优的参数组合。
`GridSearchCV` 是一种穷举搜索方法,它会对指定的参数网格中的每一个参数组合进行交叉验证,并返回最优的参数组合。
|
机器学习/深度学习 算法 计算机视觉
线性回归 正则项(惩罚项)原理、正则项的分类与Python代码的实现
线性回归 正则项(惩罚项)原理、正则项的分类与Python代码的实现
|
4月前
|
算法 Go 区块链
YOLOD也来啦 | 优化YOLOv5样本匹配,顺带设计了全新的模块
YOLOD也来啦 | 优化YOLOv5样本匹配,顺带设计了全新的模块
52 0
|
4月前
|
机器学习/深度学习 TensorFlow 定位技术
神经网络学习率指数衰减ExponentialDecay策略的参数含义与使用方法详解
神经网络学习率指数衰减ExponentialDecay策略的参数含义与使用方法详解
105 1
|
存储 算法 PyTorch
pytorch 给定概率分布的张量,如何利用这个概率进行重复\不重复采样?
在 PyTorch 中,可以使用 torch.distributions.Categorical 来基于给定的概率分布进行采样。
833 0
|
10月前
|
机器学习/深度学习 PyTorch 算法框架/工具
base model初始化large model,造成的参数矩阵对不上权重不匹配问题+修改预训练权重形状和上采样
base model初始化large model,造成的参数矩阵对不上权重不匹配问题+修改预训练权重形状和上采样
172 0
torch 如何在迭代训练中,只计算参数梯度,不更新参数。并且将参数的梯度保存到列表,这个列表的值不随着梯度清零而跟着变为零
在使用 torch.autograd.backward() 计算梯度后,可以通过设置参数的 requires_grad 属性为 False 来阻止参数更新。同时,通过将计算出的梯度值放入一个列表中来保存,这个列表的值不会随着梯度清零而清零
667 0
torch中对一个行向量使用sigmoid函数转换成概率,如果这个行向量包含的元素有几千上万个,这可能会导致转换成的概率再抽样效果不好,应该怎么解决这个问题
可以尝试使用softmax函数进行转换,它可以处理具有多个值的行向量,并将其转换为概率分布。另外,可以考虑使用截断技术(如Top-K),减少概率中过小的部分,以提高采样效果。
126 0
|
PyTorch 算法框架/工具
已经定义好了一个张量,如何增加代码要求计算梯度?
在 PyTorch 中,可以使用 requires_grad_() 方法来动态设置张量的 requires_grad 属性为 True,从而要求计算梯度。具体来说,对于已经创建的张量 x,可以通过调用 x.requires_grad_() 来将其设置为需要计算梯度的张量。
309 0