练习2-线性回归迭代(李沐函数简要解析)

环境:再练习1中
视频链接:https://www.bilibili.com/video/BV1PX4y1g7KC/?spm_id_from=333.999.0.0

代码与详解

数据库
numpy 数据处理处理
torch.utils 数据加载与数据
d2l 专门的库
nn 包含各种层与激活函数

import numpy as np
import torch 
from torch.utils import data
from d2l import torch as d2l
from torch import nn

生成数据集
w=torch.tensor([2,-3.4]) 生成一维两个向量的张量
features,labels=d2l.synthetic_data(w,b,nume) 生成nume个w为权重,b为偏置的数据

w=torch.tensor([2,-3.4])
b=4.2
features,labels=d2l.synthetic_data(w,b,100)

定义对数据集的读取
data.TensorDataset(*data_arrays) 将多个张量合并为一个 通常用于合并特征值与标签 data_arrays=(features,labels)
data.DataLoader(dataset,batchsize,shuffle=true)每次根据上一个函数返回的对象读取batchsize个值 并打乱数据

def load_arrays(data_arrays,batch_size,is_train=True):
    dataset=data.TensorDataset(*data_arrays)
    return data.DataLoader(dataset,batch_size,is_train)

定义数据加载器 并 调用
next(iter(已初始化的数据加载器)) 重新调用数据加载器

batch_size=10
data_iter=load_arrays((features,labels),batch_size)
next(iter(data_iter))

定义模型

定义为线性模型且只有一层
nn.Sequential() 用于包装层
nn.linear(2,1) 用于定义两输入一输出的线性层

net=nn.Sequential(nn.Linear(2,1))

初始化参数 w,b,lr,epoch,batch_size
net[0].weight.data.normal 正态分布
net[0].bias.data.fill_(0) b赋值

net[0].weight.data.normal_(0,0.01)
net[0].bias.data.fill_(0)

定义损失函数 平方误差
nn.MSELoss()

Loss=nn.MSELoss()

优化算法 小批量梯度下降 torch.optim.SGD(net.parameters(), lr=0.03)

trainer=torch.optim.SGD(net.parameters(),lr=0.03)

训练

epochs=3
for epoch in range(epochs):
    for X,y in data_iter:
        l=Loss(net(X),y)
         # 将梯度清零   
        trainer.zero_grad()
        # 反向传播
        l.backward()
        #更新参数
        trainer.step()
    l=Loss(net(features),labels)
    print(f'epoch {epoch + 1}, loss {l:f}')

相关函数与组成部分

定义模型

定义线性回归模型
from torch import nn
net=nn.Sequential(nn.Linear(2,1))

为模型赋值

w,b正态分布
net[0].weight.data.normal_(0,0.01)
net[0].bias.data.fill_(0)

定义损失函数

Loss=nn.MSELoss()

定义优化算法

trainer = torch.optim.SGD(net.parameters(),lr=0.03)

训练

epochs=3
for epoch in range(epochs):
    for X,y in data_iter:
        l=Loss(net(X),y)
         # 将梯度清零   (我的理解:因为计算参数下降时梯度是累积的 即靠着上一层的梯度计算下一层的w 但是for循环一遍后 相当于已经过了一遍神经网络了,但之前的梯度依旧存在在模型中,需要新的梯度计算时不被旧的梯度影响 所以需要再新一轮反向传播前将旧梯度清零)
        trainer.zero_grad()
        # 反向传播
        l.backward()
        #更新参数
        trainer.step()
    l=Loss(net(features),labels)
    print(f'epoch {epoch + 1}, loss {l:f}')

相关的Python语法

def 函数名(变量=True):
	return 

for epoch in range(epochs):

反向传播原理:
https://www.bilibili.com/video/BV1KA411N7Px/?spm_id_from=333.999.0.0&vd_source=302f06b1d8c88e3138547635c3f4de52
https://www.bilibili.com/video/BV1zV4y1R7B4/?spm_id_from=333.337.search-card.all.click&vd_source=302f06b1d8c88e3138547635c3f4de52

正向传播与反向传播的不同(原理具体看视频):
使用场景不同:
正向传播一般是用来计算输出值的
反向传播一般是用来计算权重下降的->反向传播遵循链式求导法则,从后往前求w会减少计算量。

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值