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,我们利用训练找到能使损失值最小的参数。包括以下这些步骤:
- 前向传播:输入数据进行forward传输,得出当前参数下的预测值
- 计算损失值
- 反向传播:依据上一次参数的计算梯度,就是下一次传播的方向
- 参数更新:依据计算公式更新参数值
- 重复以上步骤得到最低损失值时即为训练结束
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前半部分
**仅供自己梳理思路使用,若有不对请指出!非常感谢