如何直接使用pytorch内部封装搭建一个简洁的线性神经网络

如何直接使用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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值