PyTorch构建简单神经网络

Python 机器学习入门之PyTorch建立MLP


前言`

利用PyTorch搭建一个神经网络:输入层,隐藏层,输出层


一、神经网络的构建

1.数据转换

将要输入的数据转换成张量的形式

import torch
#输入的数据
x=[[1,2],[3,4],[5,6]]
y=[[3],[7],[11]]
#转化为张量
X=torch.tensor(x).float()
Y=torch.tensor(y).float()

2.网络构建

利用PyTorch中的nn进行构造(专门用于构建和训练神经网络的模块)

(1)导入nn模块:
该模块专门用于构建神经网络。其中有层,激活函数,损失函数等等。

import torch.nn as nn

(2)创建一个类,继承nn中的module

class MyNeural(nn.Module):
    def __init__(self):
        super().__init__()

(3)建立2-8-1的全连接神经网络结构
隐藏层使用ReLu激活函数

        self.input_to_hiddenlayer=nn.Linear(2,8)
        self.hiddenlayer_to_output=nn.Linear(8,1)
        self.hiddenlayer_activation=nn.ReLU()

(4)前向传输:
将输入的数据按照网络结构进行传输

    #前向传输
    def forward(self,x):
        x=self.input_to_hiddenlayer(x)
        x=self.hiddenlayer_activation(x)
        x=self.hiddenlayer_to_output(x)
        return x

(5)创建网络实例

model=MyNeural()
print(model)

#输出结果,可以看到每一层的状态
'''MyNeural(
  (input_to_hiddenlayer): Linear(in_features=2, out_features=8, bias=True)
  (hiddenlayer_to_output): Linear(in_features=8, out_features=1, bias=True)
  (hiddenlayer_activation): ReLU()
)'''

也可以利用MyNeural.parameters()来查看神经网络中参数初始化的值,每一次初始化的值可能都不同。
若想得到相同的值,可以使用随机种子。想要在同一个程序中产生同一组随机数,需要在下一个函数前设置一个相同的随机种子torch.manual_seed(0)

(6)计算损失值
首先定义损失函数,这里用到的是MSE损失函数:loss_f=nn.MSELoss(),计算真实值和预测值之间的差距:

real_Y=model(X)
loss_val=loss_f(real_Y,Y)
print(loss_val)
#输出:tensor(79.1966, grad_fn=<MseLossBackward0>)

在进行损失值计算时,要先传入预测值,再传入真实值

二、 模型训练

训练参数一般是利用梯度下降的方法,找到使损失值能够下降的方向进行迭代训练。每一次训练称为一次epoch,我们利用训练找到能使损失值最小的参数。包括以下这些步骤:

  1. 前向传播:输入数据进行forward传输,得出当前参数下的预测值
  2. 计算损失值
  3. 反向传播:依据上一次参数的计算梯度,就是下一次传播的方向
  4. 参数更新:依据计算公式更新参数值
  5. 重复以上步骤得到最低损失值时即为训练结束

1.引入库

**优化器(Optimizer)**是用于调整神经网络模型参数,来最小化损失函数的算法。我的理解是:指梯度下降的方法,有SGD,伴随动量的,自适应矩估计(Adam)等。from torch.optim import SGD是利用SGD算法。

opt=SGD(mynet.parameters(),lr=0.001)#利用SGD进行梯度下降寻找参数
epochs=50#训练步数

其中lr指学习率,表示向梯度方向移动的长度大小。

  • 学习率过大的时候,可能会导致不收敛(如在这其中调到lr=0.01时,会跳过全局最优解。
  • 学习率过小的时候,会导致训练过程缓慢,货只能到达局部最优。

2.进行训练

#进行训练
loss_history=[]
#步骤:
#1.计算预测值
#2.计算loss
#3.backward计算梯度
#4.更新参数
for epoch in range(epochs):
    opt.zero_grad()#reset gradient
    loss_val=loss_function(model(X),Y)#
    loss_val.backward()
    opt.step()#update parameters
    loss_val=loss_val.detach().numpy()
    loss_history.append(loss_val)

3.进行绘制

#plot the line of the loss value
plt.plot(loss_history)
plt.show()
print(model.parameters())

在这里插入图片描述

总结

利用PyTorch通过继承nn中的模型来进行搭建,搭建了2 layers的实现两数之和的神经网络。

*参考:https://blog.csdn.net/LOVEmy134611/article/details/130875404?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7EPaidSort-1-130875404-blog-133147298.235%5Ev43%5Epc_blog_bottom_relevance_base5&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7EPaidSort-1-130875404-blog-133147298.235%5Ev43%5Epc_blog_bottom_relevance_base5&utm_relevant_index=1前半部分

**仅供自己梳理思路使用,若有不对请指出!非常感谢

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值