如何直接使用pytorch内部封装搭建一个简洁的线性神经网络
使用pytorch封装的数据装载、读取与各种优化和损失函数来实现线性神经网络的简洁版
#线性回归模型的简单实现版
import numpy as np
import torch
from torch.utils import data#data中包含一些数据处理的模块
from torch import nn#nn这里面有很多的类神经网络模型
def sysnthetic_data(w,b,num_examples):
X=torch.normal(0,1,(num_examples,len(w)))#先生成一个包含num_examples个样本的随机特征矩阵,每个样本是均值为0,方差为1的随机数,并且每个样本和w相同的长度
Y=torch.matmul(X,w)+b#线性函数的运算
Y+=torch.normal(0,0.01,Y.shape)#加入一个随机噪音,随机噪音中的均值为0,方差为0.01.形状和y是一样的
return X,Y.reshape((-1,1))#返回x与y,并且将y做成一个列向量返回
true_w =torch.tensor([2.-1,3])
true_b=4.2
features,labels = sysnthetic_data(true_w,true_b,1000)
def load_array(data_arrays,batch_size,is_train=True):
'构造一个pytorch数据迭代器'
dataset=data.TensorDataset(*data_arrays)#dataset函数可以将数据转换成训练时需要的数据格式
return data.DataLoader(dataset,batch_size,shuffle=is_train)#dataloader函数可以将转换后的数据集按照batch_size的大小去生成不同的batch,并且允许打乱
batch_size=10
data_iter=load_array((features,labels),batch_size)
next(iter(data_iter))#使用 iter(data_iter) 创建一个迭代器,然后通过 next() 函数获取这个迭代器的下一个元素,
net=nn.Sequential(nn.Linear(2,1))#指定输入的维度与输出的维度,nn.Sequential 是一个容器,用于按顺序定义神经网络的层。它允许你按照顺序将一系列的层组合成一个整体的神经网络模型。
#----------------初始化模型参数——------------------------
net[0].weight.data.normal_(0,0.01)
net[0].bias.data.fill_(0)#可以通过索引值去访问神经网络中的layer,
#normal_ 表示对权重进行正态分布初始化,括号中的参数是正态分布的均值和标准差。在这里,均值是 0,标准差是 0.01。fill_ 表示用指定的值(这里是 0)填充张量
loss=nn.MSELoss()#计算均方误差
trainer=torch.optim.SGD(net.parameters(),lr=0.03)#实现SGD优化,第一个参数是net中的参数列表,第二个参数是指定学习率
e=3
for i in range(e):
for X,y in data_iter:
l=loss(net(X),y)#计算模型在当前批次上的损失
#nn.MSELoss 是一个类,而不是一个函数。nn.MSELoss 类的实例需要在前向传播中接收两个参数:模型的输出和目标值。因此,不能直接替换成 l=nn.MSELoss(net(X),y),
#正确用法是在前向传播时创建一个损失实例,并在后续的代码中使用这个实例来计算损失值。
#在nn.Sequential中,每个层都是一个子模块,而这些子模块都是可调用的。在这个例子中,nn.Linear(2, 1)是nn.Sequential的第一个(也是唯一一个)子模块,因此net(X)实际上就是调用了这个线性层的前向传播操作。
trainer.zero_grad()#梯度清零,防止梯度累积
l.backward()#pytorch中已经自动求和了,所以这里就不需要在自动进行求和了,反向传播,计算梯度
trainer.step()#用step函数进行模型的更新
loss2=loss(net(features),labels)
print(loss2)
运行结果如下:
F:\Python\venv\Scripts\python.exe F:\Python\helloworld.py
tensor(0.0002, grad_fn=<MseLossBackward0>)
tensor(9.7413e-05, grad_fn=<MseLossBackward0>)
tensor(9.6286e-05, grad_fn=<MseLossBackward0>)
进程已结束,退出代码为 0