
- 引入所需库
- 生成带噪声的人造数据集
- 随机取小批量函数
- 定义线性回归模型(线性神经网络)
- 初始化模型参数
- 定义损失函数
- 定义小批量随机梯度下降优化算法
- 训练模块
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()包含初始化的所有参数
# 训练模块
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}')
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)