详解用pytorch搭建一个简单的神经网络

版权声明:欢迎转载,请注明此博客地址。 https://blog.csdn.net/Ever_glow/article/details/89086960

前言

本文通过一个简单的神经网络的实现,来介绍相关的pytorch函数,以及相关流程。

前面首先介绍代码的实现,后面再针对问题进行相应的解释。


前期准备

1.pytorch中文文档

2.神经网络基础

3.BP算法

4.文中代码来源


代码实现

import torch
import torch.nn.functional as F
from torch.autograd import Variable
import matplotlib.pyplot as plt

x = torch.unsqueeze(torch.linspace(-1,1,100),dim = 1)
#unsqueeze函数创建一个维度是1的向量
linspace函数生成在-1到1之间的100个数

y = x**2+0.2*torch.rand(x.size())
#得到x自乘的矩阵,然后加上同x矩阵相同的噪声

print(x,y,x.size())
#输出x,y矩阵,以及矩阵x的大小

#以上操作为初始化矩阵

x,y = Variable(x),Variable(y)
#将矩阵转化为 变量

class Net(torch.nn.Moudle):
#定义神经网络
	def __init__(self,n_feature,n_hidden,n_output):
	#初始化数组,参数分别是初始化信息,特征数,隐藏单元数,输出单元数
		super(Net,self).__init__()
		#此步骤是官方要求
		self.hidden = torch.nn.Linear(n_feature,n_hidden)
		#设置输入层到隐藏层的函数
		self.predict = torch.nn.Linear(n_hidden,n_output)
		#设置隐藏层到输出层的函数

	def forward(self,x):
	#定义向前传播函数
		x = F.relu(self.hidden(x))
        #给x加权成为a,用激励函数将a变成特征b
		x = self.predict(x)
        #给b加权,预测最终结果
		return x
net = Net(1,10,1)
#定义一个神经网络
print(net)
#查看各层之间的参数

输出

以上代码已经构建完成神经网络,下面开始训练部分。

opt = torch.optim.SGD(net.parameters(),lr=0.5)
#设置学习率为0.5,用随机梯度下降发优化神经网络的参数

lossfunc = torch.nn.MSELoss()
#设置损失函数为均方损失函数,用来计算每次的误差

for t in range(100):
#进行100次的优化
	prediction = net(x)
	#得到预测值
	loss=lossfunc(prediction,y)
	#得到预测值与真实值之间的误差
	opt.zero_grad()
	#梯度清零
	loss.backward()
	#反向传播
	opt.step()
	#梯度优化
plt.ioff()
plt.show()

知识整理

可以看到上述代码执行神经网络的流程:创建矩阵 -> 转换为变量 -> 设置神经网络 -> 进行训练

把矩阵转化为变量,方便后面进行梯度计算。

设置神经网络是关键部分,此神经网络包括两部分:__init()__函数跟forward()函数

__init()__函数包括四个参数,分别是:初始信息,特征数,隐藏单元数,输出单元数

该函数包含三部分:首先是继承模块,此步骤是官方步骤。然后是定义输入层到隐藏层的函数,然后定义隐藏层到输出层的函数。

关于后两个函数,可以自己定义,nn包中封装了Linear()函数,用来处理形如y = wA^{T}+b的层间关系,此函数有三个参数,分别是输入样本大小,输出样本大小,bias,当bias为false时,图层不会学习附加偏差。

此模型只有三层结构,所以只有输入层跟隐藏层,隐藏层跟输出层的关系,对应数量分别是1对10,10对1。此处参数的更改会在后面过程中的opt参数体现出来。

forward函数是神经网络的前向传播函数,此函数主要会利用到激励函数,通过前面定义的各层之间的关系,产生新的结果,即新的预测值,此值会拿来跟最终的结果做比较,通过反向传播更新参数值。此函数中的relu()函数就是常用的将一个数换成(0,1)之间的小数的函数,可以自行百度。

然后就是训练部分,首先要定义Loss函数和优化器,此处的Loss函数用nn包自带的均方损失函数,即loss(xi,yi) = (xi-yi)^{2},

此函数形式有很多,用途就是计算预测值跟结果之间的差距。优化器的选择参考此处。(挖坑待填)

训练的过程:得到预测值 - - 利用Loss函数得到误差 - - 梯度清零 - - 反向传播 - - 梯度优化。

经过数次训练,net神经网络的参数会不断得到优化,直到达到预期效果。


最后

输出一下loss值,看一下每次的误差

初次了解pytorch,第一次搭建神经网络,若有错误以及不足之处,欢迎提出。

猜你喜欢

转载自blog.csdn.net/Ever_glow/article/details/89086960