python打卡训练营打卡记录day50
知识点回顾:
- resnet结构解析
- CBAM放置位置的思考
- 针对预训练模型的训练策略
- 差异化学习率
- 三阶段微调
作业:
- 好好理解下resnet18的模型结构
- 尝试对vgg16+cbam进行微调策略
vgg16+cbam
import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms, models
from torch.utils.data import DataLoader
import matplotlib.pyplot as plt
import numpy as np
import time# 设置中文字体支持
plt.rcParams["font.family"] = ["SimHei"]
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题# 通道注意力模块(与原代码一致)
class ChannelAttention(nn.Module):def __init__(self, in_channels, ratio=16):super().__init__()self.avg_pool = nn.AdaptiveAvgPool2d(1)self.max_pool = nn.AdaptiveMaxPool2d(1)self.fc = nn.Sequential(nn.Linear(in_channels, in_channels // ratio, bias=False),nn.ReLU(),nn.Linear(in_channels // ratio, in_channels, bias=False))self.sigmoid = nn.Sigmoid()def forward(self, x):b, c, h, w = x.shapeavg_out = self.fc(self.avg_pool(x).view(b, c))max_out = self.fc(self.max_pool(x).view(b, c))attention = self.sigmoid(avg_out + max_out).view(b, c, 1, 1)return x * attention# 空间注意力模块
class SpatialAttention(nn.Module):def __init__(self, kernel_size=7):super().__init__()self.conv = nn.Conv2d(2, 1, kernel_size, padding=kernel_size//2, bias=False)self.sigmoid = nn.Sigmoid()def forward(self, x):avg_out = torch.mean(x, dim=1, keepdim=True)max_out, _ = torch.max(x, dim=1, keepdim=True)pool_out = torch.cat([avg_out, max_out], dim=1)attention = self.conv(pool_out)return x * self.sigmoid(attention)# CBAM模块
class CBAM(nn.Module):def __init__(self, in_channels, ratio=16, kernel_size=7):super().__init__()self.channel_attn = ChannelAttention(in_channels, ratio)self.spatial_attn = SpatialAttention(kernel_size)def forward(self, x):x = self.channel_attn(x)x = self.spatial_attn(x)return x# 数据预处理
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))
])# 加载数据集
train_dataset = datasets.CIFAR10(root='./data', train=True, download=True, transform=train_transform)
test_dataset = datasets.CIFAR10(root='./data', train=False, transform=test_transform)
train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False)# 自定义VGG16模型,插入CBAM模块
class VGG16_CBAM(nn.Module):def __init__(self, num_classes=10, pretrained=True, cbam_ratio=16, cbam_kernel=7):super().__init__()# 加载预训练VGG16self.backbone = models.vgg16(pretrained=pretrained).features# 修改首层卷积以适应32x32输入(CIFAR10)# VGG16原输入尺寸为224x224,首层卷积stride=2,这里改为stride=1self.backbone[0] = nn.Conv2d(in_channels=3, out_channels=64, kernel_size=3, stride=1, padding=1, bias=False)# 在VGG的不同block后添加CBAM模块# VGG16的block划分:# block1: 0-1 (2层卷积)# block2: 2-5 (4层卷积)# block3: 6-13 (8层卷积)# block4: 14-23 (12层卷积)# block5: 24-33 (16层卷积)self.cbam_block1 = CBAM(in_channels=64, ratio=cbam_ratio, kernel_size=cbam_kernel)self.cbam_block2 = CBAM(in_channels=128, ratio=cbam_ratio, kernel_size=cbam_kernel)self.cbam_block3 = CBAM(in_channels=256, ratio=cbam_ratio, kernel_size=cbam_kernel)self.cbam_block4 = CBAM(in_channels=512, ratio=cbam_ratio, kernel_size=cbam_kernel)self.cbam_block5 = CBAM(in_channels=512, ratio=cbam_ratio, kernel_size=cbam_kernel)# 定义自适应平均池化,将特征图统一为7x7(适应32x32输入)self.avgpool = nn.AdaptiveAvgPool2d((7, 7))# 修改分类头(VGG16原分类头为3层全连接,改为适合10分类)self.classifier = nn.Sequential(nn.Linear(512 * 7 * 7, 4096),nn.ReLU(True),nn.Dropout(),nn.Linear(4096, 4096),nn.ReLU(True),nn.Dropout(),nn.Linear(4096, num_classes),)def forward(self, x):# 主干特征提取# Block 1x = self.backbone[0](x) # 卷积层1x = self.backbone[1](x) # ReLUx = self.backbone[2](x) # 最大池化x = self.cbam_block1(x) # CBAM# Block 2x = self.backbone[3](x) # 卷积层1x = self.backbone[4](x) # ReLUx = self.backbone[5](x) # 最大池化x = self.cbam_block2(x) # CBAM# Block 3x = self.backbone[6](x) # 卷积层1x = self.backbone[7](x) # ReLUx = self.backbone[8](x) # 卷积层2x = self.backbone[9](x) # ReLUx = self.backbone[10](x) # 卷积层3x = self.backbone[11](x) # ReLUx = self.backbone[12](x) # 最大池化x = self.cbam_block3(x) # CBAM# Block 4x = self.backbone[13](x) # 卷积层1x = self.backbone[14](x) # ReLUx = self.backbone[15](x) # 卷积层2x = self.backbone[16](x) # ReLUx = self.backbone[17](x) # 卷积层3x = self.backbone[18](x) # ReLUx = self.backbone[19](x) # 最大池化x = self.cbam_block4(x) # CBAM# Block 5x = self.backbone[20](x) # 卷积层1x = self.backbone[21](x) # ReLUx = self.backbone[22](x) # 卷积层2x = self.backbone[23](x) # ReLUx = self.backbone[24](x) # 卷积层3x = self.backbone[25](x) # ReLUx = self.backbone[26](x) # 最大池化x = self.cbam_block5(x) # CBAM# 自适应平均池化 + 分类x = self.avgpool(x)x = torch.flatten(x, 1)x = self.classifier(x)return x# 分阶段训练相关函数
def set_trainable_layers(model, trainable_parts):print(f"\n---> 解冻以下部分并设为可训练: {trainable_parts}")for name, param in model.named_parameters():param.requires_grad = Falsefor part in trainable_parts:if part in name:param.requires_grad = Truebreakdef train_staged_finetuning(model, criterion, train_loader, test_loader, device, epochs):optimizer = None# 初始化历史记录列表all_iter_losses, iter_indices = [], []train_acc_history, test_acc_history = [], []train_loss_history, test_loss_history = [], []for epoch in range(1, epochs + 1):epoch_start_time = time.time()# --- 动态调整学习率和冻结层 ---if epoch == 1:print("\n" + "="*50 + "\n🚀 **阶段 1:训练注意力模块和分类头**\n" + "="*50)set_trainable_layers(model, ["cbam", "classifier"])optimizer = optim.Adam(filter(lambda p: p.requires_grad, model.parameters()), lr=1e-3)elif epoch == 6:print("\n" + "="*50 + "\n✈️ **阶段 2:解冻高层卷积块 (block4, block5)**\n" + "="*50)set_trainable_layers(model, ["cbam", "classifier", "backbone.13", "backbone.20"])optimizer = optim.Adam(filter(lambda p: p.requires_grad, model.parameters()), lr=1e-4)elif epoch == 21:print("\n" + "="*50 + "\n🛰️ **阶段 3:解冻所有层,进行全局微调**\n" + "="*50)for param in model.parameters(): param.requires_grad = Trueoptimizer = optim.Adam(model.parameters(), lr=1e-5)# --- 训练循环 ---model.train()running_loss, correct, total = 0.0, 0, 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()# 记录每个iteration的损失iter_loss = loss.item()all_iter_losses.append(iter_loss)iter_indices.append((epoch - 1) * 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个batch打印一次if (batch_idx + 1) % 100 == 0:print(f'Epoch: {epoch}/{epochs} | Batch: {batch_idx+1}/{len(train_loader)} 'f'| 单Batch损失: {iter_loss:.4f} | 累计平均损失: {running_loss/(batch_idx+1):.4f}')epoch_train_loss = running_loss / len(train_loader)epoch_train_acc = 100. * correct / totaltrain_loss_history.append(epoch_train_loss)train_acc_history.append(epoch_train_acc)# --- 测试循环 ---model.eval()test_loss, correct_test, total_test = 0, 0, 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_loss_history.append(epoch_test_loss)test_acc_history.append(epoch_test_acc)# 打印每个epoch的最终结果print(f'Epoch {epoch}/{epochs} 完成 | 耗时: {time.time() - epoch_start_time:.2f}s | 训练准确率: {epoch_train_acc:.2f}% | 测试准确率: {epoch_test_acc:.2f}%')# 训练结束后调用绘图函数print("\n训练完成! 开始绘制结果图表...")plot_iter_losses(all_iter_losses, iter_indices)plot_epoch_metrics(train_acc_history, test_acc_history, train_loss_history, test_loss_history)# 返回最终的测试准确率return epoch_test_acc# 绘图函数
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()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()# 执行训练
if __name__ == "__main__":# 检查GPU是否可用device = torch.device("cuda" if torch.cuda.is_available() else "cpu")print(f"使用设备: {device}")# 初始化模型并移至设备model = VGG16_CBAM().to(device)criterion = nn.CrossEntropyLoss()epochs = 50print("开始使用带分阶段微调策略的VGG16+CBAM模型进行训练...")final_accuracy = train_staged_finetuning(model, criterion, train_loader, test_loader, device, epochs)print(f"训练完成!最终测试准确率: {final_accuracy:.2f}%")# torch.save(model.state_dict(), 'vgg16_cbam_finetuned.pth')# print("模型已保存为: vgg16_cbam_finetuned.pth")
开始使用带分阶段微调策略的VGG16+CBAM模型进行训练...==================================================
🚀 **阶段 1:训练注意力模块和分类头**
==================================================---> 解冻以下部分并设为可训练: ['cbam', 'classifier']
Epoch: 1/50 | Batch: 100/782 | 单Batch损失: 2.3101 | 累计平均损失: 2.4302
Epoch: 1/50 | Batch: 200/782 | 单Batch损失: 2.3032 | 累计平均损失: 2.3699
Epoch: 1/50 | Batch: 300/782 | 单Batch损失: 2.2966 | 累计平均损失: 2.3478
Epoch: 1/50 | Batch: 400/782 | 单Batch损失: 1.9303 | 累计平均损失: 2.3063
Epoch: 1/50 | Batch: 500/782 | 单Batch损失: 2.0115 | 累计平均损失: 2.2489
Epoch: 1/50 | Batch: 600/782 | 单Batch损失: 1.8887 | 累计平均损失: 2.2076
Epoch: 1/50 | Batch: 700/782 | 单Batch损失: 1.8038 | 累计平均损失: 2.1734
Epoch 1/50 完成 | 耗时: 89.53s | 训练准确率: 17.01% | 测试准确率: 29.27%
Epoch: 2/50 | Batch: 100/782 | 单Batch损失: 1.9304 | 累计平均损失: 1.8841
Epoch: 2/50 | Batch: 200/782 | 单Batch损失: 1.7906 | 累计平均损失: 1.8826
Epoch: 2/50 | Batch: 300/782 | 单Batch损失: 1.6300 | 累计平均损失: 1.8814
Epoch: 2/50 | Batch: 400/782 | 单Batch损失: 1.8985 | 累计平均损失: 1.8729
Epoch: 2/50 | Batch: 500/782 | 单Batch损失: 1.8208 | 累计平均损失: 1.8653
Epoch: 2/50 | Batch: 600/782 | 单Batch损失: 1.8185 | 累计平均损失: 1.8619
Epoch: 2/50 | Batch: 700/782 | 单Batch损失: 1.8401 | 累计平均损失: 1.8600
Epoch 2/50 完成 | 耗时: 89.02s | 训练准确率: 28.63% | 测试准确率: 32.40%
Epoch: 3/50 | Batch: 100/782 | 单Batch损失: 1.8083 | 累计平均损失: 1.8151
Epoch: 3/50 | Batch: 200/782 | 单Batch损失: 1.8285 | 累计平均损失: 1.8039
Epoch: 3/50 | Batch: 300/782 | 单Batch损失: 1.7771 | 累计平均损失: 1.8082
Epoch: 3/50 | Batch: 400/782 | 单Batch损失: 1.9496 | 累计平均损失: 1.8071
Epoch: 3/50 | Batch: 500/782 | 单Batch损失: 1.9413 | 累计平均损失: 1.8076
Epoch: 3/50 | Batch: 600/782 | 单Batch损失: 1.7590 | 累计平均损失: 1.8051
Epoch: 3/50 | Batch: 700/782 | 单Batch损失: 1.7328 | 累计平均损失: 1.8038
Epoch 3/50 完成 | 耗时: 89.32s | 训练准确率: 31.20% | 测试准确率: 35.43%
Epoch: 4/50 | Batch: 100/782 | 单Batch损失: 1.6166 | 累计平均损失: 1.7678
Epoch: 4/50 | Batch: 200/782 | 单Batch损失: 1.6843 | 累计平均损失: 1.7694
Epoch: 4/50 | Batch: 300/782 | 单Batch损失: 1.7572 | 累计平均损失: 1.7663
Epoch: 4/50 | Batch: 400/782 | 单Batch损失: 1.7281 | 累计平均损失: 1.7665
Epoch: 4/50 | Batch: 500/782 | 单Batch损失: 1.7753 | 累计平均损失: 1.7654
Epoch: 4/50 | Batch: 600/782 | 单Batch损失: 1.6891 | 累计平均损失: 1.7639
Epoch: 4/50 | Batch: 700/782 | 单Batch损失: 1.8971 | 累计平均损失: 1.7635
Epoch 4/50 完成 | 耗时: 89.71s | 训练准确率: 33.04% | 测试准确率: 36.72%
Epoch: 5/50 | Batch: 100/782 | 单Batch损失: 1.7492 | 累计平均损失: 1.7552
Epoch: 5/50 | Batch: 200/782 | 单Batch损失: 1.6589 | 累计平均损失: 1.7517
Epoch: 5/50 | Batch: 300/782 | 单Batch损失: 1.5356 | 累计平均损失: 1.7445
Epoch: 5/50 | Batch: 400/782 | 单Batch损失: 1.6586 | 累计平均损失: 1.7428
Epoch: 5/50 | Batch: 500/782 | 单Batch损失: 1.7619 | 累计平均损失: 1.7471
Epoch: 5/50 | Batch: 600/782 | 单Batch损失: 1.7300 | 累计平均损失: 1.7456
Epoch: 5/50 | Batch: 700/782 | 单Batch损失: 1.7037 | 累计平均损失: 1.7391
Epoch 5/50 完成 | 耗时: 89.51s | 训练准确率: 34.42% | 测试准确率: 40.38%==================================================
✈️ **阶段 2:解冻高层卷积块 (block4, block5)**
==================================================---> 解冻以下部分并设为可训练: ['cbam', 'classifier', 'backbone.13', 'backbone.20']
Epoch: 6/50 | Batch: 100/782 | 单Batch损失: 1.6910 | 累计平均损失: 1.6960
Epoch: 6/50 | Batch: 200/782 | 单Batch损失: 1.7786 | 累计平均损失: 1.7037
Epoch: 6/50 | Batch: 300/782 | 单Batch损失: 1.7794 | 累计平均损失: 1.7001
Epoch: 6/50 | Batch: 400/782 | 单Batch损失: 1.9767 | 累计平均损失: 1.6931
Epoch: 6/50 | Batch: 500/782 | 单Batch损失: 1.7607 | 累计平均损失: 1.6925
Epoch: 6/50 | Batch: 600/782 | 单Batch损失: 1.5899 | 累计平均损失: 1.6949
Epoch: 6/50 | Batch: 700/782 | 单Batch损失: 1.7555 | 累计平均损失: 1.6929
Epoch 6/50 完成 | 耗时: 89.40s | 训练准确率: 36.68% | 测试准确率: 39.96%
Epoch: 7/50 | Batch: 100/782 | 单Batch损失: 1.8338 | 累计平均损失: 1.6806
Epoch: 7/50 | Batch: 200/782 | 单Batch损失: 1.7522 | 累计平均损失: 1.6806
Epoch: 7/50 | Batch: 300/782 | 单Batch损失: 1.7834 | 累计平均损失: 1.6821
Epoch: 7/50 | Batch: 400/782 | 单Batch损失: 1.8071 | 累计平均损失: 1.6775
Epoch: 7/50 | Batch: 500/782 | 单Batch损失: 1.9206 | 累计平均损失: 1.6783
Epoch: 7/50 | Batch: 600/782 | 单Batch损失: 1.7413 | 累计平均损失: 1.6765
Epoch: 7/50 | Batch: 700/782 | 单Batch损失: 1.6768 | 累计平均损失: 1.6759
Epoch 7/50 完成 | 耗时: 89.61s | 训练准确率: 37.05% | 测试准确率: 40.57%
Epoch: 8/50 | Batch: 100/782 | 单Batch损失: 1.6376 | 累计平均损失: 1.6555
Epoch: 8/50 | Batch: 200/782 | 单Batch损失: 1.6549 | 累计平均损失: 1.6633
Epoch: 8/50 | Batch: 300/782 | 单Batch损失: 1.6186 | 累计平均损失: 1.6687
Epoch: 8/50 | Batch: 400/782 | 单Batch损失: 1.6522 | 累计平均损失: 1.6706
Epoch: 8/50 | Batch: 500/782 | 单Batch损失: 1.8136 | 累计平均损失: 1.6699
Epoch: 8/50 | Batch: 600/782 | 单Batch损失: 1.6466 | 累计平均损失: 1.6749
Epoch: 8/50 | Batch: 700/782 | 单Batch损失: 1.6542 | 累计平均损失: 1.6745
Epoch 8/50 完成 | 耗时: 89.50s | 训练准确率: 37.04% | 测试准确率: 40.50%
Epoch: 9/50 | Batch: 100/782 | 单Batch损失: 1.7584 | 累计平均损失: 1.6565
Epoch: 9/50 | Batch: 200/782 | 单Batch损失: 1.5545 | 累计平均损失: 1.6689
Epoch: 9/50 | Batch: 300/782 | 单Batch损失: 1.6559 | 累计平均损失: 1.6710
Epoch: 9/50 | Batch: 400/782 | 单Batch损失: 1.6161 | 累计平均损失: 1.6680
Epoch: 9/50 | Batch: 500/782 | 单Batch损失: 1.8432 | 累计平均损失: 1.6679
Epoch: 9/50 | Batch: 600/782 | 单Batch损失: 1.9748 | 累计平均损失: 1.6684
Epoch: 9/50 | Batch: 700/782 | 单Batch损失: 1.5398 | 累计平均损失: 1.6697
Epoch 9/50 完成 | 耗时: 89.60s | 训练准确率: 37.32% | 测试准确率: 41.02%
Epoch: 10/50 | Batch: 100/782 | 单Batch损失: 1.6931 | 累计平均损失: 1.6791
Epoch: 10/50 | Batch: 200/782 | 单Batch损失: 1.5342 | 累计平均损失: 1.6720
Epoch: 10/50 | Batch: 300/782 | 单Batch损失: 1.8575 | 累计平均损失: 1.6719
Epoch: 10/50 | Batch: 400/782 | 单Batch损失: 1.6221 | 累计平均损失: 1.6655
Epoch: 10/50 | Batch: 500/782 | 单Batch损失: 1.8163 | 累计平均损失: 1.6650
Epoch: 10/50 | Batch: 600/782 | 单Batch损失: 1.6010 | 累计平均损失: 1.6661
Epoch: 10/50 | Batch: 700/782 | 单Batch损失: 1.6742 | 累计平均损失: 1.6649
Epoch 10/50 完成 | 耗时: 89.38s | 训练准确率: 37.80% | 测试准确率: 41.12%
Epoch: 11/50 | Batch: 100/782 | 单Batch损失: 1.6728 | 累计平均损失: 1.6667
Epoch: 11/50 | Batch: 200/782 | 单Batch损失: 1.6062 | 累计平均损失: 1.6610
Epoch: 11/50 | Batch: 300/782 | 单Batch损失: 1.8451 | 累计平均损失: 1.6645
Epoch: 11/50 | Batch: 400/782 | 单Batch损失: 1.6147 | 累计平均损失: 1.6557
Epoch: 11/50 | Batch: 500/782 | 单Batch损失: 1.6257 | 累计平均损失: 1.6567
Epoch: 11/50 | Batch: 600/782 | 单Batch损失: 1.6787 | 累计平均损失: 1.6575
Epoch: 11/50 | Batch: 700/782 | 单Batch损失: 1.4851 | 累计平均损失: 1.6587
Epoch 11/50 完成 | 耗时: 89.81s | 训练准确率: 37.65% | 测试准确率: 41.54%
Epoch: 12/50 | Batch: 100/782 | 单Batch损失: 1.6828 | 累计平均损失: 1.6503
Epoch: 12/50 | Batch: 200/782 | 单Batch损失: 1.5566 | 累计平均损失: 1.6573
Epoch: 12/50 | Batch: 300/782 | 单Batch损失: 1.3207 | 累计平均损失: 1.6618
Epoch: 12/50 | Batch: 400/782 | 单Batch损失: 1.8190 | 累计平均损失: 1.6601
Epoch: 12/50 | Batch: 500/782 | 单Batch损失: 1.7081 | 累计平均损失: 1.6579
Epoch: 12/50 | Batch: 600/782 | 单Batch损失: 1.8202 | 累计平均损失: 1.6557
Epoch: 12/50 | Batch: 700/782 | 单Batch损失: 1.7057 | 累计平均损失: 1.6558
Epoch 12/50 完成 | 耗时: 89.75s | 训练准确率: 37.94% | 测试准确率: 41.71%
Epoch: 13/50 | Batch: 100/782 | 单Batch损失: 1.8213 | 累计平均损失: 1.6590
Epoch: 13/50 | Batch: 200/782 | 单Batch损失: 1.7265 | 累计平均损失: 1.6498
Epoch: 13/50 | Batch: 300/782 | 单Batch损失: 1.5621 | 累计平均损失: 1.6535
Epoch: 13/50 | Batch: 400/782 | 单Batch损失: 1.7146 | 累计平均损失: 1.6546
Epoch: 13/50 | Batch: 500/782 | 单Batch损失: 1.7524 | 累计平均损失: 1.6532
Epoch: 13/50 | Batch: 600/782 | 单Batch损失: 1.7691 | 累计平均损失: 1.6541
Epoch: 13/50 | Batch: 700/782 | 单Batch损失: 1.7910 | 累计平均损失: 1.6547
Epoch 13/50 完成 | 耗时: 89.78s | 训练准确率: 38.25% | 测试准确率: 41.21%
Epoch: 14/50 | Batch: 100/782 | 单Batch损失: 1.4705 | 累计平均损失: 1.6436
Epoch: 14/50 | Batch: 200/782 | 单Batch损失: 1.6097 | 累计平均损失: 1.6578
Epoch: 14/50 | Batch: 300/782 | 单Batch损失: 1.8676 | 累计平均损失: 1.6509
Epoch: 14/50 | Batch: 400/782 | 单Batch损失: 1.5012 | 累计平均损失: 1.6495
Epoch: 14/50 | Batch: 500/782 | 单Batch损失: 1.7173 | 累计平均损失: 1.6467
Epoch: 14/50 | Batch: 600/782 | 单Batch损失: 1.8157 | 累计平均损失: 1.6473
Epoch: 14/50 | Batch: 700/782 | 单Batch损失: 1.6951 | 累计平均损失: 1.6460
Epoch 14/50 完成 | 耗时: 89.88s | 训练准确率: 38.47% | 测试准确率: 42.76%
Epoch: 15/50 | Batch: 100/782 | 单Batch损失: 1.8807 | 累计平均损失: 1.6637
Epoch: 15/50 | Batch: 200/782 | 单Batch损失: 1.7425 | 累计平均损失: 1.6509
Epoch: 15/50 | Batch: 300/782 | 单Batch损失: 1.7748 | 累计平均损失: 1.6464
Epoch: 15/50 | Batch: 400/782 | 单Batch损失: 1.6064 | 累计平均损失: 1.6477
Epoch: 15/50 | Batch: 500/782 | 单Batch损失: 1.7832 | 累计平均损失: 1.6457
Epoch: 15/50 | Batch: 600/782 | 单Batch损失: 1.5123 | 累计平均损失: 1.6427
Epoch: 15/50 | Batch: 700/782 | 单Batch损失: 1.7339 | 累计平均损失: 1.6411
Epoch 15/50 完成 | 耗时: 89.71s | 训练准确率: 38.58% | 测试准确率: 41.79%
Epoch: 16/50 | Batch: 100/782 | 单Batch损失: 1.6399 | 累计平均损失: 1.6450
Epoch: 16/50 | Batch: 200/782 | 单Batch损失: 1.4675 | 累计平均损失: 1.6462
Epoch: 16/50 | Batch: 300/782 | 单Batch损失: 1.6507 | 累计平均损失: 1.6475
Epoch: 16/50 | Batch: 400/782 | 单Batch损失: 1.7349 | 累计平均损失: 1.6456
Epoch: 16/50 | Batch: 500/782 | 单Batch损失: 1.5068 | 累计平均损失: 1.6448
Epoch: 16/50 | Batch: 600/782 | 单Batch损失: 1.6652 | 累计平均损失: 1.6456
Epoch: 16/50 | Batch: 700/782 | 单Batch损失: 1.7059 | 累计平均损失: 1.6432
Epoch 16/50 完成 | 耗时: 89.97s | 训练准确率: 38.85% | 测试准确率: 42.99%
Epoch: 17/50 | Batch: 100/782 | 单Batch损失: 1.5411 | 累计平均损失: 1.6375
Epoch: 17/50 | Batch: 200/782 | 单Batch损失: 1.5400 | 累计平均损失: 1.6339
Epoch: 17/50 | Batch: 300/782 | 单Batch损失: 1.7946 | 累计平均损失: 1.6303
Epoch: 17/50 | Batch: 400/782 | 单Batch损失: 1.5540 | 累计平均损失: 1.6331
Epoch: 17/50 | Batch: 500/782 | 单Batch损失: 2.0043 | 累计平均损失: 1.6346
Epoch: 17/50 | Batch: 600/782 | 单Batch损失: 1.7687 | 累计平均损失: 1.6350
Epoch: 17/50 | Batch: 700/782 | 单Batch损失: 1.5644 | 累计平均损失: 1.6310
Epoch 17/50 完成 | 耗时: 89.71s | 训练准确率: 39.24% | 测试准确率: 43.48%
Epoch: 18/50 | Batch: 100/782 | 单Batch损失: 1.7887 | 累计平均损失: 1.6286
Epoch: 18/50 | Batch: 200/782 | 单Batch损失: 1.6604 | 累计平均损失: 1.6377
Epoch: 18/50 | Batch: 300/782 | 单Batch损失: 1.4243 | 累计平均损失: 1.6323
Epoch: 18/50 | Batch: 400/782 | 单Batch损失: 1.7148 | 累计平均损失: 1.6290
Epoch: 18/50 | Batch: 500/782 | 单Batch损失: 1.5827 | 累计平均损失: 1.6318
Epoch: 18/50 | Batch: 600/782 | 单Batch损失: 1.5513 | 累计平均损失: 1.6309
Epoch: 18/50 | Batch: 700/782 | 单Batch损失: 1.3999 | 累计平均损失: 1.6289
Epoch 18/50 完成 | 耗时: 89.86s | 训练准确率: 39.39% | 测试准确率: 43.47%
Epoch: 19/50 | Batch: 100/782 | 单Batch损失: 1.5951 | 累计平均损失: 1.6383
Epoch: 19/50 | Batch: 200/782 | 单Batch损失: 1.7524 | 累计平均损失: 1.6352
Epoch: 19/50 | Batch: 300/782 | 单Batch损失: 1.6052 | 累计平均损失: 1.6315
Epoch: 19/50 | Batch: 400/782 | 单Batch损失: 1.7160 | 累计平均损失: 1.6289
Epoch: 19/50 | Batch: 500/782 | 单Batch损失: 1.4398 | 累计平均损失: 1.6305
Epoch: 19/50 | Batch: 600/782 | 单Batch损失: 1.7699 | 累计平均损失: 1.6304
Epoch: 19/50 | Batch: 700/782 | 单Batch损失: 1.6108 | 累计平均损失: 1.6297
Epoch 19/50 完成 | 耗时: 90.22s | 训练准确率: 39.06% | 测试准确率: 43.62%
Epoch: 20/50 | Batch: 100/782 | 单Batch损失: 1.5719 | 累计平均损失: 1.6183
Epoch: 20/50 | Batch: 200/782 | 单Batch损失: 1.4436 | 累计平均损失: 1.6234
Epoch: 20/50 | Batch: 300/782 | 单Batch损失: 1.9828 | 累计平均损失: 1.6236
Epoch: 20/50 | Batch: 400/782 | 单Batch损失: 1.5711 | 累计平均损失: 1.6265
Epoch: 20/50 | Batch: 500/782 | 单Batch损失: 1.5525 | 累计平均损失: 1.6298
Epoch: 20/50 | Batch: 600/782 | 单Batch损失: 1.7373 | 累计平均损失: 1.6254
Epoch: 20/50 | Batch: 700/782 | 单Batch损失: 1.6017 | 累计平均损失: 1.6263
Epoch 20/50 完成 | 耗时: 145.84s | 训练准确率: 39.19% | 测试准确率: 43.78%==================================================
🛰️ **阶段 3:解冻所有层,进行全局微调**
==================================================
Epoch: 21/50 | Batch: 100/782 | 单Batch损失: 1.5375 | 累计平均损失: 1.6748
Epoch: 21/50 | Batch: 200/782 | 单Batch损失: 1.5914 | 累计平均损失: 1.6641
Epoch: 21/50 | Batch: 300/782 | 单Batch损失: 1.5260 | 累计平均损失: 1.6518
Epoch: 21/50 | Batch: 400/782 | 单Batch损失: 1.5065 | 累计平均损失: 1.6473
Epoch: 21/50 | Batch: 500/782 | 单Batch损失: 1.3598 | 累计平均损失: 1.6414
Epoch: 21/50 | Batch: 600/782 | 单Batch损失: 1.6249 | 累计平均损失: 1.6361
Epoch: 21/50 | Batch: 700/782 | 单Batch损失: 1.6314 | 累计平均损失: 1.6299
Epoch 21/50 完成 | 耗时: 358.50s | 训练准确率: 39.83% | 测试准确率: 45.74%
Epoch: 22/50 | Batch: 100/782 | 单Batch损失: 1.4406 | 累计平均损失: 1.5696
Epoch: 22/50 | Batch: 200/782 | 单Batch损失: 1.3031 | 累计平均损失: 1.5643
Epoch: 22/50 | Batch: 300/782 | 单Batch损失: 1.5387 | 累计平均损失: 1.5710
Epoch: 22/50 | Batch: 400/782 | 单Batch损失: 1.6123 | 累计平均损失: 1.5678
Epoch: 22/50 | Batch: 500/782 | 单Batch损失: 1.6763 | 累计平均损失: 1.5713
Epoch: 22/50 | Batch: 600/782 | 单Batch损失: 1.4971 | 累计平均损失: 1.5687
Epoch: 22/50 | Batch: 700/782 | 单Batch损失: 1.4281 | 累计平均损失: 1.5673
Epoch 22/50 完成 | 耗时: 139.15s | 训练准确率: 42.26% | 测试准确率: 48.40%
Epoch: 23/50 | Batch: 100/782 | 单Batch损失: 1.7373 | 累计平均损失: 1.5282
Epoch: 23/50 | Batch: 200/782 | 单Batch损失: 1.5921 | 累计平均损失: 1.5333
Epoch: 23/50 | Batch: 300/782 | 单Batch损失: 1.5135 | 累计平均损失: 1.5304
Epoch: 23/50 | Batch: 400/782 | 单Batch损失: 1.7050 | 累计平均损失: 1.5248
Epoch: 23/50 | Batch: 500/782 | 单Batch损失: 1.4466 | 累计平均损失: 1.5214
Epoch: 23/50 | Batch: 600/782 | 单Batch损失: 1.4472 | 累计平均损失: 1.5176
Epoch: 23/50 | Batch: 700/782 | 单Batch损失: 1.4583 | 累计平均损失: 1.5161
Epoch 23/50 完成 | 耗时: 145.08s | 训练准确率: 44.48% | 测试准确率: 50.09%
Epoch: 24/50 | Batch: 100/782 | 单Batch损失: 1.5711 | 累计平均损失: 1.4844
Epoch: 24/50 | Batch: 200/782 | 单Batch损失: 1.5025 | 累计平均损失: 1.4788
Epoch: 24/50 | Batch: 300/782 | 单Batch损失: 1.5974 | 累计平均损失: 1.4741
Epoch: 24/50 | Batch: 400/782 | 单Batch损失: 1.4165 | 累计平均损失: 1.4760
Epoch: 24/50 | Batch: 500/782 | 单Batch损失: 1.3738 | 累计平均损失: 1.4748
Epoch: 24/50 | Batch: 600/782 | 单Batch损失: 1.6225 | 累计平均损失: 1.4694
Epoch: 24/50 | Batch: 700/782 | 单Batch损失: 1.2236 | 累计平均损失: 1.4661
Epoch 24/50 完成 | 耗时: 167.85s | 训练准确率: 46.01% | 测试准确率: 53.11%
Epoch: 25/50 | Batch: 100/782 | 单Batch损失: 1.2662 | 累计平均损失: 1.4317
Epoch: 25/50 | Batch: 200/782 | 单Batch损失: 1.4540 | 累计平均损失: 1.4259
Epoch: 25/50 | Batch: 300/782 | 单Batch损失: 1.6070 | 累计平均损失: 1.4368
Epoch: 25/50 | Batch: 400/782 | 单Batch损失: 1.4074 | 累计平均损失: 1.4362
Epoch: 25/50 | Batch: 500/782 | 单Batch损失: 1.3526 | 累计平均损失: 1.4365
Epoch: 25/50 | Batch: 600/782 | 单Batch损失: 1.4035 | 累计平均损失: 1.4302
Epoch: 25/50 | Batch: 700/782 | 单Batch损失: 1.5354 | 累计平均损失: 1.4277
Epoch 25/50 完成 | 耗时: 125.41s | 训练准确率: 47.53% | 测试准确率: 53.09%
Epoch: 26/50 | Batch: 100/782 | 单Batch损失: 1.5295 | 累计平均损失: 1.3907
Epoch: 26/50 | Batch: 200/782 | 单Batch损失: 1.2624 | 累计平均损失: 1.3972
Epoch: 26/50 | Batch: 300/782 | 单Batch损失: 1.2366 | 累计平均损失: 1.4012
Epoch: 26/50 | Batch: 400/782 | 单Batch损失: 1.3859 | 累计平均损失: 1.3944
Epoch: 26/50 | Batch: 500/782 | 单Batch损失: 1.3752 | 累计平均损失: 1.3984
Epoch: 26/50 | Batch: 600/782 | 单Batch损失: 1.3279 | 累计平均损失: 1.3958
Epoch: 26/50 | Batch: 700/782 | 单Batch损失: 1.1614 | 累计平均损失: 1.3976
Epoch 26/50 完成 | 耗时: 103.87s | 训练准确率: 48.89% | 测试准确率: 54.46%
Epoch: 27/50 | Batch: 100/782 | 单Batch损失: 1.6356 | 累计平均损失: 1.3877
Epoch: 27/50 | Batch: 200/782 | 单Batch损失: 1.2166 | 累计平均损失: 1.3871
Epoch: 27/50 | Batch: 300/782 | 单Batch损失: 1.2658 | 累计平均损失: 1.3725
Epoch: 27/50 | Batch: 400/782 | 单Batch损失: 1.4379 | 累计平均损失: 1.3756
Epoch: 27/50 | Batch: 500/782 | 单Batch损失: 1.5214 | 累计平均损失: 1.3729
Epoch: 27/50 | Batch: 600/782 | 单Batch损失: 1.4332 | 累计平均损失: 1.3722
Epoch: 27/50 | Batch: 700/782 | 单Batch损失: 1.2371 | 累计平均损失: 1.3688
Epoch 27/50 完成 | 耗时: 104.16s | 训练准确率: 50.12% | 测试准确率: 56.66%
Epoch: 28/50 | Batch: 100/782 | 单Batch损失: 1.4985 | 累计平均损失: 1.3441
Epoch: 28/50 | Batch: 200/782 | 单Batch损失: 1.2227 | 累计平均损失: 1.3391
Epoch: 28/50 | Batch: 300/782 | 单Batch损失: 1.2905 | 累计平均损失: 1.3331
Epoch: 28/50 | Batch: 400/782 | 单Batch损失: 1.2537 | 累计平均损失: 1.3316
Epoch: 28/50 | Batch: 500/782 | 单Batch损失: 1.3135 | 累计平均损失: 1.3327
Epoch: 28/50 | Batch: 600/782 | 单Batch损失: 1.4114 | 累计平均损失: 1.3287
Epoch: 28/50 | Batch: 700/782 | 单Batch损失: 1.3873 | 累计平均损失: 1.3257
Epoch 28/50 完成 | 耗时: 103.69s | 训练准确率: 52.04% | 测试准确率: 56.92%
Epoch: 29/50 | Batch: 100/782 | 单Batch损失: 1.2073 | 累计平均损失: 1.3025
Epoch: 29/50 | Batch: 200/782 | 单Batch损失: 1.1623 | 累计平均损失: 1.3018
Epoch: 29/50 | Batch: 300/782 | 单Batch损失: 1.3617 | 累计平均损失: 1.3071
Epoch: 29/50 | Batch: 400/782 | 单Batch损失: 1.2591 | 累计平均损失: 1.3007
Epoch: 29/50 | Batch: 500/782 | 单Batch损失: 1.1812 | 累计平均损失: 1.2976
Epoch: 29/50 | Batch: 600/782 | 单Batch损失: 1.2738 | 累计平均损失: 1.2936
Epoch: 29/50 | Batch: 700/782 | 单Batch损失: 1.2254 | 累计平均损失: 1.2948
Epoch 29/50 完成 | 耗时: 103.97s | 训练准确率: 53.05% | 测试准确率: 58.32%
Epoch: 30/50 | Batch: 100/782 | 单Batch损失: 1.2509 | 累计平均损失: 1.2716
Epoch: 30/50 | Batch: 200/782 | 单Batch损失: 1.0087 | 累计平均损失: 1.2660
Epoch: 30/50 | Batch: 300/782 | 单Batch损失: 1.4460 | 累计平均损失: 1.2702
Epoch: 30/50 | Batch: 400/782 | 单Batch损失: 1.2532 | 累计平均损失: 1.2750
Epoch: 30/50 | Batch: 500/782 | 单Batch损失: 1.1669 | 累计平均损失: 1.2759
Epoch: 30/50 | Batch: 600/782 | 单Batch损失: 1.3962 | 累计平均损失: 1.2733
Epoch: 30/50 | Batch: 700/782 | 单Batch损失: 1.3559 | 累计平均损失: 1.2685
Epoch 30/50 完成 | 耗时: 103.51s | 训练准确率: 53.97% | 测试准确率: 60.02%
Epoch: 31/50 | Batch: 100/782 | 单Batch损失: 1.3192 | 累计平均损失: 1.2216
Epoch: 31/50 | Batch: 200/782 | 单Batch损失: 0.9516 | 累计平均损失: 1.2306
Epoch: 31/50 | Batch: 300/782 | 单Batch损失: 1.0789 | 累计平均损失: 1.2371
Epoch: 31/50 | Batch: 400/782 | 单Batch损失: 1.6001 | 累计平均损失: 1.2358
Epoch: 31/50 | Batch: 500/782 | 单Batch损失: 1.1295 | 累计平均损失: 1.2423
Epoch: 31/50 | Batch: 600/782 | 单Batch损失: 1.1397 | 累计平均损失: 1.2437
Epoch: 31/50 | Batch: 700/782 | 单Batch损失: 1.2205 | 累计平均损失: 1.2369
Epoch 31/50 完成 | 耗时: 103.41s | 训练准确率: 55.02% | 测试准确率: 60.27%
Epoch: 32/50 | Batch: 100/782 | 单Batch损失: 1.2114 | 累计平均损失: 1.2333
Epoch: 32/50 | Batch: 200/782 | 单Batch损失: 1.2135 | 累计平均损失: 1.2166
Epoch: 32/50 | Batch: 300/782 | 单Batch损失: 1.1274 | 累计平均损失: 1.2137
Epoch: 32/50 | Batch: 400/782 | 单Batch损失: 1.1107 | 累计平均损失: 1.2162
Epoch: 32/50 | Batch: 500/782 | 单Batch损失: 1.0336 | 累计平均损失: 1.2177
Epoch: 32/50 | Batch: 600/782 | 单Batch损失: 1.1582 | 累计平均损失: 1.2209
Epoch: 32/50 | Batch: 700/782 | 单Batch损失: 1.1259 | 累计平均损失: 1.2204
Epoch 32/50 完成 | 耗时: 103.22s | 训练准确率: 56.05% | 测试准确率: 61.08%
Epoch: 33/50 | Batch: 100/782 | 单Batch损失: 1.0265 | 累计平均损失: 1.2018
Epoch: 33/50 | Batch: 200/782 | 单Batch损失: 1.2660 | 累计平均损失: 1.2005
Epoch: 33/50 | Batch: 300/782 | 单Batch损失: 1.3394 | 累计平均损失: 1.2036
Epoch: 33/50 | Batch: 400/782 | 单Batch损失: 1.2453 | 累计平均损失: 1.2002
Epoch: 33/50 | Batch: 500/782 | 单Batch损失: 1.3451 | 累计平均损失: 1.1998
Epoch: 33/50 | Batch: 600/782 | 单Batch损失: 1.3161 | 累计平均损失: 1.1990
Epoch: 33/50 | Batch: 700/782 | 单Batch损失: 1.0502 | 累计平均损失: 1.1964
Epoch 33/50 完成 | 耗时: 103.56s | 训练准确率: 56.97% | 测试准确率: 62.43%
Epoch: 34/50 | Batch: 100/782 | 单Batch损失: 0.9808 | 累计平均损失: 1.1889
Epoch: 34/50 | Batch: 200/782 | 单Batch损失: 1.1924 | 累计平均损失: 1.1784
Epoch: 34/50 | Batch: 300/782 | 单Batch损失: 1.2694 | 累计平均损失: 1.1791
Epoch: 34/50 | Batch: 400/782 | 单Batch损失: 0.9651 | 累计平均损失: 1.1710
Epoch: 34/50 | Batch: 500/782 | 单Batch损失: 1.0168 | 累计平均损失: 1.1715
Epoch: 34/50 | Batch: 600/782 | 单Batch损失: 1.1782 | 累计平均损失: 1.1698
Epoch: 34/50 | Batch: 700/782 | 单Batch损失: 1.2202 | 累计平均损失: 1.1720
Epoch 34/50 完成 | 耗时: 103.71s | 训练准确率: 58.06% | 测试准确率: 63.69%
Epoch: 35/50 | Batch: 100/782 | 单Batch损失: 1.1069 | 累计平均损失: 1.1546
Epoch: 35/50 | Batch: 200/782 | 单Batch损失: 1.0106 | 累计平均损失: 1.1540
Epoch: 35/50 | Batch: 300/782 | 单Batch损失: 1.0398 | 累计平均损失: 1.1483
Epoch: 35/50 | Batch: 400/782 | 单Batch损失: 1.3557 | 累计平均损失: 1.1514
Epoch: 35/50 | Batch: 500/782 | 单Batch损失: 1.0365 | 累计平均损失: 1.1549
Epoch: 35/50 | Batch: 600/782 | 单Batch损失: 1.0437 | 累计平均损失: 1.1550
Epoch: 35/50 | Batch: 700/782 | 单Batch损失: 0.9792 | 累计平均损失: 1.1535
Epoch 35/50 完成 | 耗时: 104.77s | 训练准确率: 58.52% | 测试准确率: 63.94%
Epoch: 36/50 | Batch: 100/782 | 单Batch损失: 0.9819 | 累计平均损失: 1.1495
Epoch: 36/50 | Batch: 200/782 | 单Batch损失: 1.2603 | 累计平均损失: 1.1403
Epoch: 36/50 | Batch: 300/782 | 单Batch损失: 1.2249 | 累计平均损失: 1.1345
Epoch: 36/50 | Batch: 400/782 | 单Batch损失: 0.9390 | 累计平均损失: 1.1313
Epoch: 36/50 | Batch: 500/782 | 单Batch损失: 1.1931 | 累计平均损失: 1.1311
Epoch: 36/50 | Batch: 600/782 | 单Batch损失: 1.0984 | 累计平均损失: 1.1323
Epoch: 36/50 | Batch: 700/782 | 单Batch损失: 1.0155 | 累计平均损失: 1.1307
Epoch 36/50 完成 | 耗时: 104.21s | 训练准确率: 59.34% | 测试准确率: 64.89%
Epoch: 37/50 | Batch: 100/782 | 单Batch损失: 0.9023 | 累计平均损失: 1.1291
Epoch: 37/50 | Batch: 200/782 | 单Batch损失: 1.0426 | 累计平均损失: 1.1107
Epoch: 37/50 | Batch: 300/782 | 单Batch损失: 1.0703 | 累计平均损失: 1.1109
Epoch: 37/50 | Batch: 400/782 | 单Batch损失: 1.1136 | 累计平均损失: 1.1195
Epoch: 37/50 | Batch: 500/782 | 单Batch损失: 0.8542 | 累计平均损失: 1.1169
Epoch: 37/50 | Batch: 600/782 | 单Batch损失: 1.1600 | 累计平均损失: 1.1173
Epoch: 37/50 | Batch: 700/782 | 单Batch损失: 1.0235 | 累计平均损失: 1.1214
Epoch 37/50 完成 | 耗时: 103.67s | 训练准确率: 59.73% | 测试准确率: 65.42%
Epoch: 38/50 | Batch: 100/782 | 单Batch损失: 0.9341 | 累计平均损失: 1.0986
Epoch: 38/50 | Batch: 200/782 | 单Batch损失: 1.0586 | 累计平均损失: 1.0983
Epoch: 38/50 | Batch: 300/782 | 单Batch损失: 1.1177 | 累计平均损失: 1.0957
Epoch: 38/50 | Batch: 400/782 | 单Batch损失: 0.9379 | 累计平均损失: 1.0981
Epoch: 38/50 | Batch: 500/782 | 单Batch损失: 1.2176 | 累计平均损失: 1.0972
Epoch: 38/50 | Batch: 600/782 | 单Batch损失: 0.9994 | 累计平均损失: 1.0974
Epoch: 38/50 | Batch: 700/782 | 单Batch损失: 1.0881 | 累计平均损失: 1.0968
Epoch 38/50 完成 | 耗时: 103.89s | 训练准确率: 60.98% | 测试准确率: 66.82%
Epoch: 39/50 | Batch: 100/782 | 单Batch损失: 0.9861 | 累计平均损失: 1.0794
Epoch: 39/50 | Batch: 200/782 | 单Batch损失: 1.0565 | 累计平均损失: 1.0718
Epoch: 39/50 | Batch: 300/782 | 单Batch损失: 1.3442 | 累计平均损失: 1.0747
Epoch: 39/50 | Batch: 400/782 | 单Batch损失: 0.9232 | 累计平均损失: 1.0774
Epoch: 39/50 | Batch: 500/782 | 单Batch损失: 0.9349 | 累计平均损失: 1.0767
Epoch: 39/50 | Batch: 600/782 | 单Batch损失: 1.0748 | 累计平均损失: 1.0751
Epoch: 39/50 | Batch: 700/782 | 单Batch损失: 0.9362 | 累计平均损失: 1.0743
Epoch 39/50 完成 | 耗时: 104.03s | 训练准确率: 61.64% | 测试准确率: 66.75%
Epoch: 40/50 | Batch: 100/782 | 单Batch损失: 1.0493 | 累计平均损失: 1.0622
Epoch: 40/50 | Batch: 200/782 | 单Batch损失: 1.1184 | 累计平均损失: 1.0536
Epoch: 40/50 | Batch: 300/782 | 单Batch损失: 1.0571 | 累计平均损失: 1.0555
Epoch: 40/50 | Batch: 400/782 | 单Batch损失: 0.9694 | 累计平均损失: 1.0565
Epoch: 40/50 | Batch: 500/782 | 单Batch损失: 1.0618 | 累计平均损失: 1.0630
Epoch: 40/50 | Batch: 600/782 | 单Batch损失: 1.0961 | 累计平均损失: 1.0624
Epoch: 40/50 | Batch: 700/782 | 单Batch损失: 0.9604 | 累计平均损失: 1.0621
Epoch 40/50 完成 | 耗时: 103.98s | 训练准确率: 62.20% | 测试准确率: 67.33%
Epoch: 41/50 | Batch: 100/782 | 单Batch损失: 1.0718 | 累计平均损失: 1.0490
Epoch: 41/50 | Batch: 200/782 | 单Batch损失: 0.9663 | 累计平均损失: 1.0425
Epoch: 41/50 | Batch: 300/782 | 单Batch损失: 1.1258 | 累计平均损失: 1.0431
Epoch: 41/50 | Batch: 400/782 | 单Batch损失: 1.2161 | 累计平均损失: 1.0422
Epoch: 41/50 | Batch: 500/782 | 单Batch损失: 1.2656 | 累计平均损失: 1.0450
Epoch: 41/50 | Batch: 600/782 | 单Batch损失: 0.9526 | 累计平均损失: 1.0439
Epoch: 41/50 | Batch: 700/782 | 单Batch损失: 1.1146 | 累计平均损失: 1.0419
Epoch 41/50 完成 | 耗时: 103.93s | 训练准确率: 62.84% | 测试准确率: 68.32%
Epoch: 42/50 | Batch: 100/782 | 单Batch损失: 1.1225 | 累计平均损失: 1.0166
Epoch: 42/50 | Batch: 200/782 | 单Batch损失: 1.4528 | 累计平均损失: 1.0204
Epoch: 42/50 | Batch: 300/782 | 单Batch损失: 0.8357 | 累计平均损失: 1.0233
Epoch: 42/50 | Batch: 400/782 | 单Batch损失: 0.9994 | 累计平均损失: 1.0173
Epoch: 42/50 | Batch: 500/782 | 单Batch损失: 0.8874 | 累计平均损失: 1.0215
Epoch: 42/50 | Batch: 600/782 | 单Batch损失: 1.0431 | 累计平均损失: 1.0197
Epoch: 42/50 | Batch: 700/782 | 单Batch损失: 0.9171 | 累计平均损失: 1.0194
Epoch 42/50 完成 | 耗时: 103.70s | 训练准确率: 63.47% | 测试准确率: 69.52%
Epoch: 43/50 | Batch: 100/782 | 单Batch损失: 1.0462 | 累计平均损失: 1.0020
Epoch: 43/50 | Batch: 200/782 | 单Batch损失: 1.0798 | 累计平均损失: 0.9965
Epoch: 43/50 | Batch: 300/782 | 单Batch损失: 0.7681 | 累计平均损失: 1.0022
Epoch: 43/50 | Batch: 400/782 | 单Batch损失: 1.0570 | 累计平均损失: 1.0034
Epoch: 43/50 | Batch: 500/782 | 单Batch损失: 0.8278 | 累计平均损失: 1.0021
Epoch: 43/50 | Batch: 600/782 | 单Batch损失: 1.0983 | 累计平均损失: 1.0032
Epoch: 43/50 | Batch: 700/782 | 单Batch损失: 1.0840 | 累计平均损失: 1.0058
Epoch 43/50 完成 | 耗时: 104.06s | 训练准确率: 64.41% | 测试准确率: 70.40%
Epoch: 44/50 | Batch: 100/782 | 单Batch损失: 1.2626 | 累计平均损失: 1.0018
Epoch: 44/50 | Batch: 200/782 | 单Batch损失: 0.9411 | 累计平均损失: 1.0004
Epoch: 44/50 | Batch: 300/782 | 单Batch损失: 0.8847 | 累计平均损失: 0.9961
Epoch: 44/50 | Batch: 400/782 | 单Batch损失: 0.8941 | 累计平均损失: 0.9930
Epoch: 44/50 | Batch: 500/782 | 单Batch损失: 1.2608 | 累计平均损失: 0.9939
Epoch: 44/50 | Batch: 600/782 | 单Batch损失: 1.0509 | 累计平均损失: 0.9953
Epoch: 44/50 | Batch: 700/782 | 单Batch损失: 0.7521 | 累计平均损失: 0.9923
Epoch 44/50 完成 | 耗时: 103.08s | 训练准确率: 64.84% | 测试准确率: 69.95%
Epoch: 45/50 | Batch: 100/782 | 单Batch损失: 1.0733 | 累计平均损失: 0.9764
Epoch: 45/50 | Batch: 200/782 | 单Batch损失: 0.8736 | 累计平均损失: 0.9922
Epoch: 45/50 | Batch: 300/782 | 单Batch损失: 0.8859 | 累计平均损失: 0.9831
Epoch: 45/50 | Batch: 400/782 | 单Batch损失: 0.9727 | 累计平均损失: 0.9790
Epoch: 45/50 | Batch: 500/782 | 单Batch损失: 1.1235 | 累计平均损失: 0.9765
Epoch: 45/50 | Batch: 600/782 | 单Batch损失: 1.0893 | 累计平均损失: 0.9764
Epoch: 45/50 | Batch: 700/782 | 单Batch损失: 1.2580 | 累计平均损失: 0.9766
Epoch 45/50 完成 | 耗时: 103.63s | 训练准确率: 65.28% | 测试准确率: 70.83%
Epoch: 46/50 | Batch: 100/782 | 单Batch损失: 1.0892 | 累计平均损失: 0.9692
Epoch: 46/50 | Batch: 200/782 | 单Batch损失: 1.5022 | 累计平均损失: 0.9683
Epoch: 46/50 | Batch: 300/782 | 单Batch损失: 1.0187 | 累计平均损失: 0.9694
Epoch: 46/50 | Batch: 400/782 | 单Batch损失: 0.9937 | 累计平均损失: 0.9654
Epoch: 46/50 | Batch: 500/782 | 单Batch损失: 0.8876 | 累计平均损失: 0.9617
Epoch: 46/50 | Batch: 600/782 | 单Batch损失: 0.9555 | 累计平均损失: 0.9605
Epoch: 46/50 | Batch: 700/782 | 单Batch损失: 1.0281 | 累计平均损失: 0.9576
Epoch 46/50 完成 | 耗时: 103.37s | 训练准确率: 66.11% | 测试准确率: 71.34%
Epoch: 47/50 | Batch: 100/782 | 单Batch损失: 0.9091 | 累计平均损失: 0.9401
Epoch: 47/50 | Batch: 200/782 | 单Batch损失: 0.8477 | 累计平均损失: 0.9442
Epoch: 47/50 | Batch: 300/782 | 单Batch损失: 1.0549 | 累计平均损失: 0.9445
Epoch: 47/50 | Batch: 400/782 | 单Batch损失: 0.8191 | 累计平均损失: 0.9469
Epoch: 47/50 | Batch: 500/782 | 单Batch损失: 0.9161 | 累计平均损失: 0.9449
Epoch: 47/50 | Batch: 600/782 | 单Batch损失: 0.9288 | 累计平均损失: 0.9436
Epoch: 47/50 | Batch: 700/782 | 单Batch损失: 0.9786 | 累计平均损失: 0.9459
Epoch 47/50 完成 | 耗时: 103.67s | 训练准确率: 66.68% | 测试准确率: 71.58%
Epoch: 48/50 | Batch: 100/782 | 单Batch损失: 1.1209 | 累计平均损失: 0.9506
Epoch: 48/50 | Batch: 200/782 | 单Batch损失: 0.8807 | 累计平均损失: 0.9380
Epoch: 48/50 | Batch: 300/782 | 单Batch损失: 0.9419 | 累计平均损失: 0.9419
Epoch: 48/50 | Batch: 400/782 | 单Batch损失: 0.8237 | 累计平均损失: 0.9398
Epoch: 48/50 | Batch: 500/782 | 单Batch损失: 0.8805 | 累计平均损失: 0.9366
Epoch: 48/50 | Batch: 600/782 | 单Batch损失: 0.6726 | 累计平均损失: 0.9335
Epoch: 48/50 | Batch: 700/782 | 单Batch损失: 0.7858 | 累计平均损失: 0.9355
Epoch 48/50 完成 | 耗时: 103.71s | 训练准确率: 66.69% | 测试准确率: 72.30%
Epoch: 49/50 | Batch: 100/782 | 单Batch损失: 1.1450 | 累计平均损失: 0.9331
Epoch: 49/50 | Batch: 200/782 | 单Batch损失: 1.3879 | 累计平均损失: 0.9209
Epoch: 49/50 | Batch: 300/782 | 单Batch损失: 1.0641 | 累计平均损失: 0.9308
Epoch: 49/50 | Batch: 400/782 | 单Batch损失: 0.8324 | 累计平均损失: 0.9271
Epoch: 49/50 | Batch: 500/782 | 单Batch损失: 1.1215 | 累计平均损失: 0.9247
Epoch: 49/50 | Batch: 600/782 | 单Batch损失: 0.8745 | 累计平均损失: 0.9225
Epoch: 49/50 | Batch: 700/782 | 单Batch损失: 1.0913 | 累计平均损失: 0.9221
Epoch 49/50 完成 | 耗时: 103.84s | 训练准确率: 67.56% | 测试准确率: 73.28%
Epoch: 50/50 | Batch: 100/782 | 单Batch损失: 0.9642 | 累计平均损失: 0.9004
Epoch: 50/50 | Batch: 200/782 | 单Batch损失: 0.6193 | 累计平均损失: 0.9043
Epoch: 50/50 | Batch: 300/782 | 单Batch损失: 0.9914 | 累计平均损失: 0.9013
Epoch: 50/50 | Batch: 400/782 | 单Batch损失: 0.9276 | 累计平均损失: 0.8959
Epoch: 50/50 | Batch: 500/782 | 单Batch损失: 0.7624 | 累计平均损失: 0.9004
Epoch: 50/50 | Batch: 600/782 | 单Batch损失: 0.8452 | 累计平均损失: 0.9008
Epoch: 50/50 | Batch: 700/782 | 单Batch损失: 1.2099 | 累计平均损失: 0.9031
Epoch 50/50 完成 | 耗时: 104.05s | 训练准确率: 68.19% | 测试准确率: 73.41%训练完成! 开始绘制结果图表...
训练完成!最终测试准确率: 73.41%
@浙大疏锦行