import torch
import numpy as np
from d2l import torch as d2l
from torch.utils import data
from torch import nn
w=torch.tensor([2,-3.4])
b=4.2
feature,lables=d2l.synthetic_data(w,b,1000)
def load_array(data_array,batch,is_train=True):
dataset=data.TensorDataset(*data_array)
return data.DataLoader(dataset,batch,shuffle=is_train)
batch=10
data_it=load_array((feature,lables),batch)
net=nn.Sequential(nn.Linear(2,1))
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)
num=3
for i in range(num):
for x,y in data_it:
l=loss(net(x),y)
trainer.zero_grad()
l.backward()
trainer.step()
l=loss(net(feature),lables)
第一部分:
- 定义线性模型的权重
w
和偏置b
。 - 生成 1000 个样本的特征(
feature
)和标签(labels
),根据线性关系 y=wT⋅x+by=wT⋅x+b 生成。
2:
load_array函数
- 将特征和标签组合成一个数据集,并创建一个数据加载器,按批次加载数据。
3:
设置批次batch大小为 10,并创建数据加载器 data_it
4:
- 使用
nn.Sequential
创建一个简单的线性回归模型,输入维度为 2,输出维度为 1
5:
- 将模型的权重初始化为均值为 0、标准差为 0.01 的正态分布。
- 将偏置初始化为 0。
6:
- 使用均方误差(MSE)作为损失函数。
- 使用随机梯度下降(SGD)作为优化器,学习率设为 0.03
7:
- 训练模型 3 个周期(
num = 3
)。 - 在每个周期中,遍历数据加载器
data_it
,每次获取一个批次的特征x
和标签y
。 - 计算模型的输出与真实标签之间的损失
l
。 - 清空优化器的梯度(
trainer.zero_grad()
)。 - 反向传播计算梯度(
l.backward()
)。 - 更新模型参数(
trainer.step()
)。 - 在每个周期结束后,计算当前模型在所有特征上的损失。