pytorch笔记:简易回归问题\L2正则化

1 数据集部分

#导入库
import torch
import matplotlib.pyplot as plt

#建议数据集
x=torch.linspace(-1,1,100)
x=x.view(-1,1)
y=torch.pow(x,2)+0.2*torch.rand(x.shape)
#y=x*x+噪声

#可视化
plt.scatter(x,y)

2 模型定义部分

import torch
import torch.nn.functional as F

#定义模型
class Net(torch.nn.Module):
    def __init__(self,n_input,n_hidden,n_output):
        super(Net,self).__init__()
        
        self.hidden=torch.nn.Linear(n_input,n_hidden)
        self.predict=torch.nn.Linear(n_hidden,n_output)
        #定义每一层的形式(输入维度和输出维度)
        
    #定义前向传播方式
    def forward(self,x):
        x=F.relu(self.hidden(x))
        x=self.predict(x)
        return x
    
#声明模型
net=Net(n_input=1,n_hidden=10,n_output=1)
print(net)
'''
Net(
  (hidden): Linear(in_features=1, out_features=10, bias=True)
  (predict): Linear(in_features=10, out_features=1, bias=True)
)
'''

3 模型训练+绘图

import matplotlib.pyplot as plt

#使用SGD进行梯度下降,设置学习率为0.2
optimizer=torch.optim.SGD(net.parameters(),lr=0.2)

#设置误差函数
loss_func=torch.nn.MSELoss()

#误差值组成的列表
losses=[]


#开始训练
for epoch in range(100):
    prediction=net(x)
    #喂给net训练数据x,输出预测值
    
    loss=loss_func(prediction,y)
    losses.append(loss.item())
    
    #每十次画一张图
    if(epoch%10==0):
        plt.scatter(x,y,c='green')
        plt.plot(x,prediction.detach(),c='blue')
        #这里prediction是带requires_grad的,需要detach掉
        plt.show()
        
    optimizer.zero_grad()
    #清空上一步残余的参数更新值
    
    loss.backward()
    #误差反向传播,计算参数更新值
    
    optimizer.step()
    #将参数更新值施加到net的parameters上
print(losses[-1])
#0.004355926997959614

第一张图:

最后一张图:

4 L2正则化

所有行都一样,只是把SGD哪一行换掉‘

optimizer=torch.optim.SGD([{'params':net.hidden.weight,'weight_decay':1},
                           {'params':net.hidden.bias},
                           {'params':net.predict.weight,'weight_decay':1},
                           {'params':net.predict.bias},
                          ],
                          lr=0.2)

表示对hidden和predict的weight进行η等于1的L2正则化

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UQI-LIUWJ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值