使用 pytorch 创建神经网络拟合sin函数的实现

使用 pytorch 创建神经网络拟合sin函数的实现

一、引言

神经网络作为一种强大的机器学习算法,在许多领域得到了广泛的应用。本文将介绍如何使用 pytorch 创建一个神经网络,用于拟合 sin 函数。

二、数据准备

1. 数据生成

我们将使用 numpy 生成训练数据。代码如下:

import numpy as np

x = np.arange(-np.pi, np.pi, 0.1)

y = np.sin(x)

这里我们生成了以 0.1 为步长,从 -π(包含)到 π(不包含)的一组输入数据 x,对应的输出数据 y 是这些输入在 sin 函数中的取值。接下来我们将训练数据划分为训练集和测试集:

split_idx = int(len(x) * 0.8)

x_train = x[:split_idx]

y_train = y[:split_idx]

x_test = x[split_idx:]

y_test = y[split_idx:]

2. 数据可视化

我们可以使用 matplotlib 将训练数据可视化,以便更好地了解数据的分布情况。代码如下:

import matplotlib.pyplot as plt

plt.plot(x_train, y_train, label='Train Data')

plt.plot(x_test, y_test, label='Test Data')

plt.legend()

plt.show()

运行这段代码后,我们可以得到如下的图像:

三、模型构建

1. 基本结构

在 pytorch 中,我们可以使用 nn.Module 类来搭建神经网络模型。模型中需要定义多个层(例如全连接层、卷积层等),它们都是 nn.Module 的子类。

对于本文的问题,我们只需要使用一个全连接层(nn.Linear)做拟合就可以了。代码如下:

import torch.nn as nn

class Net(nn.Module):

def __init__(self):

super(Net, self).__init__()

self.fc = nn.Linear(1, 1)

def forward(self, x):

out = self.fc(x)

return out

上面的代码中,Net 继承自 nn.Module,重写了 init 方法和 forward 方法。其中 init 方法定义了一个全连接层,输入为 1,输出为 1;forward 方法则是将输入 x 传入全连接层中,得到输出 out。

2. 损失函数和优化器

在训练模型之前,我们需要定义损失函数和优化器。对于本文的问题,我们将使用均方误差作为损失函数,使用随机梯度下降作为优化器。代码如下:

import torch.optim as optim

criterion = nn.MSELoss()

optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)

上面的代码定义了均方误差损失函数和随机梯度下降优化器。其中 net.parameters() 表示我们要优化的模型参数集合。

四、模型训练

有了模型、损失函数和优化器,我们就可以开始训练模型了。以下是训练过程的代码:

num_epochs = 2000

for epoch in range(num_epochs):

inputs = torch.Tensor(x_train).unsqueeze(1)

targets = torch.Tensor(y_train).unsqueeze(1)

optimizer.zero_grad()

outputs = net(inputs)

loss = criterion(outputs, targets)

loss.backward()

optimizer.step()

if epoch % 100 == 0:

print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, loss.item()))

上面的代码中,我们迭代 num_epochs 次,每次都将训练数据输入模型中,得到输出和真实标签进行比较,计算损失函数并进行反向传播。每迭代 100 次,我们就打印一下当前的损失值。

五、模型评估

模型训练完毕后,我们需要对模型进行评估。以下是代码:

import math

inputs = torch.Tensor(x_test).unsqueeze(1)

targets = torch.Tensor(y_test).unsqueeze(1)

outputs = net(inputs)

loss = criterion(outputs, targets)

print('Test Loss: {:.4f}'.format(loss.item()))

predictions = outputs.detach().numpy().squeeze()

plt.plot(x_test, y_test, label='Ground Truth')

plt.plot(x_test, predictions, label='Predictions')

plt.legend()

plt.show()

上面的代码中,我们在测试集上计算了模型的均方误差,并使用 matplotlib 将模型的预测结果和真实标签可视化。以下是可视化结果:

可以看到,模型基本上很好地拟合了 sin 函数。

六、实验结果

我们还可以尝试一些不同的实验,来探究模型的性能。例如,我们可以尝试改变模型的隐藏层大小、激活函数、优化器等参数,看看模型的表现如何。

在本文中,我们测试了 temperature=0.6 的模型,您可以在代码中尝试不同的 temperature 参数,并观察模型的拟合效果。

后端开发标签