前言:
今天我们对“拟合算法程序有哪些”可能比较着重,咱们都想要剖析一些“拟合算法程序有哪些”的相关内容。那么小编也在网络上汇集了一些有关“拟合算法程序有哪些””的相关文章,希望看官们能喜欢,同学们一起来学习一下吧!今天我们要讨论的主题是,使用神经网络拟合正弦函数。
在这篇文章中,我们要基于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次,会发现模型没有完全拟合,得到的橙色预测结果与蓝色真实值相差就很大。
那么到这里,使用神经网络拟合正弦函数就讲完了,感谢大家的观看,我们下节课再会。
标签: #拟合算法程序有哪些