给定 10个点,用 pytorch 把他们拟合成一条曲线
时间: 2023-05-29 15:01:54 浏览: 127
首先,我们需要准备我们的数据集。由于我们想要拟合成一条曲线,我们可以使用一个简单的正弦函数:
```python
import torch
import matplotlib.pyplot as plt
# Generate data
x = torch.linspace(0, 2 * math.pi, 10) # 生成随机点x轴的取值范围为[0, 2π],在这里我们共有10个数据点
y = torch.sin(x)
# Plot data
plt.plot(x, y, 'ro')
plt.show()
```
现在我们可以看到在我们画出来的图中,有10个点组成了一个正弦函数。我们的目标是使用 PyTorch 优化模型来拟合这些数据,以预测新的 x 值对应的 y 值。
我们可以使用全连接神经网络来拟合这些数据。我们将使用一个带有两个隐藏层的神经网络,并使用均方误差损失函数来优化模型。以下是代码:
```python
import torch
import torch.nn as nn
import torch.optim as optim
import math
import matplotlib.pyplot as plt
# Generate data
x = torch.linspace(0, 2 * math.pi, 10)
y = torch.sin(x)
# Define neural network
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.fc1 = nn.Linear(1, 10)
self.fc2 = nn.Linear(10, 10)
self.fc3 = nn.Linear(10, 1)
def forward(self, x):
x = torch.relu(self.fc1(x))
x = torch.relu(self.fc2(x))
x = self.fc3(x)
return x
# Train network
net = Net()
criterion = nn.MSELoss()
optimizer = optim.Adam(net.parameters(), lr=0.01)
for epoch in range(10000):
optimizer.zero_grad()
outputs = net(x.unsqueeze(1))
loss = criterion(outputs, y.unsqueeze(1))
loss.backward()
optimizer.step()
if epoch % 1000 == 0:
print("Epoch {0} loss: {1}".format(epoch, loss))
# Visualize results
plt.plot(x, y, 'ro', label="ground truth")
plt.plot(x, net(x.unsqueeze(1)).detach().numpy(), label="prediction")
plt.legend()
plt.show()
```
此处我们定义了一个三层神经网络,其中第一、第二层都使用了ReLU激活函数,第三层没有激活函数。我们使用均方误差损失函数,并使用 PyTorch 的 Adam 优化器,训练了这个神经网络 10000 次(每隔 1000 次 epochs 输出一个 loss 值)。
最后,我们使用 Matplotlib 来画出自己生成的数据点(用红点表示)和经过神经网络拟合之后的曲线(用蓝色表示)。我们可以看到模型非常成功地学习到了正弦函数的形状,并且很好地拟合了这些数据点。