动手学深度学习笔记-线性回归的简洁实现

文章目录

  • 引入所需库
  • 生成带噪声的人造数据集
  • 随机取小批量函数
  • 定义线性回归模型(线性神经网络)
  • 初始化模型参数
  • 定义损失函数
  • 定义小批量随机梯度下降优化算法
  • 训练模块

引入所需库

import numpy as np
import torch
from torch.utils import data
from d2l import torch as d2l
from torch import nn  # nn为神经网络的缩写

生成带噪声的人造数据集

# 生成带噪声的人造数据集w=[2, -3.4]T   b=4.2
def synthetic_data(w, b, num_examples):   # 权重w 偏移量b 数据量大小num_examples
    # y = Xw + b + 噪声
    # torch.normal返回从单独的正态分布中提取的随机数的张量,均值为0,方差为1(个数为num_examples,列数为w的长度)
    X = torch.normal(0, 1, (num_examples, len(w)))
    # torch.matmul是tensor的乘法,输入可以是高维的
    y = torch.matmul(X, w) + b
    # 加入噪声
    y += torch.normal(0, 0.01, y.shape)
    return X, y.reshape((-1, 1))# 将y重置为列向量并返回

true_w = torch.tensor([2, -3.4])
true_b = 4.2
features, labels = synthetic_data(true_w, true_b, 1000) # 根据真实w和b生成1000数据
true_w = torch.tensor([2, -3.4])
true_b = 4.2
features, labels = d2l.synthetic_data(true_w, true_b, 1000)

随机取小批量函数

def load_array(data_arrays, batch_size, is_train=True):
    # 传入data_arrays数据生成dataset
    dataset = data.TensorDataset(*data_arrays)
    # DataLoader生成大小固定的随机数据,shuffle设为True表示打乱,batch_size为数据大小
    return data.DataLoader(dataset, batch_size, shuffle=is_train)

batch_size = 10
data_iter = load_array((features, labels), batch_size)

# 将data_iter使用iter()函数转化为迭代对象,使用next()函数输出第一次迭代结果
next(iter(data_iter))

定义线性回归模型(线性神经网络)

# 定义线性神经网络

# nn.Linear()指定全连接层(线性连接层),2表示输入维度为2,1表示输出维度为1
# 线性回归可以理解为一个简单的单层神经网络
# nn.Sequential()将神经网络放入到容器中,以便访问
net = nn.Sequential(nn.Linear(2, 1))
print(net[0].weight)
print(net[0].bias)

结果如下:
在这里插入图片描述

初始化模型参数

# 初始化模型参数

# 使用net[0].weight.data访问线性神经网络的参数w,使用.normal_()定义为均值为0,方差为0.01
net[0].weight.data.normal_(0, 0.01)
# 使用net[0].weight.data访问线性神经网络的参数b,使用fill_()定义为0
net[0].bias.data.fill_(0)
print(net[0].weight)
print(net[0].bias)

结果如下:
在这里插入图片描述

定义损失函数

# 定义损失函数(平方L2范数)
loss = nn.MSELoss()

定义小批量随机梯度下降优化算法

# 初始化SGD实例
trainer = torch.optim.SGD(net.parameters(), lr = 0.03) #net.parameters()包含所有参数

其中这个net.parameters()包含初始化的所有参数
动手学深度学习笔记-线性回归的简洁实现_第1张图片

训练模块

# 训练模块

num_epochs = 3
for epoch in range(num_epochs):
    for X, y in data_iter:
        l = loss(net(X), y)   # 将预测值的y'也就是net(X)和真实值y进行损失计算
        trainer.zero_grad()   # 将训练器梯度清零
        l.backward()          # 自动求导
        trainer.step()        # step()进行模型更新
    l = loss(net(features), labels)   # 对参数调整进行评价
    print(f'epoch {epoch + 1}, loss {l:f}')

你可能感兴趣的:(动手学深度学习笔记,深度学习,线性回归,神经网络,python,pytorch)