教你利用PyTorch实现sin函数模拟
简介
PyTorch是一个基于Python的科学计算库,它有以下特点:
- 支持GPU加速计算
- 动态计算图
- 支持自动求导
- 方便的构建神经网络
在本文中,我们将使用PyTorch来实现sin函数的模拟。具体来说,我们将使用PyTorch来构建一个神经网络,并使用该神经网络来拟合sin函数。
准备工作
在开始本教程之前,需要确保已经安装了PyTorch。如果你还没有安装PyTorch,请根据你的操作系统和Python版本,在官方网站上选择对应的安装方式进行安装。
构建神经网络
我们将使用一个简单的神经网络来拟合sin函数。该神经网络有1个输入层、1个中间层和1个输出层。输入层有1个神经元,中间层有10个神经元,输出层有1个神经元。
下面是构建神经网络的代码块:
import torch
import torch.nn as nn
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.fc1 = nn.Linear(1, 10)
self.fc2 = nn.Linear(10, 1)
def forward(self, x):
x = torch.sin(self.fc1(x))
x = self.fc2(x)
return x
我们首先导入torch和torch.nn。接着定义一个名为Net的神经网络类,该类继承自nn.Module。在类的初始化函数中,我们定义了一个名为fc1的全连接层,该层有1个输入神经元和10个输出神经元;接下来定义了一个名为fc2的全连接层,该层有10个输入神经元和1个输出神经元。在该函数的最后,我们调用了父类的初始化函数。
接下来,在神经网络的forward函数中,我们首先对输入的x进行sin操作,然后将x输入到fc2全连接层中。最后返回x。
训练神经网络
现在我们已经构建好了神经网络,接下来我们需要使用数据对神经网络进行训练。在本教程中,我们将使用随机生成的数据集来训练神经网络。
下面是训练神经网络的代码块:
import numpy as np
net = Net()
criterion = nn.MSELoss()
optimizer = torch.optim.Adam(net.parameters(), lr=0.01)
inputs = np.arange(0, 2*np.pi, 0.1)
inputs = inputs.reshape(inputs.shape[0], 1)
labels = np.sin(inputs)
for epoch in range(1000):
inputs_torch = torch.from_numpy(inputs).float()
labels_torch = torch.from_numpy(labels).float()
optimizer.zero_grad()
outputs = net(inputs_torch)
loss = criterion(outputs, labels_torch)
loss.backward()
optimizer.step()
if epoch % 100 == 0:
print(f"Epoch {epoch}, Loss {loss.item()}")
我们首先定义了一个名为net的神经网络,以及一个均方误差损失函数。接下来,我们使用Adam优化器来更新神经网络的参数,并将学习率lr设置为0.01。
在接下来的代码块中,我们首先生成输入数据inputs和标签数据labels,然后在每次训练循环中(1000次循环),将inputs和labels转换为PyTorch tensor,并将网络输出和标签输入均作为参数传入损失函数中。我们计算损失并反向传播,最后更新优化器。
在训练循环中,我们每训练100个epoch就打印一次损失值。
验证模型
训练完成后,我们将使用训练好的神经网络来验证我们的模型。在本教程中,我们将使用测试集来验证模型。
下面是测试模型的代码块:
import matplotlib.pyplot as plt
test_inputs = np.arange(0, 2*np.pi, 0.1)
test_inputs = test_inputs.reshape(test_inputs.shape[0], 1)
test_labels = np.sin(test_inputs)
test_inputs_torch = torch.from_numpy(test_inputs).float()
test_outputs_torch = net(test_inputs_torch)
test_outputs = test_outputs_torch.detach().numpy()
plt.plot(test_inputs.squeeze(), test_labels.squeeze(), label='Ground Truth')
plt.plot(test_inputs.squeeze(), test_outputs, label='Predictions')
plt.legend()
plt.show()
我们首先生成测试集的数据test_inputs和标签test_labels,然后使用训练好的神经网络net来预测输出值,得到test_outputs。最后,我们将test_inputs、test_labels和test_outputs绘制成图表展示。
该图表包括Ground Truth和Predictions两条曲线。Ground Truth代表sin函数的真实值,Predictions代表神经网络预测的输出值。由可视化图表可以看出,我们训练的神经网络能够很好地拟合sin函数。
示例解释
示例1:构建神经网络部分中的代码可以看到,在Net类中,我们并没有使用激活函数。这是因为我们在forward函数中使用了sin函数来对输入进行处理。相当于用了一种新的非线性激活函数,帮助网络处理非线性的Input值。另外,在构建神经网络的时候,我们定义了两个全连接层,分别用于从输入层中提取特征,并用于生成输出结果。
示例2:在训练神经网络的代码中,我们首先生成输入数据inputs和标签数据labels,然后使用PyTorch中的tensor进行处理,最后将数据传入神经网络中进行训练。在训练过程中,我们使用了均方误差(MSE)作为损失函数,并使用Adam优化器进行参数更新。在每100个epoch后,我们打印一次损失值,以方便我们能够观察到训练的情况。最终,我们验证了模型的预测能力,并通过可视化图像观察到预测值与真实值之间的相关性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:教你利用PyTorch实现sin函数模拟 - Python技术站