results_loss.append(sum(losss) / len(losss)) torch.save(model.state_dict(), 'save_model.pth') time.sleep(0.1) # valid_loss = valid(model, args, scaler, valid_loader) # 尚未引入学习率计划后期补上 # 保存模型 print(f">>>>>>>>>>>>>>>>>>>>>>模型已保存,用时:{(time.time() - start_time) / 60:.4f} min<<<<<<<<<<<<<<<<<<")
时间: 2025-05-08 19:21:08 浏览: 22
### 如何在 PyTorch 中正确保存模型并记录训练过程中的损失值
#### 模型保存方法
在 PyTorch 中,可以通过 `torch.save()` 方法来保存模型的状态字典(state_dict)。状态字典包含了模型的权重和其他可学习参数的信息。以下是推荐的两种保存方式:
1. **仅保存模型的状态字典**
这种方式适用于需要重新加载模型进行微调或继续训练的情况。
```python
torch.save(model.state_dict(), 'model.pth')
```
2. **保存整个模型对象**
如果希望直接加载模型而不需定义模型结构,则可以保存整个模型对象。
```python
torch.save(model, 'full_model.pth')
```
需要注意的是,通常建议优先使用第一种方法,因为它更加灵活且占用更少的空间[^4]。
#### 加载已保存的模型
对于上述两种保存方式,对应的加载方法如下:
- 使用状态字典的方式加载模型:
```python
model = TheModelClass(*args, **kwargs) # 初始化相同的模型架构
model.load_state_dict(torch.load('model.pth'))
model.eval()
```
- 使用完整模型对象的方式加载:
```python
model = torch.load('full_model.pth')
model.eval()
```
#### 记录训练过程中的损失值
为了记录训练过程中每一轮(epoch)的损失值以及其他指标(如准确率),可以创建一个文件并将这些数据写入其中。以下是一个简单的实现示例:
```python
with open('training_log.txt', 'w') as f:
for epoch in range(num_epochs):
running_loss = 0.0
correct_predictions = 0
total_samples = 0
for inputs, labels in train_loader:
outputs = model(inputs)
loss = criterion(outputs, labels)
optimizer.zero_grad()
loss.backward()
optimizer.step()
running_loss += loss.item()
_, predicted = torch.max(outputs.data, 1)
total_samples += labels.size(0)
correct_predictions += (predicted == labels).sum().item()
avg_loss = running_loss / len(train_loader)
accuracy = 100 * correct_predictions / total_samples
log_message = f'Epoch [{epoch+1}/{num_epochs}], Loss: {avg_loss:.4f}, Accuracy: {accuracy:.2f}%\n'
f.write(log_message)
print("Training logs have been saved to training_log.txt.")
```
此代码片段会将每次迭代后的平均损失和准确率存储到名为 `training_log.txt` 的文件中[^1]。
#### 可视化工具的应用
除了手动记录外,还可以利用 TensorBoard 或 Weights & Biases (WandB) 等工具来进行实时监控和可视化。例如,在训练循环中加入以下代码即可通过 TensorBoard 查看损失变化趋势:
```python
from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter('runs/experiment_1')
for epoch in range(num_epochs):
...
writer.add_scalar('Loss/train', avg_loss, epoch)
writer.add_scalar('Accuracy/train', accuracy, epoch)
writer.close()
```
这使得分析训练动态变得更加直观[^2]。
---
阅读全文
相关推荐
















