引入一些比较的包,注意torch.utils中的data!!
import numpy as np
import torch
from torch.utils import data
from d2l import torch as d2l
true_w = torch.tensor([2, -3.4])
true_b = 4.2
#随机生成features和labels,这里是真实的
features, labels = d2l.synthetic_data(true_w, true_b, 1000)
理解TensorDataset和DataLoader!!!!
#布尔值is_train表示是否希望数据迭代器对象在每个迭代周期内打乱数据
def load_array(data_arrays, batch_size, is_train=True): #@save
"""构造一个PyTorch数据迭代器"""
#TensorDataset将两个tensor放在一起
#单个星号代表这个位置接收任意多个非关键字参数,在函数的*位置上将其转化成元组
#而双星号代表这个位置接收任意多个关键字参数,在**位置上将其转化成字典
# *data_arrays是元祖 tuple
dataset = data.TensorDataset(*data_arrays)
#DataLoader 重新排序
return data.DataLoader(dataset, batch_size, shuffle=is_train)
batch_size = 10
data_iter = load_array((features, labels), batch_size)
这里观察好像要用next(iter ( ) ),来观察!!很细节
#next iter
next(iter(data_iter))
nn代表神经网络
# nn是神经网络的缩写
from torch import nn
# Sequential list of layers有序的将神经网络排列
net = nn.Sequential(nn.Linear(2, 1))
初始化权重w(均值0,方差0.01)和b(0)
#weight w
net[0].weight.data.normal_(0, 0.01)
#bias b
net[0].bias.data.fill_(0)
loss直接用MSELoss()因为是回归问题
#也称为平方范数
loss = nn.MSELoss()
torch.optim.SGD小批量梯度下降
#小批量梯度下降
trainer = torch.optim.SGD(net.parameters(), lr=0.03)
模型最重要的部分!!!!!!!!
num_epochs = 3
for epoch in range(num_epochs):
for X, y in data_iter:
#计算损失函数
l = loss(net(X) ,y)
#梯度清零
trainer.zero_grad()
#更新w,b
l.backward()
#模型更新
trainer.step()
l = loss(net(features), labels)
print(f'epoch {epoch + 1}, loss {l:f}')