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

# 定义真实的w系数向量(w1,w2),真是偏移量b = 4.2
true_w = torch.tensor([2, -3.4])
true_b = 4.2
# 生成一个数据集,数据集中包含1000个特征点和以及其对应的标签
features, labels = d2l.synthetic_data(true_w, true_b, 1000)

# 定义一个函数,函数功能是从数据集中随机取出一个批量的特征点和以及其对应的标签
def load_array(data_arrays, batch_size, is_train=True):  #@save
    """构造一个PyTorch数据迭代器"""
    dataset = data.TensorDataset(*data_arrays)
    return data.DataLoader(dataset, batch_size, shuffle=is_train)

# 定义批量大小
batch_size = 10
# 从数据集中取出一个批量的特征点和以及其对应的标签
data_iter = load_array((features, labels), batch_size)

# 定义线性回归模型
# 这里Sequential表示是一个层序列,因为线性回归是一个单层网络,所以就只存放一个层,通过下标可以访问到各个层
net = nn.Sequential(nn.Linear(2, 1))    #2表示输入维度为2(即x1,x2),输出维度为1(即y)

# 随机初始化第一层的权重向量w和偏移量b
net[0].weight.data.normal_(0, 0.01)
net[0].bias.data.fill_(0)

# 定义均方损失函数
loss = nn.MSELoss()

# net.parameters()就是权重向量w和偏移量b
# 定义小批量梯度下降优化算法
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()
        l.backward()    
        trainer.step()      #调用小批量梯度下降优化算法
    l = loss(net(features), labels)     #计算每次迭代后在整个数据集上的损失函数
    print(f'epoch {epoch + 1}, loss {l:f}')

 

posted on 2022-10-06 17:04  yc-limitless  阅读(63)  评论(0)    收藏  举报