python训练营打卡第45天
Tensorboard使用介绍
知识点回顾:
- tensorboard的发展历史和原理
- tensorboard的常见操作
- tensorboard在cifar上的实战:MLP和CNN模型
作业:对resnet18在cifar10上采用微调策略下,用tensorboard监控训练过程。
import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms, models
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
import matplotlib.pyplot as plt
import numpy as np
import os
import torchvision# 设置中文字体支持
plt.rcParams["font.family"] = ["SimHei"]
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题# 检查GPU是否可用
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(f"使用设备: {device}")
print(f"PyTorch 版本: {torch.__version__}") # 显示当前版本# 1. 数据预处理
train_transform = transforms.Compose([transforms.RandomCrop(32, padding=4),transforms.RandomHorizontalFlip(),transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1),transforms.RandomRotation(15),transforms.ToTensor(),transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010))
])test_transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010))
])# 2. 加载CIFAR-10数据集
train_dataset = datasets.CIFAR10(root='./data',train=True,download=True,transform=train_transform
)test_dataset = datasets.CIFAR10(root='./data',train=False,transform=test_transform
)# 3. 创建数据加载器
batch_size = 64
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)# 4. 加载预训练的ResNet18模型并调整
model = models.resnet18(pretrained=True)# 修改输入层以适应32x32图像(CIFAR10)
model.conv1 = nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1, bias=False)# 修改输出层以适应CIFAR10的10个类别
num_ftrs = model.fc.in_features
model.fc = nn.Linear(num_ftrs, 10)# 将模型移至GPU
model = model.to(device)# 定义微调策略:冻结前几层参数,只训练最后几层
def set_parameter_requires_grad(model, feature_extracting):if feature_extracting:for param in model.parameters():param.requires_grad = False# 微调策略:冻结前6个残差块,训练剩余层
ct = 0
for child in model.children():ct += 1if ct < 7: # 冻结前6个模块(包括conv1和前几个残差块)for param in child.parameters():param.requires_grad = Falsecriterion = nn.CrossEntropyLoss()# 只优化可训练的参数
params_to_update = []
for name,param in model.named_parameters():if param.requires_grad == True:params_to_update.append(param)print("\t",name)optimizer = optim.Adam(params_to_update, lr=0.001)# 移除了不兼容的verbose=True参数
scheduler = optim.lr_scheduler.ReduceLROnPlateau(optimizer, # 指定要控制的优化器mode='min', # 监测的指标是"最小化"(如损失函数)patience=3, # 如果连续3个epoch指标没有改善,才降低LRfactor=0.5 # 降低LR的比例(新LR = 旧LR × 0.5)
)# ======================== TensorBoard 核心配置 ========================
# 创建 TensorBoard 日志目录(自动避免重复)
log_dir = "runs/cifar10_resnet18_exp"
if os.path.exists(log_dir):version = 1while os.path.exists(f"{log_dir}_v{version}"):version += 1log_dir = f"{log_dir}_v{version}"
writer = SummaryWriter(log_dir) # 初始化 SummaryWriter# 5. 训练模型(整合 TensorBoard 记录)
def train(model, train_loader, test_loader, criterion, optimizer, scheduler, device, epochs, writer):model.train()all_iter_losses = [] iter_indices = [] global_step = 0 # 全局步骤,用于 TensorBoard 标量记录# 记录模型结构dataiter = iter(train_loader)images, labels = next(dataiter)images = images.to(device)writer.add_graph(model, images) # 写入模型结构到 TensorBoard# 记录原始训练图像img_grid = torchvision.utils.make_grid(images[:8].cpu()) # 取前8张writer.add_image('原始训练图像(增强前)', img_grid, global_step=0)for epoch in range(epochs):running_loss = 0.0correct = 0total = 0for batch_idx, (data, target) in enumerate(train_loader):data, target = data.to(device), target.to(device)optimizer.zero_grad()output = model(data)loss = criterion(output, target)loss.backward()optimizer.step()# 记录迭代级损失iter_loss = loss.item()all_iter_losses.append(iter_loss)iter_indices.append(global_step + 1) # 用 global_step 对齐# 统计准确率running_loss += iter_loss_, predicted = output.max(1)total += target.size(0)correct += predicted.eq(target).sum().item()# ======================== TensorBoard 标量记录 ========================# 记录每个 batch 的损失、准确率batch_acc = 100. * correct / totalwriter.add_scalar('Train/Batch Loss', iter_loss, global_step)writer.add_scalar('Train/Batch Accuracy', batch_acc, global_step)# 记录学习率writer.add_scalar('Train/Learning Rate', optimizer.param_groups[0]['lr'], global_step)# 每 200 个 batch 记录一次参数直方图if (batch_idx + 1) % 200 == 0:for name, param in model.named_parameters():if param.requires_grad: # 只记录可训练参数writer.add_histogram(f'Weights/{name}', param, global_step)if param.grad is not None:writer.add_histogram(f'Gradients/{name}', param.grad, global_step)# 每 100 个 batch 打印控制台日志if (batch_idx + 1) % 100 == 0:print(f'Epoch: {epoch+1}/{epochs} | Batch: {batch_idx+1}/{len(train_loader)} 'f'| 单Batch损失: {iter_loss:.4f} | 累计平均损失: {running_loss/(batch_idx+1):.4f}')global_step += 1 # 全局步骤递增# 计算 epoch 级训练指标epoch_train_loss = running_loss / len(train_loader)epoch_train_acc = 100. * correct / total# ======================== TensorBoard epoch 标量记录 ========================writer.add_scalar('Train/Epoch Loss', epoch_train_loss, epoch)writer.add_scalar('Train/Epoch Accuracy', epoch_train_acc, epoch)# 测试阶段model.eval()test_loss = 0correct_test = 0total_test = 0wrong_images = [] # 存储错误预测样本wrong_labels = []wrong_preds = []with torch.no_grad():for data, target in test_loader:data, target = data.to(device), target.to(device)output = model(data)test_loss += criterion(output, target).item()_, predicted = output.max(1)total_test += target.size(0)correct_test += predicted.eq(target).sum().item()# 收集错误预测样本wrong_mask = (predicted != target)if wrong_mask.sum() > 0:wrong_batch_images = data[wrong_mask][:8].cpu() # 最多存8张wrong_batch_labels = target[wrong_mask][:8].cpu()wrong_batch_preds = predicted[wrong_mask][:8].cpu()wrong_images.extend(wrong_batch_images)wrong_labels.extend(wrong_batch_labels)wrong_preds.extend(wrong_batch_preds)# 计算 epoch 级测试指标epoch_test_loss = test_loss / len(test_loader)epoch_test_acc = 100. * correct_test / total_test# ======================== TensorBoard 测试集记录 ========================writer.add_scalar('Test/Epoch Loss', epoch_test_loss, epoch)writer.add_scalar('Test/Epoch Accuracy', epoch_test_acc, epoch)# 可视化错误预测样本if wrong_images:wrong_img_grid = torchvision.utils.make_grid(wrong_images)writer.add_image('错误预测样本', wrong_img_grid, epoch)# 写入错误标签文本wrong_text = [f"真实: {classes[wl]}, 预测: {classes[wp]}" for wl, wp in zip(wrong_labels, wrong_preds)]writer.add_text('错误预测标签', '\n'.join(wrong_text), epoch)# 更新学习率调度器scheduler.step(epoch_test_loss)# 手动打印学习率调整信息(替代removed的verbose=True)if epoch > 0 and optimizer.param_groups[0]['lr'] < scheduler._last_lr[0]:print(f"Epoch {epoch+1}: 学习率已调整为 {optimizer.param_groups[0]['lr']}")print(f'Epoch {epoch+1}/{epochs} 完成 | 训练准确率: {epoch_train_acc:.2f}% | 测试准确率: {epoch_test_acc:.2f}%')# 关闭 TensorBoard 写入器writer.close()# 绘制迭代级损失曲线plot_iter_losses(all_iter_losses, iter_indices)return epoch_test_acc# 6. 绘制迭代级损失曲线
def plot_iter_losses(losses, indices):plt.figure(figsize=(10, 4))plt.plot(indices, losses, 'b-', alpha=0.7, label='Iteration Loss')plt.xlabel('Iteration(Batch序号)')plt.ylabel('损失值')plt.title('每个 Iteration 的训练损失')plt.legend()plt.grid(True)plt.tight_layout()plt.show()# CIFAR-10 类别名
classes = ('plane', 'car', 'bird', 'cat','deer', 'dog', 'frog', 'horse', 'ship', 'truck')# 7. 执行训练
epochs = 20
print("开始使用ResNet18微调模型...")
print(f"TensorBoard 日志目录: {log_dir}")
print("训练后执行: tensorboard --logdir=runs 查看可视化")final_accuracy = train(model, train_loader, test_loader, criterion, optimizer, scheduler, device, epochs, writer)
print(f"训练完成!最终测试准确率: {final_accuracy:.2f}%")
输出结果:
训练后执行: tensorboard --logdir=runs 查看可视化
Epoch: 1/20 | Batch: 100/782 | 单Batch损失: 1.5273 | 累计平均损失: 1.8482
Epoch: 1/20 | Batch: 200/782 | 单Batch损失: 1.5521 | 累计平均损失: 1.7056
Epoch: 1/20 | Batch: 300/782 | 单Batch损失: 1.3374 | 累计平均损失: 1.6197
Epoch: 1/20 | Batch: 400/782 | 单Batch损失: 1.5744 | 累计平均损失: 1.5714
Epoch: 1/20 | Batch: 500/782 | 单Batch损失: 1.2391 | 累计平均损失: 1.5277
Epoch: 1/20 | Batch: 600/782 | 单Batch损失: 1.3136 | 累计平均损失: 1.4970
Epoch: 1/20 | Batch: 700/782 | 单Batch损失: 1.1763 | 累计平均损失: 1.4723
Epoch 1/20 完成 | 训练准确率: 48.53% | 测试准确率: 61.31%
Epoch: 2/20 | Batch: 100/782 | 单Batch损失: 1.1905 | 累计平均损失: 1.4024
Epoch: 2/20 | Batch: 200/782 | 单Batch损失: 1.3657 | 累计平均损失: 1.3445
Epoch: 2/20 | Batch: 300/782 | 单Batch损失: 1.5248 | 累计平均损失: 1.3209
Epoch: 2/20 | Batch: 400/782 | 单Batch损失: 1.2220 | 累计平均损失: 1.3045
Epoch: 2/20 | Batch: 500/782 | 单Batch损失: 1.2761 | 累计平均损失: 1.2956
Epoch: 2/20 | Batch: 600/782 | 单Batch损失: 1.3226 | 累计平均损失: 1.2832
Epoch: 2/20 | Batch: 700/782 | 单Batch损失: 1.5738 | 累计平均损失: 1.2781
Epoch 2/20 完成 | 训练准确率: 55.09% | 测试准确率: 64.34%
Epoch: 3/20 | Batch: 100/782 | 单Batch损失: 1.3651 | 累计平均损失: 1.2048
Epoch: 3/20 | Batch: 200/782 | 单Batch损失: 1.3197 | 累计平均损失: 1.1932
Epoch: 3/20 | Batch: 300/782 | 单Batch损失: 1.0974 | 累计平均损失: 1.1793
Epoch: 3/20 | Batch: 400/782 | 单Batch损失: 1.2439 | 累计平均损失: 1.1688
Epoch: 3/20 | Batch: 500/782 | 单Batch损失: 0.9889 | 累计平均损失: 1.1630
Epoch: 3/20 | Batch: 600/782 | 单Batch损失: 1.5021 | 累计平均损失: 1.1599
Epoch: 3/20 | Batch: 700/782 | 单Batch损失: 1.0604 | 累计平均损失: 1.1542
Epoch 3/20 完成 | 训练准确率: 59.37% | 测试准确率: 64.96%
Epoch: 4/20 | Batch: 100/782 | 单Batch损失: 1.0087 | 累计平均损失: 1.0913
Epoch: 4/20 | Batch: 200/782 | 单Batch损失: 1.0239 | 累计平均损失: 1.1185
Epoch: 4/20 | Batch: 300/782 | 单Batch损失: 1.3694 | 累计平均损失: 1.1089
Epoch: 4/20 | Batch: 400/782 | 单Batch损失: 0.9954 | 累计平均损失: 1.1050
Epoch: 4/20 | Batch: 500/782 | 单Batch损失: 1.0406 | 累计平均损失: 1.1025
Epoch: 4/20 | Batch: 600/782 | 单Batch损失: 1.2200 | 累计平均损失: 1.1020
Epoch: 4/20 | Batch: 700/782 | 单Batch损失: 1.2437 | 累计平均损失: 1.1013
Epoch 4/20 完成 | 训练准确率: 61.67% | 测试准确率: 66.04%
Epoch: 5/20 | Batch: 100/782 | 单Batch损失: 1.0823 | 累计平均损失: 1.0574
Epoch: 5/20 | Batch: 200/782 | 单Batch损失: 0.8552 | 累计平均损失: 1.0506
Epoch: 5/20 | Batch: 300/782 | 单Batch损失: 1.1462 | 累计平均损失: 1.0534
Epoch: 5/20 | Batch: 400/782 | 单Batch损失: 0.9548 | 累计平均损失: 1.0564
Epoch: 5/20 | Batch: 500/782 | 单Batch损失: 1.1172 | 累计平均损失: 1.0545
Epoch: 5/20 | Batch: 600/782 | 单Batch损失: 1.2644 | 累计平均损失: 1.0501
Epoch: 5/20 | Batch: 700/782 | 单Batch损失: 0.9536 | 累计平均损失: 1.0513
Epoch 5/20 完成 | 训练准确率: 63.48% | 测试准确率: 69.61%
Epoch: 6/20 | Batch: 100/782 | 单Batch损失: 1.1799 | 累计平均损失: 1.0199
Epoch: 6/20 | Batch: 200/782 | 单Batch损失: 0.8240 | 累计平均损失: 1.0157
Epoch: 6/20 | Batch: 300/782 | 单Batch损失: 1.1263 | 累计平均损失: 1.0175
Epoch: 6/20 | Batch: 400/782 | 单Batch损失: 0.8769 | 累计平均损失: 1.0144
Epoch: 6/20 | Batch: 500/782 | 单Batch损失: 0.9787 | 累计平均损失: 1.0116
Epoch: 6/20 | Batch: 600/782 | 单Batch损失: 0.9057 | 累计平均损失: 1.0075
Epoch: 6/20 | Batch: 700/782 | 单Batch损失: 1.1029 | 累计平均损失: 1.0093
Epoch 6/20 完成 | 训练准确率: 64.78% | 测试准确率: 70.02%
Epoch: 7/20 | Batch: 100/782 | 单Batch损失: 1.1526 | 累计平均损失: 0.9748
Epoch: 7/20 | Batch: 200/782 | 单Batch损失: 0.8077 | 累计平均损失: 0.9789
Epoch: 7/20 | Batch: 300/782 | 单Batch损失: 0.7667 | 累计平均损失: 0.9766
Epoch: 7/20 | Batch: 400/782 | 单Batch损失: 1.0059 | 累计平均损失: 0.9796
Epoch: 7/20 | Batch: 500/782 | 单Batch损失: 1.0920 | 累计平均损失: 0.9767
Epoch: 7/20 | Batch: 600/782 | 单Batch损失: 0.8521 | 累计平均损失: 0.9731
Epoch: 7/20 | Batch: 700/782 | 单Batch损失: 1.0012 | 累计平均损失: 0.9751
Epoch 7/20 完成 | 训练准确率: 65.79% | 测试准确率: 70.31%
Epoch: 8/20 | Batch: 100/782 | 单Batch损失: 0.7049 | 累计平均损失: 0.9371
Epoch: 8/20 | Batch: 200/782 | 单Batch损失: 0.7750 | 累计平均损失: 0.9475
Epoch: 8/20 | Batch: 300/782 | 单Batch损失: 0.8749 | 累计平均损失: 0.9530
Epoch: 8/20 | Batch: 400/782 | 单Batch损失: 0.8815 | 累计平均损失: 0.9533
Epoch: 8/20 | Batch: 500/782 | 单Batch损失: 0.9093 | 累计平均损失: 0.9487
Epoch: 8/20 | Batch: 600/782 | 单Batch损失: 0.9733 | 累计平均损失: 0.9491
Epoch: 8/20 | Batch: 700/782 | 单Batch损失: 1.0732 | 累计平均损失: 0.9466
Epoch 8/20 完成 | 训练准确率: 67.26% | 测试准确率: 70.96%
Epoch: 9/20 | Batch: 100/782 | 单Batch损失: 0.5311 | 累计平均损失: 0.9165
Epoch: 9/20 | Batch: 200/782 | 单Batch损失: 1.1011 | 累计平均损失: 0.9272
Epoch: 9/20 | Batch: 300/782 | 单Batch损失: 0.9272 | 累计平均损失: 0.9245
Epoch: 9/20 | Batch: 400/782 | 单Batch损失: 1.0855 | 累计平均损失: 0.9233
Epoch: 9/20 | Batch: 500/782 | 单Batch损失: 0.8804 | 累计平均损失: 0.9246
Epoch: 9/20 | Batch: 600/782 | 单Batch损失: 0.9510 | 累计平均损失: 0.9243
Epoch: 9/20 | Batch: 700/782 | 单Batch损失: 0.9464 | 累计平均损失: 0.9251
Epoch 9/20 完成 | 训练准确率: 67.80% | 测试准确率: 72.20%
Epoch: 10/20 | Batch: 100/782 | 单Batch损失: 1.0075 | 累计平均损失: 0.9161
Epoch: 10/20 | Batch: 200/782 | 单Batch损失: 0.8690 | 累计平均损失: 0.9057
Epoch: 10/20 | Batch: 300/782 | 单Batch损失: 0.7336 | 累计平均损失: 0.8978
Epoch: 10/20 | Batch: 400/782 | 单Batch损失: 0.6905 | 累计平均损失: 0.8929
Epoch: 10/20 | Batch: 500/782 | 单Batch损失: 1.1268 | 累计平均损失: 0.8934
Epoch: 10/20 | Batch: 600/782 | 单Batch损失: 0.9531 | 累计平均损失: 0.8951
Epoch: 10/20 | Batch: 700/782 | 单Batch损失: 0.7184 | 累计平均损失: 0.8939
Epoch 10/20 完成 | 训练准确率: 69.12% | 测试准确率: 70.83%
Epoch: 11/20 | Batch: 100/782 | 单Batch损失: 0.7671 | 累计平均损失: 0.8724
Epoch: 11/20 | Batch: 200/782 | 单Batch损失: 0.6684 | 累计平均损失: 0.8593
Epoch: 11/20 | Batch: 300/782 | 单Batch损失: 0.9038 | 累计平均损失: 0.8630
Epoch: 11/20 | Batch: 400/782 | 单Batch损失: 0.7205 | 累计平均损失: 0.8688
Epoch: 11/20 | Batch: 500/782 | 单Batch损失: 0.7385 | 累计平均损失: 0.8694
Epoch: 11/20 | Batch: 600/782 | 单Batch损失: 0.7578 | 累计平均损失: 0.8711
Epoch: 11/20 | Batch: 700/782 | 单Batch损失: 0.8979 | 累计平均损失: 0.8754
Epoch 11/20 完成 | 训练准确率: 69.50% | 测试准确率: 72.75%
Epoch: 12/20 | Batch: 100/782 | 单Batch损失: 1.0989 | 累计平均损失: 0.8552
Epoch: 12/20 | Batch: 200/782 | 单Batch损失: 0.9176 | 累计平均损失: 0.8531
Epoch: 12/20 | Batch: 300/782 | 单Batch损失: 0.9829 | 累计平均损失: 0.8531
Epoch: 12/20 | Batch: 400/782 | 单Batch损失: 0.7907 | 累计平均损失: 0.8570
Epoch: 12/20 | Batch: 500/782 | 单Batch损失: 0.7774 | 累计平均损失: 0.8565
Epoch: 12/20 | Batch: 600/782 | 单Batch损失: 0.7594 | 累计平均损失: 0.8519
Epoch: 12/20 | Batch: 700/782 | 单Batch损失: 0.8284 | 累计平均损失: 0.8531
Epoch 12/20 完成 | 训练准确率: 70.17% | 测试准确率: 72.87%
Epoch: 13/20 | Batch: 100/782 | 单Batch损失: 0.7691 | 累计平均损失: 0.8254
Epoch: 13/20 | Batch: 200/782 | 单Batch损失: 0.7900 | 累计平均损失: 0.8255
Epoch: 13/20 | Batch: 300/782 | 单Batch损失: 0.8768 | 累计平均损失: 0.8281
Epoch: 13/20 | Batch: 400/782 | 单Batch损失: 0.7560 | 累计平均损失: 0.8303
Epoch: 13/20 | Batch: 500/782 | 单Batch损失: 0.7536 | 累计平均损失: 0.8326
Epoch: 13/20 | Batch: 600/782 | 单Batch损失: 1.1361 | 累计平均损失: 0.8357
Epoch: 13/20 | Batch: 700/782 | 单Batch损失: 0.6587 | 累计平均损失: 0.8358
Epoch 13/20 完成 | 训练准确率: 70.92% | 测试准确率: 73.77%
Epoch: 14/20 | Batch: 100/782 | 单Batch损失: 0.8631 | 累计平均损失: 0.8003
Epoch: 14/20 | Batch: 200/782 | 单Batch损失: 1.1389 | 累计平均损失: 0.8022
Epoch: 14/20 | Batch: 300/782 | 单Batch损失: 0.6357 | 累计平均损失: 0.8112
Epoch: 14/20 | Batch: 400/782 | 单Batch损失: 0.9566 | 累计平均损失: 0.8144
Epoch: 14/20 | Batch: 500/782 | 单Batch损失: 0.7179 | 累计平均损失: 0.8208
Epoch: 14/20 | Batch: 600/782 | 单Batch损失: 0.8866 | 累计平均损失: 0.8222
Epoch: 14/20 | Batch: 700/782 | 单Batch损失: 1.0611 | 累计平均损失: 0.8180
Epoch 14/20 完成 | 训练准确率: 71.32% | 测试准确率: 73.84%
Epoch: 15/20 | Batch: 100/782 | 单Batch损失: 0.6670 | 累计平均损失: 0.7838
Epoch: 15/20 | Batch: 200/782 | 单Batch损失: 0.8154 | 累计平均损失: 0.8015
Epoch: 15/20 | Batch: 300/782 | 单Batch损失: 0.7129 | 累计平均损失: 0.8000
Epoch: 15/20 | Batch: 400/782 | 单Batch损失: 0.6947 | 累计平均损失: 0.7997
Epoch: 15/20 | Batch: 500/782 | 单Batch损失: 0.7580 | 累计平均损失: 0.8012
Epoch: 15/20 | Batch: 600/782 | 单Batch损失: 0.7960 | 累计平均损失: 0.8018
Epoch: 15/20 | Batch: 700/782 | 单Batch损失: 0.7867 | 累计平均损失: 0.8015
Epoch 15/20 完成 | 训练准确率: 71.78% | 测试准确率: 74.05%
Epoch: 16/20 | Batch: 100/782 | 单Batch损失: 0.8675 | 累计平均损失: 0.8039
Epoch: 16/20 | Batch: 200/782 | 单Batch损失: 0.7259 | 累计平均损失: 0.7924
Epoch: 16/20 | Batch: 300/782 | 单Batch损失: 0.7472 | 累计平均损失: 0.7974
Epoch: 16/20 | Batch: 400/782 | 单Batch损失: 0.8491 | 累计平均损失: 0.7979
Epoch: 16/20 | Batch: 500/782 | 单Batch损失: 0.9948 | 累计平均损失: 0.7941
Epoch: 16/20 | Batch: 600/782 | 单Batch损失: 0.8011 | 累计平均损失: 0.7967
Epoch: 16/20 | Batch: 700/782 | 单Batch损失: 0.8423 | 累计平均损失: 0.7969
Epoch 16/20 完成 | 训练准确率: 71.99% | 测试准确率: 74.51%
Epoch: 17/20 | Batch: 100/782 | 单Batch损失: 0.6872 | 累计平均损失: 0.7696
Epoch: 17/20 | Batch: 200/782 | 单Batch损失: 0.7836 | 累计平均损失: 0.7739
Epoch: 17/20 | Batch: 300/782 | 单Batch损失: 0.7726 | 累计平均损失: 0.7785
Epoch: 17/20 | Batch: 400/782 | 单Batch损失: 0.9438 | 累计平均损失: 0.7781
Epoch: 17/20 | Batch: 500/782 | 单Batch损失: 0.9131 | 累计平均损失: 0.7778
Epoch: 17/20 | Batch: 600/782 | 单Batch损失: 0.6862 | 累计平均损失: 0.7785
Epoch: 17/20 | Batch: 700/782 | 单Batch损失: 0.8799 | 累计平均损失: 0.7813
Epoch 17/20 完成 | 训练准确率: 72.43% | 测试准确率: 74.82%
Epoch: 18/20 | Batch: 100/782 | 单Batch损失: 0.9158 | 累计平均损失: 0.7475
Epoch: 18/20 | Batch: 200/782 | 单Batch损失: 0.8225 | 累计平均损失: 0.7608
Epoch: 18/20 | Batch: 300/782 | 单Batch损失: 0.8558 | 累计平均损失: 0.7666
Epoch: 18/20 | Batch: 400/782 | 单Batch损失: 0.8414 | 累计平均损失: 0.7734
Epoch: 18/20 | Batch: 500/782 | 单Batch损失: 0.7078 | 累计平均损失: 0.7709
Epoch: 18/20 | Batch: 600/782 | 单Batch损失: 0.5290 | 累计平均损失: 0.7727
Epoch: 18/20 | Batch: 700/782 | 单Batch损失: 0.9894 | 累计平均损失: 0.7702
Epoch 18/20 完成 | 训练准确率: 72.90% | 测试准确率: 74.99%
Epoch: 19/20 | Batch: 100/782 | 单Batch损失: 0.7013 | 累计平均损失: 0.7519
Epoch: 19/20 | Batch: 200/782 | 单Batch损失: 0.9212 | 累计平均损失: 0.7599
Epoch: 19/20 | Batch: 300/782 | 单Batch损失: 0.7322 | 累计平均损失: 0.7602
Epoch: 19/20 | Batch: 400/782 | 单Batch损失: 0.7286 | 累计平均损失: 0.7647
Epoch: 19/20 | Batch: 500/782 | 单Batch损失: 0.9181 | 累计平均损失: 0.7677
Epoch: 19/20 | Batch: 600/782 | 单Batch损失: 0.8900 | 累计平均损失: 0.7636
Epoch: 19/20 | Batch: 700/782 | 单Batch损失: 0.8421 | 累计平均损失: 0.7655
Epoch 19/20 完成 | 训练准确率: 73.36% | 测试准确率: 74.75%
Epoch: 20/20 | Batch: 100/782 | 单Batch损失: 0.7313 | 累计平均损失: 0.7482
Epoch: 20/20 | Batch: 200/782 | 单Batch损失: 0.7285 | 累计平均损失: 0.7499
Epoch: 20/20 | Batch: 300/782 | 单Batch损失: 0.9477 | 累计平均损失: 0.7540
Epoch: 20/20 | Batch: 400/782 | 单Batch损失: 0.5992 | 累计平均损失: 0.7538
Epoch: 20/20 | Batch: 500/782 | 单Batch损失: 0.8005 | 累计平均损失: 0.7551
Epoch: 20/20 | Batch: 600/782 | 单Batch损失: 0.5603 | 累计平均损失: 0.7556
Epoch: 20/20 | Batch: 700/782 | 单Batch损失: 0.8872 | 累计平均损失: 0.7566
Epoch 20/20 完成 | 训练准确率: 73.65% | 测试准确率: 74.97%
训练完成!最终测试准确率: 74.97%
@浙大疏锦行