python训练营打卡第47天
注意力热图可视化
昨天代码中注意力热图的部分顺移至今天
知识点回顾:
热力图
作业:对比不同卷积层热图可视化的结果
import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
import matplotlib.pyplot as plt
import numpy as np# 设置中文字体支持
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}")# 1. 数据预处理
# 训练集:使用多种数据增强方法提高模型泛化能力
train_transform = transforms.Compose([# 随机裁剪图像,从原图中随机截取32x32大小的区域transforms.RandomCrop(32, padding=4),# 随机水平翻转图像(概率0.5)transforms.RandomHorizontalFlip(),# 随机颜色抖动:亮度、对比度、饱和度和色调随机变化transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1),# 随机旋转图像(最大角度15度)transforms.RandomRotation(15),# 将PIL图像或numpy数组转换为张量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 # 测试集不使用增强
)# ---------------------- 新增:定义类别名称 ----------------------
class_names = ['飞机', '汽车', '鸟', '猫', '鹿','狗', '青蛙', '马', '船', '卡车'
]# 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. 定义CNN模型的定义(替代原MLP)
class CNN(nn.Module):def __init__(self):super(CNN, self).__init__() # 继承父类初始化# ---------------------- 第一个卷积块 ----------------------# 卷积层1:输入3通道(RGB),输出32个特征图,卷积核3x3,边缘填充1像素self.conv1 = nn.Conv2d(in_channels=3, # 输入通道数(图像的RGB通道)out_channels=32, # 输出通道数(生成32个新特征图)kernel_size=3, # 卷积核尺寸(3x3像素)padding=1 # 边缘填充1像素,保持输出尺寸与输入相同)# 批量归一化层:对32个输出通道进行归一化,加速训练self.bn1 = nn.BatchNorm2d(num_features=32)# ReLU激活函数:引入非线性,公式:max(0, x)self.relu1 = nn.ReLU()# 最大池化层:窗口2x2,步长2,特征图尺寸减半(32x32→16x16)self.pool1 = nn.MaxPool2d(kernel_size=2, stride=2) # stride默认等于kernel_size# ---------------------- 第二个卷积块 ----------------------# 卷积层2:输入32通道(来自conv1的输出),输出64通道self.conv2 = nn.Conv2d(in_channels=32, # 输入通道数(前一层的输出通道数)out_channels=64, # 输出通道数(特征图数量翻倍)kernel_size=3, # 卷积核尺寸不变padding=1 # 保持尺寸:16x16→16x16(卷积后)→8x8(池化后))self.bn2 = nn.BatchNorm2d(num_features=64)self.relu2 = nn.ReLU()self.pool2 = nn.MaxPool2d(kernel_size=2) # 尺寸减半:16x16→8x8# ---------------------- 第三个卷积块 ----------------------# 卷积层3:输入64通道,输出128通道self.conv3 = nn.Conv2d(in_channels=64, # 输入通道数(前一层的输出通道数)out_channels=128, # 输出通道数(特征图数量再次翻倍)kernel_size=3,padding=1 # 保持尺寸:8x8→8x8(卷积后)→4x4(池化后))self.bn3 = nn.BatchNorm2d(num_features=128)self.relu3 = nn.ReLU() # 复用激活函数对象(节省内存)self.pool3 = nn.MaxPool2d(kernel_size=2) # 尺寸减半:8x8→4x4# ---------------------- 全连接层(分类器) ----------------------# 计算展平后的特征维度:128通道 × 4x4尺寸 = 128×16=2048维self.fc1 = nn.Linear(in_features=128 * 4 * 4, # 输入维度(卷积层输出的特征数)out_features=512 # 输出维度(隐藏层神经元数))# Dropout层:训练时随机丢弃50%神经元,防止过拟合self.dropout = nn.Dropout(p=0.5)# 输出层:将512维特征映射到10个类别(CIFAR-10的类别数)self.fc2 = nn.Linear(in_features=512, out_features=10)def forward(self, x):# 输入尺寸:[batch_size, 3, 32, 32](batch_size=批量大小,3=通道数,32x32=图像尺寸)# ---------- 卷积块1处理 ----------x = self.conv1(x) # 卷积后尺寸:[batch_size, 32, 32, 32](padding=1保持尺寸)x = self.bn1(x) # 批量归一化,不改变尺寸x = self.relu1(x) # 激活函数,不改变尺寸x = self.pool1(x) # 池化后尺寸:[batch_size, 32, 16, 16](32→16是因为池化窗口2x2)# ---------- 卷积块2处理 ----------x = self.conv2(x) # 卷积后尺寸:[batch_size, 64, 16, 16](padding=1保持尺寸)x = self.bn2(x)x = self.relu2(x)x = self.pool2(x) # 池化后尺寸:[batch_size, 64, 8, 8]# ---------- 卷积块3处理 ----------x = self.conv3(x) # 卷积后尺寸:[batch_size, 128, 8, 8](padding=1保持尺寸)x = self.bn3(x)x = self.relu3(x)x = self.pool3(x) # 池化后尺寸:[batch_size, 128, 4, 4]# ---------- 展平与全连接层 ----------# 将多维特征图展平为一维向量:[batch_size, 128*4*4] = [batch_size, 2048]x = x.view(-1, 128 * 4 * 4) # -1自动计算批量维度,保持批量大小不变x = self.fc1(x) # 全连接层:2048→512,尺寸变为[batch_size, 512]x = self.relu3(x) # 激活函数(复用relu3,与卷积块3共用)x = self.dropout(x) # Dropout随机丢弃神经元,不改变尺寸x = self.fc2(x) # 全连接层:512→10,尺寸变为[batch_size, 10](未激活,直接输出logits)return x # 输出未经过Softmax的logits,适用于交叉熵损失函数# ===================== 新增:通道注意力模块(SE模块) =====================
class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_ratio=16):"""参数:in_channels: 输入特征图的通道数reduction_ratio: 降维比例,用于减少参数量"""super(ChannelAttention, self).__init__()# 全局平均池化 - 将空间维度压缩为1x1,保留通道信息self.avg_pool = nn.AdaptiveAvgPool2d(1)# 全连接层 + 激活函数,用于学习通道间的依赖关系self.fc = nn.Sequential(# 降维:压缩通道数,减少计算量nn.Linear(in_channels, in_channels // reduction_ratio, bias=False),nn.ReLU(inplace=True),# 升维:恢复原始通道数nn.Linear(in_channels // reduction_ratio, in_channels, bias=False),# Sigmoid将输出值归一化到[0,1],表示通道重要性权重nn.Sigmoid())def forward(self, x):"""参数:x: 输入特征图,形状为 [batch_size, channels, height, width]返回:加权后的特征图,形状不变"""batch_size, channels, height, width = x.size()# 1. 全局平均池化:[batch_size, channels, height, width] → [batch_size, channels, 1, 1]avg_pool_output = self.avg_pool(x)# 2. 展平为一维向量:[batch_size, channels, 1, 1] → [batch_size, channels]avg_pool_output = avg_pool_output.view(batch_size, channels)# 3. 通过全连接层学习通道权重:[batch_size, channels] → [batch_size, channels]channel_weights = self.fc(avg_pool_output)# 4. 重塑为二维张量:[batch_size, channels] → [batch_size, channels, 1, 1]channel_weights = channel_weights.view(batch_size, channels, 1, 1)# 5. 将权重应用到原始特征图上(逐通道相乘)return x * channel_weights # 输出形状:[batch_size, channels, height, width]class CNN(nn.Module):def __init__(self):super(CNN, self).__init__() # ---------------------- 第一个卷积块 ----------------------self.conv1 = nn.Conv2d(3, 32, 3, padding=1)self.bn1 = nn.BatchNorm2d(32)self.relu1 = nn.ReLU()# 新增:插入通道注意力模块(SE模块)self.ca1 = ChannelAttention(in_channels=32, reduction_ratio=16) self.pool1 = nn.MaxPool2d(2, 2) # ---------------------- 第二个卷积块 ----------------------self.conv2 = nn.Conv2d(32, 64, 3, padding=1)self.bn2 = nn.BatchNorm2d(64)self.relu2 = nn.ReLU()# 新增:插入通道注意力模块(SE模块)self.ca2 = ChannelAttention(in_channels=64, reduction_ratio=16) self.pool2 = nn.MaxPool2d(2) # ---------------------- 第三个卷积块 ----------------------self.conv3 = nn.Conv2d(64, 128, 3, padding=1)self.bn3 = nn.BatchNorm2d(128)self.relu3 = nn.ReLU()# 新增:插入通道注意力模块(SE模块)self.ca3 = ChannelAttention(in_channels=128, reduction_ratio=16) self.pool3 = nn.MaxPool2d(2) # ---------------------- 全连接层(分类器) ----------------------self.fc1 = nn.Linear(128 * 4 * 4, 512)self.dropout = nn.Dropout(p=0.5)self.fc2 = nn.Linear(512, 10)def forward(self, x):# ---------- 卷积块1处理 ----------x = self.conv1(x) x = self.bn1(x) x = self.relu1(x) x = self.ca1(x) # 应用通道注意力x = self.pool1(x) # ---------- 卷积块2处理 ----------x = self.conv2(x) x = self.bn2(x) x = self.relu2(x) x = self.ca2(x) # 应用通道注意力x = self.pool2(x) # ---------- 卷积块3处理 ----------x = self.conv3(x) x = self.bn3(x) x = self.relu3(x) x = self.ca3(x) # 应用通道注意力x = self.pool3(x) # ---------- 展平与全连接层 ----------x = x.view(-1, 128 * 4 * 4) x = self.fc1(x) x = self.relu3(x) x = self.dropout(x) x = self.fc2(x) return x # 重新初始化模型,包含通道注意力模块
model = CNN()
model = model.to(device) # 将模型移至GPU(如果可用)criterion = nn.CrossEntropyLoss() # 交叉熵损失函数
optimizer = optim.Adam(model.parameters(), lr=0.001) # Adam优化器# 引入学习率调度器,在训练过程中动态调整学习率--训练初期使用较大的 LR 快速降低损失,训练后期使用较小的 LR 更精细地逼近全局最优解。
# 在每个 epoch 结束后,需要手动调用调度器来更新学习率,可以在训练过程中调用 scheduler.step()
scheduler = optim.lr_scheduler.ReduceLROnPlateau(optimizer, # 指定要控制的优化器(这里是Adam)mode='min', # 监测的指标是"最小化"(如损失函数)patience=3, # 如果连续3个epoch指标没有改善,才降低LRfactor=0.5 # 降低LR的比例(新LR = 旧LR × 0.5)
)# 5. 训练模型(记录每个 iteration 的损失)
def train(model, train_loader, test_loader, criterion, optimizer, scheduler, device, epochs):model.train() # 设置为训练模式# 记录每个 iteration 的损失all_iter_losses = [] # 存储所有 batch 的损失iter_indices = [] # 存储 iteration 序号# 记录每个 epoch 的准确率和损失train_acc_history = []test_acc_history = []train_loss_history = []test_loss_history = []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) # 移至GPUoptimizer.zero_grad() # 梯度清零output = model(data) # 前向传播loss = criterion(output, target) # 计算损失loss.backward() # 反向传播optimizer.step() # 更新参数# 记录当前 iteration 的损失iter_loss = loss.item()all_iter_losses.append(iter_loss)iter_indices.append(epoch * len(train_loader) + batch_idx + 1)# 统计准确率和损失running_loss += iter_loss_, predicted = output.max(1)total += target.size(0)correct += predicted.eq(target).sum().item()# 每100个批次打印一次训练信息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}')# 计算当前epoch的平均训练损失和准确率epoch_train_loss = running_loss / len(train_loader)epoch_train_acc = 100. * correct / totaltrain_acc_history.append(epoch_train_acc)train_loss_history.append(epoch_train_loss)# 测试阶段model.eval() # 设置为评估模式test_loss = 0correct_test = 0total_test = 0with 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()epoch_test_loss = test_loss / len(test_loader)epoch_test_acc = 100. * correct_test / total_testtest_acc_history.append(epoch_test_acc)test_loss_history.append(epoch_test_loss)# 更新学习率调度器scheduler.step(epoch_test_loss)print(f'Epoch {epoch+1}/{epochs} 完成 | 训练准确率: {epoch_train_acc:.2f}% | 测试准确率: {epoch_test_acc:.2f}%')# 绘制所有 iteration 的损失曲线plot_iter_losses(all_iter_losses, iter_indices)# 绘制每个 epoch 的准确率和损失曲线plot_epoch_metrics(train_acc_history, test_acc_history, train_loss_history, test_loss_history)return epoch_test_acc # 返回最终测试准确率# 6. 绘制每个 iteration 的损失曲线
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()# 7. 绘制每个 epoch 的准确率和损失曲线
def plot_epoch_metrics(train_acc, test_acc, train_loss, test_loss):epochs = range(1, len(train_acc) + 1)plt.figure(figsize=(12, 4))# 绘制准确率曲线plt.subplot(1, 2, 1)plt.plot(epochs, train_acc, 'b-', label='训练准确率')plt.plot(epochs, test_acc, 'r-', label='测试准确率')plt.xlabel('Epoch')plt.ylabel('准确率 (%)')plt.title('训练和测试准确率')plt.legend()plt.grid(True)# 绘制损失曲线plt.subplot(1, 2, 2)plt.plot(epochs, train_loss, 'b-', label='训练损失')plt.plot(epochs, test_loss, 'r-', label='测试损失')plt.xlabel('Epoch')plt.ylabel('损失值')plt.title('训练和测试损失')plt.legend()plt.grid(True)plt.tight_layout()plt.show()# 8. 执行训练和测试
epochs = 50 # 增加训练轮次为了确保收敛
print("开始使用CNN训练模型...")
final_accuracy = train(model, train_loader, test_loader, criterion, optimizer, scheduler, device, epochs)
print(f"训练完成!最终测试准确率: {final_accuracy:.2f}%")# # 保存模型
# torch.save(model.state_dict(), 'cifar10_cnn_model.pth')
# print("模型已保存为: cifar10_cnn_model.pth")# 可视化空间注意力热力图(显示模型关注的图像区域)
def visualize_attention_map(model, test_loader, device, class_names, num_samples=3):"""可视化模型的注意力热力图,展示模型关注的图像区域"""model.eval() # 设置为评估模式with torch.no_grad():for i, (images, labels) in enumerate(test_loader):if i >= num_samples: # 只可视化前几个样本breakimages, labels = images.to(device), labels.to(device)# 创建一个钩子,捕获中间特征图activation_maps = []def hook(module, input, output):activation_maps.append(output.cpu())# 为最后一个卷积层注册钩子(获取特征图)hook_handle = model.conv3.register_forward_hook(hook)# 前向传播,触发钩子outputs = model(images)# 移除钩子hook_handle.remove()# 获取预测结果_, predicted = torch.max(outputs, 1)# 获取原始图像img = images[0].cpu().permute(1, 2, 0).numpy()# 反标准化处理img = img * np.array([0.2023, 0.1994, 0.2010]).reshape(1, 1, 3) + np.array([0.4914, 0.4822, 0.4465]).reshape(1, 1, 3)img = np.clip(img, 0, 1)# 获取激活图(最后一个卷积层的输出)feature_map = activation_maps[0][0].cpu() # 取第一个样本# 计算通道注意力权重(使用SE模块的全局平均池化)channel_weights = torch.mean(feature_map, dim=(1, 2)) # [C]# 按权重对通道排序sorted_indices = torch.argsort(channel_weights, descending=True)# 创建子图fig, axes = plt.subplots(1, 4, figsize=(16, 4))# 显示原始图像axes[0].imshow(img)axes[0].set_title(f'原始图像\n真实: {class_names[labels[0]]}\n预测: {class_names[predicted[0]]}')axes[0].axis('off')# 显示前3个最活跃通道的热力图for j in range(3):channel_idx = sorted_indices[j]# 获取对应通道的特征图channel_map = feature_map[channel_idx].numpy()# 归一化到[0,1]channel_map = (channel_map - channel_map.min()) / (channel_map.max() - channel_map.min() + 1e-8)# 调整热力图大小以匹配原始图像from scipy.ndimage import zoomheatmap = zoom(channel_map, (32/feature_map.shape[1], 32/feature_map.shape[2]))# 显示热力图axes[j+1].imshow(img)axes[j+1].imshow(heatmap, alpha=0.5, cmap='jet')axes[j+1].set_title(f'注意力热力图 - 通道 {channel_idx}')axes[j+1].axis('off')plt.tight_layout()plt.show()# 调用可视化函数
visualize_attention_map(model, test_loader, device, class_names, num_samples=3)
输出结果:
使用设备: cpu
开始使用CNN训练模型...
Epoch: 1/50 | Batch: 100/782 | 单Batch损失: 1.7322 | 累计平均损失: 2.0719
Epoch: 1/50 | Batch: 200/782 | 单Batch损失: 1.6426 | 累计平均损失: 1.9310
Epoch: 1/50 | Batch: 300/782 | 单Batch损失: 1.7404 | 累计平均损失: 1.8601
Epoch: 1/50 | Batch: 400/782 | 单Batch损失: 1.5785 | 累计平均损失: 1.8092
Epoch: 1/50 | Batch: 500/782 | 单Batch损失: 1.3831 | 累计平均损失: 1.7645
Epoch: 1/50 | Batch: 600/782 | 单Batch损失: 1.5784 | 累计平均损失: 1.7336
Epoch: 1/50 | Batch: 700/782 | 单Batch损失: 1.5027 | 累计平均损失: 1.7028
Epoch 1/50 完成 | 训练准确率: 38.04% | 测试准确率: 52.21%
Epoch: 2/50 | Batch: 100/782 | 单Batch损失: 1.4420 | 累计平均损失: 1.4334
Epoch: 2/50 | Batch: 200/782 | 单Batch损失: 1.4407 | 累计平均损失: 1.3831
PS E:\shucai\py> ^C
PS E:\shucai\py>
PS E:\shucai\py> e:; cd 'e:\shucai\py'; & 'e:\anaconda\python.exe' 'c:\Users\Administrator\.vscode\extensions\ms-python.debugpy-2025.8.0-win32-x64\bundled\libs\debugpy\launcher' '63382' '--' 'E:\shucai\py\6.7\day47_2'
使用设备: cpu
开始使用CNN训练模型...
Epoch: 1/50 | Batch: 100/782 | 单Batch损失: 1.6177 | 累计平均损失: 1.9574
Epoch: 1/50 | Batch: 200/782 | 单Batch损失: 1.6958 | 累计平均损失: 1.8440
Epoch: 1/50 | Batch: 300/782 | 单Batch损失: 1.5517 | 累计平均损失: 1.7837
Epoch: 1/50 | Batch: 400/782 | 单Batch损失: 1.3691 | 累计平均损失: 1.7368
Epoch: 1/50 | Batch: 500/782 | 单Batch损失: 1.4501 | 累计平均损失: 1.6980
Epoch: 1/50 | Batch: 600/782 | 单Batch损失: 1.4234 | 累计平均损失: 1.6646
Epoch: 1/50 | Batch: 700/782 | 单Batch损失: 1.4926 | 累计平均损失: 1.6325
Epoch 1/50 完成 | 训练准确率: 40.76% | 测试准确率: 52.96%
Epoch: 2/50 | Batch: 100/782 | 单Batch损失: 1.2472 | 累计平均损失: 1.3965
Epoch: 2/50 | Batch: 200/782 | 单Batch损失: 1.3147 | 累计平均损失: 1.3429
Epoch: 2/50 | Batch: 300/782 | 单Batch损失: 1.3397 | 累计平均损失: 1.3221
Epoch: 2/50 | Batch: 400/782 | 单Batch损失: 1.4848 | 累计平均损失: 1.3044
Epoch: 2/50 | Batch: 500/782 | 单Batch损失: 1.1354 | 累计平均损失: 1.2862
Epoch: 2/50 | Batch: 600/782 | 单Batch损失: 1.1883 | 累计平均损失: 1.2678
Epoch: 2/50 | Batch: 700/782 | 单Batch损失: 1.1364 | 累计平均损失: 1.2575
Epoch 2/50 完成 | 训练准确率: 55.14% | 测试准确率: 63.38%
Epoch: 3/50 | Batch: 100/782 | 单Batch损失: 1.0086 | 累计平均损失: 1.1096
Epoch: 3/50 | Batch: 200/782 | 单Batch损失: 1.0149 | 累计平均损失: 1.1084
Epoch: 3/50 | Batch: 300/782 | 单Batch损失: 1.1070 | 累计平均损失: 1.1010
Epoch: 3/50 | Batch: 400/782 | 单Batch损失: 1.0397 | 累计平均损失: 1.0983
Epoch: 3/50 | Batch: 500/782 | 单Batch损失: 0.9870 | 累计平均损失: 1.0892
Epoch: 3/50 | Batch: 600/782 | 单Batch损失: 1.0462 | 累计平均损失: 1.0852
Epoch: 3/50 | Batch: 700/782 | 单Batch损失: 1.1592 | 累计平均损失: 1.0783
Epoch 3/50 完成 | 训练准确率: 61.62% | 测试准确率: 68.97%
Epoch: 4/50 | Batch: 100/782 | 单Batch损失: 1.0148 | 累计平均损失: 1.0019
Epoch: 4/50 | Batch: 200/782 | 单Batch损失: 0.8300 | 累计平均损失: 0.9964
Epoch: 4/50 | Batch: 300/782 | 单Batch损失: 0.8960 | 累计平均损失: 0.9894
Epoch: 4/50 | Batch: 400/782 | 单Batch损失: 0.8664 | 累计平均损失: 0.9928
Epoch: 4/50 | Batch: 500/782 | 单Batch损失: 0.6554 | 累计平均损失: 0.9855
Epoch: 4/50 | Batch: 600/782 | 单Batch损失: 0.9402 | 累计平均损失: 0.9798
Epoch: 4/50 | Batch: 700/782 | 单Batch损失: 0.9730 | 累计平均损失: 0.9760
Epoch 4/50 完成 | 训练准确率: 65.62% | 测试准确率: 72.28%
Epoch: 5/50 | Batch: 100/782 | 单Batch损失: 0.9109 | 累计平均损失: 0.9211
Epoch: 5/50 | Batch: 200/782 | 单Batch损失: 1.0401 | 累计平均损失: 0.9193
Epoch: 5/50 | Batch: 300/782 | 单Batch损失: 0.9827 | 累计平均损失: 0.9186
Epoch: 5/50 | Batch: 400/782 | 单Batch损失: 1.0262 | 累计平均损失: 0.9178
Epoch: 5/50 | Batch: 500/782 | 单Batch损失: 0.8339 | 累计平均损失: 0.9195
Epoch: 5/50 | Batch: 600/782 | 单Batch损失: 0.9027 | 累计平均损失: 0.9098
Epoch: 5/50 | Batch: 700/782 | 单Batch损失: 0.9196 | 累计平均损失: 0.9092
Epoch 5/50 完成 | 训练准确率: 67.91% | 测试准确率: 73.53%
Epoch: 6/50 | Batch: 100/782 | 单Batch损失: 0.8303 | 累计平均损失: 0.8648
Epoch: 6/50 | Batch: 200/782 | 单Batch损失: 0.6958 | 累计平均损失: 0.8612
Epoch: 6/50 | Batch: 300/782 | 单Batch损失: 0.7576 | 累计平均损失: 0.8648
Epoch: 6/50 | Batch: 400/782 | 单Batch损失: 0.8383 | 累计平均损失: 0.8620
Epoch: 6/50 | Batch: 500/782 | 单Batch损失: 0.8340 | 累计平均损失: 0.8566
Epoch: 6/50 | Batch: 600/782 | 单Batch损失: 0.6579 | 累计平均损失: 0.8530
Epoch: 6/50 | Batch: 700/782 | 单Batch损失: 0.9222 | 累计平均损失: 0.8519
Epoch 6/50 完成 | 训练准确率: 70.12% | 测试准确率: 75.24%
Epoch: 7/50 | Batch: 100/782 | 单Batch损失: 0.7441 | 累计平均损失: 0.8479
Epoch: 7/50 | Batch: 200/782 | 单Batch损失: 0.6588 | 累计平均损失: 0.8234
Epoch: 7/50 | Batch: 300/782 | 单Batch损失: 1.1260 | 累计平均损失: 0.8176
Epoch: 7/50 | Batch: 400/782 | 单Batch损失: 0.8982 | 累计平均损失: 0.8126
Epoch: 7/50 | Batch: 500/782 | 单Batch损失: 0.9397 | 累计平均损失: 0.8147
Epoch: 7/50 | Batch: 600/782 | 单Batch损失: 0.5209 | 累计平均损失: 0.8132
Epoch: 7/50 | Batch: 700/782 | 单Batch损失: 1.0603 | 累计平均损失: 0.8114
Epoch 7/50 完成 | 训练准确率: 71.33% | 测试准确率: 76.32%
Epoch: 8/50 | Batch: 100/782 | 单Batch损失: 0.8801 | 累计平均损失: 0.7795
Epoch: 8/50 | Batch: 200/782 | 单Batch损失: 0.9518 | 累计平均损失: 0.7755
Epoch: 8/50 | Batch: 300/782 | 单Batch损失: 0.6404 | 累计平均损失: 0.7797
Epoch: 8/50 | Batch: 400/782 | 单Batch损失: 0.5451 | 累计平均损失: 0.7805
Epoch: 8/50 | Batch: 500/782 | 单Batch损失: 0.7638 | 累计平均损失: 0.7825
Epoch: 8/50 | Batch: 600/782 | 单Batch损失: 0.8101 | 累计平均损失: 0.7803
Epoch: 8/50 | Batch: 700/782 | 单Batch损失: 0.6150 | 累计平均损失: 0.7811
Epoch 8/50 完成 | 训练准确率: 72.49% | 测试准确率: 76.71%
Epoch: 9/50 | Batch: 100/782 | 单Batch损失: 0.6532 | 累计平均损失: 0.7567
Epoch: 9/50 | Batch: 200/782 | 单Batch损失: 0.7605 | 累计平均损失: 0.7665
Epoch: 9/50 | Batch: 300/782 | 单Batch损失: 0.5642 | 累计平均损失: 0.7633
Epoch: 9/50 | Batch: 400/782 | 单Batch损失: 0.6651 | 累计平均损失: 0.7627
Epoch: 9/50 | Batch: 500/782 | 单Batch损失: 0.5831 | 累计平均损失: 0.7553
Epoch: 9/50 | Batch: 600/782 | 单Batch损失: 0.6834 | 累计平均损失: 0.7532
Epoch: 9/50 | Batch: 700/782 | 单Batch损失: 0.8964 | 累计平均损失: 0.7551
Epoch 9/50 完成 | 训练准确率: 73.49% | 测试准确率: 77.22%
Epoch: 10/50 | Batch: 100/782 | 单Batch损失: 0.9096 | 累计平均损失: 0.7153
Epoch: 10/50 | Batch: 200/782 | 单Batch损失: 0.6593 | 累计平均损失: 0.7281
Epoch: 10/50 | Batch: 300/782 | 单Batch损失: 0.6241 | 累计平均损失: 0.7277
Epoch: 10/50 | Batch: 400/782 | 单Batch损失: 0.8413 | 累计平均损失: 0.7294
Epoch: 10/50 | Batch: 500/782 | 单Batch损失: 0.7179 | 累计平均损失: 0.7261
Epoch: 10/50 | Batch: 600/782 | 单Batch损失: 0.6523 | 累计平均损失: 0.7267
Epoch: 10/50 | Batch: 700/782 | 单Batch损失: 0.6201 | 累计平均损失: 0.7255
Epoch 10/50 完成 | 训练准确率: 74.65% | 测试准确率: 77.98%
Epoch: 11/50 | Batch: 100/782 | 单Batch损失: 0.6255 | 累计平均损失: 0.7069
Epoch: 11/50 | Batch: 200/782 | 单Batch损失: 0.6923 | 累计平均损失: 0.6992
Epoch: 11/50 | Batch: 300/782 | 单Batch损失: 0.7887 | 累计平均损失: 0.7047
Epoch: 11/50 | Batch: 400/782 | 单Batch损失: 0.7803 | 累计平均损失: 0.7068
Epoch: 11/50 | Batch: 500/782 | 单Batch损失: 0.8174 | 累计平均损失: 0.7110
Epoch: 11/50 | Batch: 600/782 | 单Batch损失: 0.8550 | 累计平均损失: 0.7071
Epoch: 11/50 | Batch: 700/782 | 单Batch损失: 0.6795 | 累计平均损失: 0.7106
Epoch 11/50 完成 | 训练准确率: 75.14% | 测试准确率: 78.32%
Epoch: 12/50 | Batch: 100/782 | 单Batch损失: 0.7148 | 累计平均损失: 0.7090
Epoch: 12/50 | Batch: 200/782 | 单Batch损失: 0.9063 | 累计平均损失: 0.6854
Epoch: 12/50 | Batch: 300/782 | 单Batch损失: 0.9199 | 累计平均损失: 0.6922
Epoch: 12/50 | Batch: 400/782 | 单Batch损失: 0.5843 | 累计平均损失: 0.6942
Epoch: 12/50 | Batch: 500/782 | 单Batch损失: 0.7288 | 累计平均损失: 0.6880
Epoch: 12/50 | Batch: 600/782 | 单Batch损失: 0.7894 | 累计平均损失: 0.6959
Epoch: 12/50 | Batch: 700/782 | 单Batch损失: 0.6456 | 累计平均损失: 0.6968
Epoch 12/50 完成 | 训练准确率: 75.57% | 测试准确率: 78.80%
Epoch: 13/50 | Batch: 100/782 | 单Batch损失: 0.8054 | 累计平均损失: 0.6654
Epoch: 13/50 | Batch: 200/782 | 单Batch损失: 0.6466 | 累计平均损失: 0.6684
Epoch: 13/50 | Batch: 300/782 | 单Batch损失: 0.5844 | 累计平均损失: 0.6666
Epoch: 13/50 | Batch: 400/782 | 单Batch损失: 0.8063 | 累计平均损失: 0.6691
Epoch: 13/50 | Batch: 500/782 | 单Batch损失: 0.7331 | 累计平均损失: 0.6731
Epoch: 13/50 | Batch: 600/782 | 单Batch损失: 0.7364 | 累计平均损失: 0.6704
Epoch: 13/50 | Batch: 700/782 | 单Batch损失: 0.6887 | 累计平均损失: 0.6718
Epoch 13/50 完成 | 训练准确率: 76.55% | 测试准确率: 78.77%
Epoch: 14/50 | Batch: 100/782 | 单Batch损失: 0.5431 | 累计平均损失: 0.6675
Epoch: 14/50 | Batch: 200/782 | 单Batch损失: 0.6746 | 累计平均损失: 0.6501
Epoch: 14/50 | Batch: 300/782 | 单Batch损失: 0.6182 | 累计平均损失: 0.6539
Epoch: 14/50 | Batch: 400/782 | 单Batch损失: 0.8231 | 累计平均损失: 0.6601
Epoch: 14/50 | Batch: 500/782 | 单Batch损失: 0.6667 | 累计平均损失: 0.6619
Epoch: 14/50 | Batch: 600/782 | 单Batch损失: 0.6200 | 累计平均损失: 0.6599
Epoch: 14/50 | Batch: 700/782 | 单Batch损失: 0.7064 | 累计平均损失: 0.6610
Epoch 14/50 完成 | 训练准确率: 76.89% | 测试准确率: 79.21%
Epoch: 15/50 | Batch: 100/782 | 单Batch损失: 0.8123 | 累计平均损失: 0.6534
Epoch: 15/50 | Batch: 200/782 | 单Batch损失: 0.7289 | 累计平均损失: 0.6465
Epoch: 15/50 | Batch: 300/782 | 单Batch损失: 0.5245 | 累计平均损失: 0.6448
Epoch: 15/50 | Batch: 400/782 | 单Batch损失: 0.6456 | 累计平均损失: 0.6402
Epoch: 15/50 | Batch: 500/782 | 单Batch损失: 0.6557 | 累计平均损失: 0.6451
Epoch: 15/50 | Batch: 600/782 | 单Batch损失: 0.6771 | 累计平均损失: 0.6441
Epoch: 15/50 | Batch: 700/782 | 单Batch损失: 0.7440 | 累计平均损失: 0.6451
Epoch 15/50 完成 | 训练准确率: 77.04% | 测试准确率: 80.17%
Epoch: 16/50 | Batch: 100/782 | 单Batch损失: 0.7207 | 累计平均损失: 0.6286
Epoch: 16/50 | Batch: 200/782 | 单Batch损失: 0.5078 | 累计平均损失: 0.6124
Epoch: 16/50 | Batch: 300/782 | 单Batch损失: 0.6993 | 累计平均损失: 0.6129
Epoch: 16/50 | Batch: 400/782 | 单Batch损失: 0.7036 | 累计平均损失: 0.6175
Epoch: 16/50 | Batch: 500/782 | 单Batch损失: 0.7219 | 累计平均损失: 0.6219
Epoch: 16/50 | Batch: 600/782 | 单Batch损失: 0.8140 | 累计平均损失: 0.6237
Epoch: 16/50 | Batch: 700/782 | 单Batch损失: 0.4370 | 累计平均损失: 0.6262
Epoch 16/50 完成 | 训练准确率: 77.95% | 测试准确率: 80.45%
Epoch: 17/50 | Batch: 100/782 | 单Batch损失: 0.4815 | 累计平均损失: 0.6189
Epoch: 17/50 | Batch: 200/782 | 单Batch损失: 0.8503 | 累计平均损失: 0.6114
Epoch: 17/50 | Batch: 300/782 | 单Batch损失: 0.6019 | 累计平均损失: 0.6120
Epoch: 17/50 | Batch: 400/782 | 单Batch损失: 0.6100 | 累计平均损失: 0.6188
Epoch: 17/50 | Batch: 500/782 | 单Batch损失: 0.6561 | 累计平均损失: 0.6228
Epoch: 17/50 | Batch: 600/782 | 单Batch损失: 0.7258 | 累计平均损失: 0.6248
Epoch: 17/50 | Batch: 700/782 | 单Batch损失: 0.7760 | 累计平均损失: 0.6237
Epoch 17/50 完成 | 训练准确率: 78.14% | 测试准确率: 80.09%
Epoch: 18/50 | Batch: 100/782 | 单Batch损失: 0.7834 | 累计平均损失: 0.6066
Epoch: 18/50 | Batch: 200/782 | 单Batch损失: 0.7988 | 累计平均损失: 0.6059
Epoch: 18/50 | Batch: 300/782 | 单Batch损失: 0.6057 | 累计平均损失: 0.6001
Epoch: 18/50 | Batch: 400/782 | 单Batch损失: 0.7500 | 累计平均损失: 0.6031
Epoch: 18/50 | Batch: 500/782 | 单Batch损失: 0.6106 | 累计平均损失: 0.6021
Epoch: 18/50 | Batch: 600/782 | 单Batch损失: 0.5029 | 累计平均损失: 0.6057
Epoch: 18/50 | Batch: 700/782 | 单Batch损失: 0.4244 | 累计平均损失: 0.6055
Epoch 18/50 完成 | 训练准确率: 78.85% | 测试准确率: 80.44%
Epoch: 19/50 | Batch: 100/782 | 单Batch损失: 0.6464 | 累计平均损失: 0.5866
Epoch: 19/50 | Batch: 200/782 | 单Batch损失: 0.4937 | 累计平均损失: 0.5900
Epoch: 19/50 | Batch: 300/782 | 单Batch损失: 0.6328 | 累计平均损失: 0.5966
Epoch: 19/50 | Batch: 400/782 | 单Batch损失: 0.7629 | 累计平均损失: 0.5921
Epoch: 19/50 | Batch: 500/782 | 单Batch损失: 0.6918 | 累计平均损失: 0.5976
Epoch: 19/50 | Batch: 600/782 | 单Batch损失: 0.8189 | 累计平均损失: 0.5991
Epoch: 19/50 | Batch: 700/782 | 单Batch损失: 0.7366 | 累计平均损失: 0.6000
Epoch 19/50 完成 | 训练准确率: 79.02% | 测试准确率: 80.71%
Epoch: 20/50 | Batch: 100/782 | 单Batch损失: 0.5287 | 累计平均损失: 0.5730
Epoch: 20/50 | Batch: 200/782 | 单Batch损失: 0.5504 | 累计平均损失: 0.5723
Epoch: 20/50 | Batch: 300/782 | 单Batch损失: 0.4148 | 累计平均损失: 0.5780
Epoch: 20/50 | Batch: 400/782 | 单Batch损失: 0.5968 | 累计平均损失: 0.5821
Epoch: 20/50 | Batch: 500/782 | 单Batch损失: 0.5881 | 累计平均损失: 0.5864
Epoch: 20/50 | Batch: 600/782 | 单Batch损失: 0.5739 | 累计平均损失: 0.5914
Epoch: 20/50 | Batch: 700/782 | 单Batch损失: 0.4754 | 累计平均损失: 0.5906
Epoch 20/50 完成 | 训练准确率: 79.31% | 测试准确率: 80.90%
Epoch: 21/50 | Batch: 100/782 | 单Batch损失: 0.4989 | 累计平均损失: 0.5928
Epoch: 21/50 | Batch: 200/782 | 单Batch损失: 0.6343 | 累计平均损失: 0.5788
Epoch: 21/50 | Batch: 300/782 | 单Batch损失: 0.6154 | 累计平均损失: 0.5767
Epoch: 21/50 | Batch: 400/782 | 单Batch损失: 0.3872 | 累计平均损失: 0.5788
Epoch: 21/50 | Batch: 500/782 | 单Batch损失: 0.5309 | 累计平均损失: 0.5770
Epoch: 21/50 | Batch: 600/782 | 单Batch损失: 0.5808 | 累计平均损失: 0.5761
Epoch: 21/50 | Batch: 700/782 | 单Batch损失: 0.7381 | 累计平均损失: 0.5786
Epoch 21/50 完成 | 训练准确率: 79.72% | 测试准确率: 81.26%
Epoch: 22/50 | Batch: 100/782 | 单Batch损失: 0.4767 | 累计平均损失: 0.5528
Epoch: 22/50 | Batch: 200/782 | 单Batch损失: 0.4559 | 累计平均损失: 0.5522
Epoch: 22/50 | Batch: 300/782 | 单Batch损失: 0.5389 | 累计平均损失: 0.5591
Epoch: 22/50 | Batch: 400/782 | 单Batch损失: 0.7212 | 累计平均损失: 0.5638
Epoch: 22/50 | Batch: 500/782 | 单Batch损失: 0.8011 | 累计平均损失: 0.5690
Epoch: 22/50 | Batch: 600/782 | 单Batch损失: 0.6542 | 累计平均损失: 0.5729
Epoch: 22/50 | Batch: 700/782 | 单Batch损失: 0.5524 | 累计平均损失: 0.5740
Epoch 22/50 完成 | 训练准确率: 79.94% | 测试准确率: 81.59%
Epoch: 23/50 | Batch: 100/782 | 单Batch损失: 0.6390 | 累计平均损失: 0.5431
Epoch: 23/50 | Batch: 200/782 | 单Batch损失: 0.4986 | 累计平均损失: 0.5500
Epoch: 23/50 | Batch: 300/782 | 单Batch损失: 0.6459 | 累计平均损失: 0.5586
Epoch: 23/50 | Batch: 400/782 | 单Batch损失: 0.5589 | 累计平均损失: 0.5619
Epoch: 23/50 | Batch: 500/782 | 单Batch损失: 0.5064 | 累计平均损失: 0.5600
Epoch: 23/50 | Batch: 600/782 | 单Batch损失: 0.4100 | 累计平均损失: 0.5631
Epoch: 23/50 | Batch: 700/782 | 单Batch损失: 0.7176 | 累计平均损失: 0.5672
Epoch 23/50 完成 | 训练准确率: 80.10% | 测试准确率: 81.86%
Epoch: 24/50 | Batch: 100/782 | 单Batch损失: 0.5626 | 累计平均损失: 0.5440
Epoch: 24/50 | Batch: 200/782 | 单Batch损失: 0.6703 | 累计平均损失: 0.5526
Epoch: 24/50 | Batch: 300/782 | 单Batch损失: 0.7613 | 累计平均损失: 0.5525
Epoch: 24/50 | Batch: 400/782 | 单Batch损失: 0.3703 | 累计平均损失: 0.5565
Epoch: 24/50 | Batch: 500/782 | 单Batch损失: 0.4784 | 累计平均损失: 0.5580
Epoch: 24/50 | Batch: 600/782 | 单Batch损失: 0.4845 | 累计平均损失: 0.5570
Epoch: 24/50 | Batch: 700/782 | 单Batch损失: 0.7288 | 累计平均损失: 0.5581
Epoch 24/50 完成 | 训练准确率: 80.52% | 测试准确率: 81.77%
Epoch: 25/50 | Batch: 100/782 | 单Batch损失: 0.5032 | 累计平均损失: 0.5464
Epoch: 25/50 | Batch: 200/782 | 单Batch损失: 0.5494 | 累计平均损失: 0.5533
Epoch: 25/50 | Batch: 300/782 | 单Batch损失: 0.3919 | 累计平均损失: 0.5526
Epoch: 25/50 | Batch: 400/782 | 单Batch损失: 0.5525 | 累计平均损失: 0.5496
Epoch: 25/50 | Batch: 500/782 | 单Batch损失: 0.5178 | 累计平均损失: 0.5490
Epoch: 25/50 | Batch: 600/782 | 单Batch损失: 0.5707 | 累计平均损失: 0.5516
Epoch: 25/50 | Batch: 700/782 | 单Batch损失: 0.6218 | 累计平均损失: 0.5545
Epoch 25/50 完成 | 训练准确率: 80.57% | 测试准确率: 81.62%
Epoch: 26/50 | Batch: 100/782 | 单Batch损失: 0.5668 | 累计平均损失: 0.5570
Epoch: 26/50 | Batch: 200/782 | 单Batch损失: 0.5078 | 累计平均损失: 0.5603
Epoch: 26/50 | Batch: 300/782 | 单Batch损失: 0.4609 | 累计平均损失: 0.5500
Epoch: 26/50 | Batch: 400/782 | 单Batch损失: 0.6067 | 累计平均损失: 0.5475
Epoch: 26/50 | Batch: 500/782 | 单Batch损失: 0.5655 | 累计平均损失: 0.5457
Epoch: 26/50 | Batch: 600/782 | 单Batch损失: 0.5651 | 累计平均损失: 0.5407
Epoch: 26/50 | Batch: 700/782 | 单Batch损失: 0.6288 | 累计平均损失: 0.5434
Epoch 26/50 完成 | 训练准确率: 80.77% | 测试准确率: 81.83%
Epoch: 27/50 | Batch: 100/782 | 单Batch损失: 0.4995 | 累计平均损失: 0.5396
Epoch: 27/50 | Batch: 200/782 | 单Batch损失: 0.4447 | 累计平均损失: 0.5330
Epoch: 27/50 | Batch: 300/782 | 单Batch损失: 0.4292 | 累计平均损失: 0.5356
Epoch: 27/50 | Batch: 400/782 | 单Batch损失: 0.4004 | 累计平均损失: 0.5380
Epoch: 27/50 | Batch: 500/782 | 单Batch损失: 0.4919 | 累计平均损失: 0.5388
Epoch: 27/50 | Batch: 600/782 | 单Batch损失: 0.3905 | 累计平均损失: 0.5398
Epoch: 27/50 | Batch: 700/782 | 单Batch损失: 0.5299 | 累计平均损失: 0.5426
Epoch 27/50 完成 | 训练准确率: 80.92% | 测试准确率: 82.25%
Epoch: 28/50 | Batch: 100/782 | 单Batch损失: 0.5164 | 累计平均损失: 0.5110
Epoch: 28/50 | Batch: 200/782 | 单Batch损失: 0.5977 | 累计平均损失: 0.5115
Epoch: 28/50 | Batch: 300/782 | 单Batch损失: 0.5379 | 累计平均损失: 0.5153
Epoch: 28/50 | Batch: 400/782 | 单Batch损失: 0.4795 | 累计平均损失: 0.5228
Epoch: 28/50 | Batch: 500/782 | 单Batch损失: 0.3740 | 累计平均损失: 0.5258
Epoch: 28/50 | Batch: 600/782 | 单Batch损失: 0.7846 | 累计平均损失: 0.5264
Epoch: 28/50 | Batch: 700/782 | 单Batch损失: 0.6405 | 累计平均损失: 0.5288
Epoch 28/50 完成 | 训练准确率: 81.25% | 测试准确率: 82.26%
Epoch: 29/50 | Batch: 100/782 | 单Batch损失: 0.3871 | 累计平均损失: 0.4901
Epoch: 29/50 | Batch: 200/782 | 单Batch损失: 0.4014 | 累计平均损失: 0.5117
Epoch: 29/50 | Batch: 300/782 | 单Batch损失: 0.4946 | 累计平均损失: 0.5221
Epoch: 29/50 | Batch: 400/782 | 单Batch损失: 0.5572 | 累计平均损失: 0.5210
Epoch: 29/50 | Batch: 500/782 | 单Batch损失: 0.4322 | 累计平均损失: 0.5230
Epoch: 29/50 | Batch: 600/782 | 单Batch损失: 0.4734 | 累计平均损失: 0.5242
Epoch: 29/50 | Batch: 700/782 | 单Batch损失: 0.5669 | 累计平均损失: 0.5245
Epoch 29/50 完成 | 训练准确率: 81.67% | 测试准确率: 81.97%
Epoch: 30/50 | Batch: 100/782 | 单Batch损失: 0.6986 | 累计平均损失: 0.5085
Epoch: 30/50 | Batch: 200/782 | 单Batch损失: 0.3665 | 累计平均损失: 0.5120
Epoch: 30/50 | Batch: 300/782 | 单Batch损失: 0.5522 | 累计平均损失: 0.5113
Epoch: 30/50 | Batch: 400/782 | 单Batch损失: 0.4767 | 累计平均损失: 0.5143
Epoch: 30/50 | Batch: 500/782 | 单Batch损失: 0.9293 | 累计平均损失: 0.5164
Epoch: 30/50 | Batch: 600/782 | 单Batch损失: 0.3870 | 累计平均损失: 0.5187
Epoch: 30/50 | Batch: 700/782 | 单Batch损失: 0.5400 | 累计平均损失: 0.5160
Epoch 30/50 完成 | 训练准确率: 81.79% | 测试准确率: 81.93%
Epoch: 31/50 | Batch: 100/782 | 单Batch损失: 0.3682 | 累计平均损失: 0.5151
Epoch: 31/50 | Batch: 200/782 | 单Batch损失: 0.5547 | 累计平均损失: 0.5251
Epoch: 31/50 | Batch: 300/782 | 单Batch损失: 0.4244 | 累计平均损失: 0.5172
Epoch: 31/50 | Batch: 400/782 | 单Batch损失: 0.4876 | 累计平均损失: 0.5174
Epoch: 31/50 | Batch: 500/782 | 单Batch损失: 0.5297 | 累计平均损失: 0.5171
Epoch: 31/50 | Batch: 600/782 | 单Batch损失: 0.6432 | 累计平均损失: 0.5184
Epoch: 31/50 | Batch: 700/782 | 单Batch损失: 0.5414 | 累计平均损失: 0.5191
Epoch 31/50 完成 | 训练准确率: 81.84% | 测试准确率: 83.01%
Epoch: 32/50 | Batch: 100/782 | 单Batch损失: 0.4310 | 累计平均损失: 0.4839
Epoch: 32/50 | Batch: 200/782 | 单Batch损失: 0.4675 | 累计平均损失: 0.5077
Epoch: 32/50 | Batch: 300/782 | 单Batch损失: 0.4267 | 累计平均损失: 0.5100
Epoch: 32/50 | Batch: 400/782 | 单Batch损失: 0.5050 | 累计平均损失: 0.5096
Epoch: 32/50 | Batch: 500/782 | 单Batch损失: 0.5400 | 累计平均损失: 0.5058
Epoch: 32/50 | Batch: 600/782 | 单Batch损失: 0.4545 | 累计平均损失: 0.5089
Epoch: 32/50 | Batch: 700/782 | 单Batch损失: 0.5637 | 累计平均损失: 0.5094
Epoch 32/50 完成 | 训练准确率: 82.32% | 测试准确率: 83.61%
Epoch: 33/50 | Batch: 100/782 | 单Batch损失: 0.4244 | 累计平均损失: 0.4916
Epoch: 33/50 | Batch: 200/782 | 单Batch损失: 0.2550 | 累计平均损失: 0.5044
Epoch: 33/50 | Batch: 300/782 | 单Batch损失: 0.4313 | 累计平均损失: 0.5032
Epoch: 33/50 | Batch: 400/782 | 单Batch损失: 0.4045 | 累计平均损失: 0.5061
Epoch: 33/50 | Batch: 500/782 | 单Batch损失: 0.4526 | 累计平均损失: 0.5055
Epoch: 33/50 | Batch: 600/782 | 单Batch损失: 0.4589 | 累计平均损失: 0.5065
Epoch: 33/50 | Batch: 700/782 | 单Batch损失: 0.3453 | 累计平均损失: 0.5082
Epoch 33/50 完成 | 训练准确率: 82.27% | 测试准确率: 83.27%
Epoch: 34/50 | Batch: 100/782 | 单Batch损失: 0.5896 | 累计平均损失: 0.4878
Epoch: 34/50 | Batch: 200/782 | 单Batch损失: 0.4765 | 累计平均损失: 0.4885
Epoch: 34/50 | Batch: 300/782 | 单Batch损失: 0.7956 | 累计平均损失: 0.4892
Epoch: 34/50 | Batch: 400/782 | 单Batch损失: 0.3390 | 累计平均损失: 0.4920
Epoch: 34/50 | Batch: 500/782 | 单Batch损失: 0.5257 | 累计平均损失: 0.4959
Epoch: 34/50 | Batch: 600/782 | 单Batch损失: 0.5249 | 累计平均损失: 0.4984
Epoch: 34/50 | Batch: 700/782 | 单Batch损失: 0.5145 | 累计平均损失: 0.5007
Epoch 34/50 完成 | 训练准确率: 82.34% | 测试准确率: 83.59%
Epoch: 35/50 | Batch: 100/782 | 单Batch损失: 0.4741 | 累计平均损失: 0.4866
Epoch: 35/50 | Batch: 200/782 | 单Batch损失: 0.3406 | 累计平均损失: 0.4894
Epoch: 35/50 | Batch: 300/782 | 单Batch损失: 0.5039 | 累计平均损失: 0.4923
Epoch: 35/50 | Batch: 400/782 | 单Batch损失: 0.6513 | 累计平均损失: 0.4934
Epoch: 35/50 | Batch: 500/782 | 单Batch损失: 0.6459 | 累计平均损失: 0.4938
Epoch: 35/50 | Batch: 600/782 | 单Batch损失: 0.3690 | 累计平均损失: 0.4945
Epoch: 35/50 | Batch: 700/782 | 单Batch损失: 0.4595 | 累计平均损失: 0.4965
Epoch 35/50 完成 | 训练准确率: 82.39% | 测试准确率: 83.55%
Epoch: 36/50 | Batch: 100/782 | 单Batch损失: 0.5565 | 累计平均损失: 0.4826
Epoch: 36/50 | Batch: 200/782 | 单Batch损失: 0.6245 | 累计平均损失: 0.4826
Epoch: 36/50 | Batch: 300/782 | 单Batch损失: 0.3083 | 累计平均损失: 0.4851
Epoch: 36/50 | Batch: 400/782 | 单Batch损失: 0.3911 | 累计平均损失: 0.4866
Epoch: 36/50 | Batch: 500/782 | 单Batch损失: 0.6162 | 累计平均损失: 0.4909
Epoch: 36/50 | Batch: 600/782 | 单Batch损失: 0.3935 | 累计平均损失: 0.4897
Epoch: 36/50 | Batch: 700/782 | 单Batch损失: 0.7629 | 累计平均损失: 0.4918
Epoch 36/50 完成 | 训练准确率: 82.83% | 测试准确率: 83.48%
Epoch: 37/50 | Batch: 100/782 | 单Batch损失: 0.5431 | 累计平均损失: 0.4775
Epoch: 37/50 | Batch: 200/782 | 单Batch损失: 0.4509 | 累计平均损失: 0.4816
Epoch: 37/50 | Batch: 300/782 | 单Batch损失: 0.6305 | 累计平均损失: 0.4863
Epoch: 37/50 | Batch: 400/782 | 单Batch损失: 0.5630 | 累计平均损失: 0.4873
Epoch: 37/50 | Batch: 500/782 | 单Batch损失: 0.3457 | 累计平均损失: 0.4883
Epoch: 37/50 | Batch: 600/782 | 单Batch损失: 0.5655 | 累计平均损失: 0.4878
Epoch: 37/50 | Batch: 700/782 | 单Batch损失: 0.3366 | 累计平均损失: 0.4891
Epoch 37/50 完成 | 训练准确率: 82.81% | 测试准确率: 83.02%
Epoch: 38/50 | Batch: 100/782 | 单Batch损失: 0.5499 | 累计平均损失: 0.4741
Epoch: 38/50 | Batch: 200/782 | 单Batch损失: 0.5125 | 累计平均损失: 0.4739
Epoch: 38/50 | Batch: 300/782 | 单Batch损失: 0.7040 | 累计平均损失: 0.4720
Epoch: 38/50 | Batch: 400/782 | 单Batch损失: 0.4453 | 累计平均损失: 0.4793
Epoch: 38/50 | Batch: 500/782 | 单Batch损失: 0.5011 | 累计平均损失: 0.4835
Epoch: 38/50 | Batch: 600/782 | 单Batch损失: 0.3620 | 累计平均损失: 0.4839
Epoch: 38/50 | Batch: 700/782 | 单Batch损失: 0.6792 | 累计平均损失: 0.4849
Epoch 38/50 完成 | 训练准确率: 82.96% | 测试准确率: 83.58%
Epoch: 39/50 | Batch: 100/782 | 单Batch损失: 0.4115 | 累计平均损失: 0.4452
Epoch: 39/50 | Batch: 200/782 | 单Batch损失: 0.4167 | 累计平均损失: 0.4339
Epoch: 39/50 | Batch: 300/782 | 单Batch损失: 0.4150 | 累计平均损失: 0.4364
Epoch: 39/50 | Batch: 400/782 | 单Batch损失: 0.5018 | 累计平均损失: 0.4368
Epoch: 39/50 | Batch: 500/782 | 单Batch损失: 0.4537 | 累计平均损失: 0.4350
Epoch: 39/50 | Batch: 600/782 | 单Batch损失: 0.4893 | 累计平均损失: 0.4390
Epoch: 39/50 | Batch: 700/782 | 单Batch损失: 0.4592 | 累计平均损失: 0.4383
Epoch 39/50 完成 | 训练准确率: 84.58% | 测试准确率: 83.90%
Epoch: 40/50 | Batch: 100/782 | 单Batch损失: 0.4270 | 累计平均损失: 0.4275
Epoch: 40/50 | Batch: 200/782 | 单Batch损失: 0.3538 | 累计平均损失: 0.4321
Epoch: 40/50 | Batch: 300/782 | 单Batch损失: 0.5362 | 累计平均损失: 0.4300
Epoch: 40/50 | Batch: 400/782 | 单Batch损失: 0.6342 | 累计平均损失: 0.4357
Epoch: 40/50 | Batch: 500/782 | 单Batch损失: 0.3553 | 累计平均损失: 0.4297
Epoch: 40/50 | Batch: 600/782 | 单Batch损失: 0.2310 | 累计平均损失: 0.4267
Epoch: 40/50 | Batch: 700/782 | 单Batch损失: 0.4437 | 累计平均损失: 0.4255
Epoch 40/50 完成 | 训练准确率: 84.90% | 测试准确率: 84.59%
Epoch: 41/50 | Batch: 100/782 | 单Batch损失: 0.4160 | 累计平均损失: 0.3990
Epoch: 41/50 | Batch: 200/782 | 单Batch损失: 0.4385 | 累计平均损失: 0.4026
Epoch: 41/50 | Batch: 300/782 | 单Batch损失: 0.2959 | 累计平均损失: 0.3997
Epoch: 41/50 | Batch: 400/782 | 单Batch损失: 0.4402 | 累计平均损失: 0.4100
Epoch: 41/50 | Batch: 500/782 | 单Batch损失: 0.3498 | 累计平均损失: 0.4100
Epoch: 41/50 | Batch: 600/782 | 单Batch损失: 0.2418 | 累计平均损失: 0.4103
Epoch: 41/50 | Batch: 700/782 | 单Batch损失: 0.4321 | 累计平均损失: 0.4117
Epoch 41/50 完成 | 训练准确率: 85.43% | 测试准确率: 84.55%
Epoch: 42/50 | Batch: 100/782 | 单Batch损失: 0.2983 | 累计平均损失: 0.3926
Epoch: 42/50 | Batch: 200/782 | 单Batch损失: 0.4122 | 累计平均损失: 0.4098
Epoch: 42/50 | Batch: 300/782 | 单Batch损失: 0.3097 | 累计平均损失: 0.4151
Epoch: 42/50 | Batch: 400/782 | 单Batch损失: 0.5711 | 累计平均损失: 0.4166
Epoch: 42/50 | Batch: 500/782 | 单Batch损失: 0.4961 | 累计平均损失: 0.4174
Epoch: 42/50 | Batch: 600/782 | 单Batch损失: 0.3369 | 累计平均损失: 0.4170
Epoch: 42/50 | Batch: 700/782 | 单Batch损失: 0.4240 | 累计平均损失: 0.4172
Epoch 42/50 完成 | 训练准确率: 85.29% | 测试准确率: 85.15%
Epoch: 43/50 | Batch: 100/782 | 单Batch损失: 0.4642 | 累计平均损失: 0.4175
Epoch: 43/50 | Batch: 200/782 | 单Batch损失: 0.3065 | 累计平均损失: 0.4058
Epoch: 43/50 | Batch: 300/782 | 单Batch损失: 0.2844 | 累计平均损失: 0.4030
Epoch: 43/50 | Batch: 400/782 | 单Batch损失: 0.4232 | 累计平均损失: 0.3987
Epoch: 43/50 | Batch: 500/782 | 单Batch损失: 0.5395 | 累计平均损失: 0.4023
Epoch: 43/50 | Batch: 600/782 | 单Batch损失: 0.4163 | 累计平均损失: 0.4042
Epoch: 43/50 | Batch: 700/782 | 单Batch损失: 0.2678 | 累计平均损失: 0.4063
Epoch 43/50 完成 | 训练准确率: 85.71% | 测试准确率: 84.41%
Epoch: 44/50 | Batch: 100/782 | 单Batch损失: 0.5120 | 累计平均损失: 0.4241
Epoch: 44/50 | Batch: 200/782 | 单Batch损失: 0.4449 | 累计平均损失: 0.4160
Epoch: 44/50 | Batch: 300/782 | 单Batch损失: 0.3248 | 累计平均损失: 0.4096
Epoch: 44/50 | Batch: 400/782 | 单Batch损失: 0.3194 | 累计平均损失: 0.4115
Epoch: 44/50 | Batch: 500/782 | 单Batch损失: 0.6854 | 累计平均损失: 0.4090
Epoch: 44/50 | Batch: 600/782 | 单Batch损失: 0.4878 | 累计平均损失: 0.4105
Epoch: 44/50 | Batch: 700/782 | 单Batch损失: 0.3249 | 累计平均损失: 0.4090
Epoch 44/50 完成 | 训练准确率: 85.61% | 测试准确率: 84.84%
Epoch: 45/50 | Batch: 100/782 | 单Batch损失: 0.4742 | 累计平均损失: 0.3962
Epoch: 45/50 | Batch: 200/782 | 单Batch损失: 0.5246 | 累计平均损失: 0.4036
Epoch: 45/50 | Batch: 300/782 | 单Batch损失: 0.3103 | 累计平均损失: 0.4069
Epoch: 45/50 | Batch: 400/782 | 单Batch损失: 0.7554 | 累计平均损失: 0.4102
Epoch: 45/50 | Batch: 500/782 | 单Batch损失: 0.2611 | 累计平均损失: 0.4065
Epoch: 45/50 | Batch: 600/782 | 单Batch损失: 0.4985 | 累计平均损失: 0.4075
Epoch: 45/50 | Batch: 700/782 | 单Batch损失: 0.4460 | 累计平均损失: 0.4049
Epoch 45/50 完成 | 训练准确率: 85.77% | 测试准确率: 84.82%
Epoch: 46/50 | Batch: 100/782 | 单Batch损失: 0.4373 | 累计平均损失: 0.4139
Epoch: 46/50 | Batch: 200/782 | 单Batch损失: 0.4529 | 累计平均损失: 0.4001
Epoch: 46/50 | Batch: 300/782 | 单Batch损失: 0.4245 | 累计平均损失: 0.3995
Epoch: 46/50 | Batch: 400/782 | 单Batch损失: 0.4438 | 累计平均损失: 0.3979
Epoch: 46/50 | Batch: 500/782 | 单Batch损失: 0.3447 | 累计平均损失: 0.3969
Epoch: 46/50 | Batch: 600/782 | 单Batch损失: 0.2865 | 累计平均损失: 0.3979
Epoch: 46/50 | Batch: 700/782 | 单Batch损失: 0.3172 | 累计平均损失: 0.3988
Epoch 46/50 完成 | 训练准确率: 85.94% | 测试准确率: 84.73%
Epoch: 47/50 | Batch: 100/782 | 单Batch损失: 0.2275 | 累计平均损失: 0.3797
Epoch: 47/50 | Batch: 200/782 | 单Batch损失: 0.3422 | 累计平均损失: 0.3714
Epoch: 47/50 | Batch: 300/782 | 单Batch损失: 0.3946 | 累计平均损失: 0.3704
Epoch: 47/50 | Batch: 400/782 | 单Batch损失: 0.3541 | 累计平均损失: 0.3675
Epoch: 47/50 | Batch: 500/782 | 单Batch损失: 0.3449 | 累计平均损失: 0.3684
Epoch: 47/50 | Batch: 600/782 | 单Batch损失: 0.2901 | 累计平均损失: 0.3702
Epoch: 47/50 | Batch: 700/782 | 单Batch损失: 0.2147 | 累计平均损失: 0.3697
Epoch 47/50 完成 | 训练准确率: 86.96% | 测试准确率: 85.43%
Epoch: 48/50 | Batch: 100/782 | 单Batch损失: 0.3223 | 累计平均损失: 0.3562
Epoch: 48/50 | Batch: 200/782 | 单Batch损失: 0.6040 | 累计平均损失: 0.3609
Epoch: 48/50 | Batch: 300/782 | 单Batch损失: 0.5514 | 累计平均损失: 0.3647
Epoch: 48/50 | Batch: 400/782 | 单Batch损失: 0.4951 | 累计平均损失: 0.3678
Epoch: 48/50 | Batch: 500/782 | 单Batch损失: 0.2539 | 累计平均损失: 0.3693
Epoch: 48/50 | Batch: 600/782 | 单Batch损失: 0.3193 | 累计平均损失: 0.3704
Epoch: 48/50 | Batch: 700/782 | 单Batch损失: 0.4370 | 累计平均损失: 0.3699
Epoch 48/50 完成 | 训练准确率: 86.95% | 测试准确率: 85.51%
Epoch: 49/50 | Batch: 100/782 | 单Batch损失: 0.2413 | 累计平均损失: 0.3713
Epoch: 49/50 | Batch: 200/782 | 单Batch损失: 0.3096 | 累计平均损失: 0.3725
Epoch: 49/50 | Batch: 300/782 | 单Batch损失: 0.2808 | 累计平均损失: 0.3684
Epoch: 49/50 | Batch: 400/782 | 单Batch损失: 0.2968 | 累计平均损失: 0.3641
Epoch: 49/50 | Batch: 500/782 | 单Batch损失: 0.2789 | 累计平均损失: 0.3621
Epoch: 49/50 | Batch: 600/782 | 单Batch损失: 0.3366 | 累计平均损失: 0.3608
Epoch: 49/50 | Batch: 700/782 | 单Batch损失: 0.4347 | 累计平均损失: 0.3618
Epoch 49/50 完成 | 训练准确率: 87.18% | 测试准确率: 85.22%
Epoch: 50/50 | Batch: 100/782 | 单Batch损失: 0.4453 | 累计平均损失: 0.3467
Epoch: 50/50 | Batch: 200/782 | 单Batch损失: 0.2889 | 累计平均损失: 0.3522
Epoch: 50/50 | Batch: 300/782 | 单Batch损失: 0.3357 | 累计平均损失: 0.3549
Epoch: 50/50 | Batch: 400/782 | 单Batch损失: 0.6199 | 累计平均损失: 0.3563
Epoch: 50/50 | Batch: 500/782 | 单Batch损失: 0.4550 | 累计平均损失: 0.3581
Epoch: 50/50 | Batch: 600/782 | 单Batch损失: 0.4347 | 累计平均损失: 0.3583
Epoch: 50/50 | Batch: 700/782 | 单Batch损失: 0.2709 | 累计平均损失: 0.3592
Epoch 50/50 完成 | 训练准确率: 87.18% | 测试准确率: 85.21%
训练完成!最终测试准确率: 85.21%
@浙大疏锦行