jupyter notebook pytorch loss曲线
时间: 2025-04-19 22:36:32 浏览: 36
### 使用 PyTorch 和 Matplotlib 在 Jupyter Notebook 中绘制 Loss 曲线
在 Jupyter Notebook 中使用 PyTorch 训练模型时,可以通过集成 `matplotlib` 库来实现实时绘制损失曲线的功能。下面展示了一个完整的例子,说明如何设置环境、定义训练循环,并利用 `matplotlib` 动态显示每次迭代后的损失变化情况。
#### 安装依赖项
为了确保所有必要的包都已安装,在命令行中执行如下指令:
```bash
pip install torch matplotlib jupyter
```
#### 导入所需模块并初始化数据结构
接着,在新的 Jupyter notebook 单元格里输入以下 Python 代码片段来进行准备工作:
```python
import torch
from torchvision import datasets, transforms
import matplotlib.pyplot as plt
%matplotlib inline
# 这样可以在notebook内直接显示出图像而不需要plt.show()
train_losses = [] # 存储每轮次结束后的平均训练集上的loss值
test_losses = [] # 同理存储测试集上对应的loss值
epochs = []
```
#### 设置绘图函数
创建一个辅助性的绘图功能以便于后续调用更新图表:
```python
def plot_curves():
"""动态刷新loss曲线"""
fig, ax = plt.subplots()
ax.plot(epochs, train_losses, label='Training Loss')
ax.plot(epochs, test_losses, label='Validation Loss')
ax.set_xlabel('Epochs')
ax.set_ylabel('Loss')
ax.legend(loc="upper right")
plt.title("Training and Validation Loss Over Epochs")
plt.grid(True)
plt.tight_layout()
plt.draw()
plt.pause(0.001) # 小暂停以允许图形窗口更新
plt.close(fig)
```
#### 构建简单的神经网络模型与训练逻辑
这里构建一个简易的全连接层作为演示用途,并编写相应的训练流程控制语句:
```python
class SimpleNN(torch.nn.Module):
def __init__(self):
super(SimpleNN, self).__init__()
self.fc = torch.nn.Linear(in_features=784, out_features=10)
def forward(self, x):
return self.fc(x.view(-1, 784))
device = 'cuda' if torch.cuda.is_available() else 'cpu'
model = SimpleNN().to(device=device)
criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
transform = transforms.Compose([transforms.ToTensor(),
transforms.Normalize((0.5,), (0.5,))])
dataset_train = datasets.MNIST('./data', download=True, transform=transform, train=True)
dataloader_train = torch.utils.data.DataLoader(dataset_train, batch_size=64, shuffle=True)
for epoch in range(5): # 设定总共跑五轮epoch
running_loss = 0.0
for images, labels in dataloader_train:
optimizer.zero_grad()
outputs = model(images.to(device))
loss = criterion(outputs, labels.to(device))
loss.backward()
optimizer.step()
running_loss += loss.item()
avg_epoch_loss = running_loss / len(dataloader_train)
epochs.append(epoch + 1)
train_losses.append(avg_epoch_loss)
with torch.no_grad(): # 不计算梯度的情况下评估验证集性能
dataset_test = datasets.MNIST('./data', download=False, transform=transform, train=False)
dataloader_test = torch.utils.data.DataLoader(dataset_test, batch_size=len(dataset_test), shuffle=False)
dataiter = iter(dataloader_test)
images, labels = next(dataiter)
output = model(images.to(device))
validation_loss = criterion(output, labels.to(device)).item()
test_losses.append(validation_loss)
print(f"Epoch {epoch+1}, Training Loss: {avg_epoch_loss:.4f}, Test Loss: {validation_loss:.4f}")
plot_curves() # 调用之前定义好的绘图函数实时展现loss趋势
```
上述代码展示了如何通过 PyTorch 实现基本的 MNIST 数据分类任务的同时记录下每一 epoch 结束之后的数据表现,并借助 `matplotlib` 来实现这些信息的直观呈现[^3]。
阅读全文
相关推荐



















