龙空技术网

基于Pytorch,训练一个神经网络拟合正弦函数

小黑黑讲AI 406

前言:

今天我们对“拟合算法程序有哪些”可能比较着重,咱们都想要剖析一些“拟合算法程序有哪些”的相关内容。那么小编也在网络上汇集了一些有关“拟合算法程序有哪些””的相关文章,希望看官们能喜欢,同学们一起来学习一下吧!

今天我们要讨论的主题是,使用神经网络拟合正弦函数。

在这篇文章中,我们要基于Pytorch深度学习框架,实现一个纯粹的前馈神经网络模型,并训练这个神经网络,使它拟合出正弦函数。

希望能通过这篇文章,帮助同学们充分了解神经网络模型,并学会使用Pytorch深度学习框架,训练神经网络。

神经网络拟合正弦函数

正弦函数的图像如下,函数输入x,输出y。我们要训练一个3层神经网络,该网络具有正弦函数的功能。当向它输入相同的x时,会输出与正弦函数相同的结果y。

具体来说,神经网络的输入层有1个神经元,接收x信号,隐藏层有10个神经元,生成模拟正弦函数的特征,输出层有1个神经元,输出正弦结果。

下面我会重点讲解两个部分,分别是基于nn.Module定义神经网络模型与使用Adam优化器迭代神经网络模型。

Pytorch的nn.Module模块

nn.Module是PyTorch中最重要的类之一,它是构建神经网络等各类模型的基类,我们可以将nn.Module看作是模型的框架。

我们在实现自己的模型时,需要继承nn.Module类,并重新实现和覆盖其中的一些方法。其中包括两个重要的函数,分别是init和forward函数。

init方法会在创建类的新实例时,被自动调用。我们会在init方法中定义模型的层和参数,比如线性层,激活函数,卷积层等等。例如,这里的样例代码,就定义了两个conv卷积层。

forward方法定义了输入数据如何通过模型,或者说模型如何计算输入数据。也就是,神经网络模型在进行前向传播时的具体操作。

例如,在这里的样例代码中,输入数据x首先进入conv1卷积层,然后计算relu激活函数,接着进入conv2卷积层并激活。

基于nn.Module模块,实现神经网络

接下来,我们基于nn.Module模块,实现一个3层神经网络模型。

定义神经网络类Network,它继承nn.Module类。实现类的初始化函数init,函数传入参数n_in, n_hidden, n_out,代表输入层、隐藏层和输出层中的神经元数量。

在init函数中,调用super.init,即调用了父类的初始化函数。它会确保我们的子类能够正确地继承父类的所有属性和方法。

然后定义两个线性层layer1和layer2,layer1是输入层与隐藏层之间的线性层,layer2是隐藏层与输出层之间的线性层。

在forward函数中,实现神经网络的前向传播。函数传入输入数据x,先计算layer1的结果,并进行sigmoid激活,再计算layer2的结果,并返回。

神经网络的反向传播训练

神经网络的训练是反向传播的。在训练的过程中,会基于梯度下降算法,不断的调整神经元的权重w和偏置b,使得神经网络的预测结果尽可能接近真实值。

在训练前,要设置一个损失函数,该函数可以衡量神经网络的预测值和真实值之间的误差。在拟合正弦函数的这个例子中,损失函数会设置为均方误差函数。

在迭代的过程中,会计算损失函数关于参数w和b的梯度,然后按照梯度的反方向调整权重w和偏置b,进而使得损失函数的值不断减小。

最终在求得损失函数取得最小值时,权重w和偏置b的取值,这样就完成了模型的迭代。

关于如何计算梯度与如何实现梯度下降算法,在这里我们就不去深究了。因为pytorch框架会帮助我们解决这些问题。

接下来,我们要详细的讨论神经网络模型的训练过程。其中包括训练数据的生成、模型的迭代和结果的可视化输出。

训练数据的生成

首先是训练数据的生成。使用np.arrange生成一个从0到1,步长为0.01,含有100个数据点的数组,作为正弦函数的输入数据,保存到x中。

将0到1的x,乘以2π,从单位间隔转换为弧度值,也就是将x映射到正弦函数的一个完整周期上,并计算正弦值,保存到y中。

接着将x和y通过reshape函数转为100乘1的数组,也就是100个(x, y)坐标,代表100个训练数据。将(x, y)组成的数据点,画在画板上。这时运行程序,会在画板上出现正弦函数。

神经网络模型的训练

在训练前,需要将数据x和y转化为tensor张量。然后定义一个3层的神经网络model。

其中输入层接收信号x,包括1个神经元,隐藏层中有10个神经元,进行特征提取。输出层中有1个神经元,输出正弦函数的值。

接着创建均方误差损失函数MSELoss和Adam优化器optimizer。完成这些必要的变量声明后,进入神经网络模型的循环迭代。

这里我们设置迭代的轮数是10000。在循环中,使用当前的模型,预测训练数据x,结果保存在y_pred中。这里即为前向传播。

然后计算预测值y_pred与真实值y之间的损失loss。调用loss.backward,通过自动微分计算损失函数关于模型参数的梯度。

调用optimizer.step,更新模型参数,使得损失函数减小。调用zero_grad,将梯度清零,以便于下一次迭代。这实际上就是反向传播。

模型的每一轮迭代,都由前向传播和反向传播共同组成。在迭代过程中,每1000次迭代,打印一次当前的损失,共打印10次。其中loss.item是损失的标量值。

完成训练后,使用模型预测输入x,得到预测结果h,将预测点(x, h)打印在屏幕。运行程序,会看到橙色的预测结果与蓝色的真实结果几乎重合。这说明神经网络模型很好的拟合了正弦函数。

另外,如果我们把迭代次数改为6000次,会发现模型没有完全拟合,得到的橙色预测结果与蓝色真实值相差就很大。

那么到这里,使用神经网络拟合正弦函数就讲完了,感谢大家的观看,我们下节课再会。

标签: #拟合算法程序有哪些