神经网络拟合sin函数并画出loss图
时间: 2023-06-11 15:09:22 浏览: 100
好的,我可以为您演示如何使用 Python 和 PyTorch 来拟合 sin 函数,并绘制损失图。
首先,让我们导入必要的库:
```python
import torch
import torch.nn as nn
import matplotlib.pyplot as plt
import numpy as np
```
然后,我们需要定义我们的模型。在本例中,我们将使用一个具有两个隐藏层的简单前馈神经网络(feedforward neural network):
```python
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.fc1 = nn.Linear(1, 10) # 输入层 -> 隐藏层1
self.fc2 = nn.Linear(10, 10) # 隐藏层1 -> 隐藏层2
self.fc3 = nn.Linear(10, 1) # 隐藏层2 -> 输出层
def forward(self, x):
x = nn.functional.relu(self.fc1(x))
x = nn.functional.relu(self.fc2(x))
x = self.fc3(x)
return x
```
接下来,我们需要准备我们的训练数据。为了拟合 sin 函数,我们将在 -π 和 π 之间生成一些随机样本,并计算它们的 sin 值:
```python
# 生成训练数据
np.random.seed(0)
x_train = np.random.uniform(-np.pi, np.pi, size=(1000, 1)).astype(np.float32)
y_train = np.sin(x_train)
```
然后,我们需要定义我们的损失函数和优化器:
```python
# 定义损失函数和优化器
criterion = nn.MSELoss()
optimizer = torch.optim.Adam(net.parameters(), lr=0.01)
```
最后,我们可以开始训练我们的模型。我们将训练模型 1000 次,并在每次训练后记录损失值。最后,我们将绘制损失图:
```python
# 训练模型
net = Net()
losses = []
for epoch in range(1000):
inputs = torch.from_numpy(x_train)
targets = torch.from_numpy(y_train)
optimizer.zero_grad()
outputs = net(inputs)
loss = criterion(outputs, targets)
loss.backward()
optimizer.step()
losses.append(loss.item())
# 绘制损失图
plt.plot(losses)
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.show()
```
这样,我们就训练出了一个能够拟合 sin 函数的神经网络,并绘制出了损失图。
阅读全文