python打卡训练营打卡记录day49

知识点回顾:

  1. 通道注意力模块复习
  2. 空间注意力模块
  3. CBAM的定义

**作业:**尝试对今天的模型检查参数数目,并用tensorboard查看训练过程

python 复制代码
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
from torch.utils.tensorboard import SummaryWriter  # 导入TensorBoard
import time

# 设置中文字体支持
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}")

# 数据预处理
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)

# 定义CBAM模块
class ChannelAttention(nn.Module):
    def __init__(self, in_channels, reduction_ratio=16):
        super(ChannelAttention, self).__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.max_pool = nn.AdaptiveMaxPool2d(1)
        self.fc = nn.Sequential(
            nn.Linear(in_channels, in_channels // reduction_ratio),
            nn.ReLU(inplace=True),
            nn.Linear(in_channels // reduction_ratio, in_channels)
        )
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        avg_out = self.fc(self.avg_pool(x).view(x.size(0), -1))
        max_out = self.fc(self.max_pool(x).view(x.size(0), -1))
        out = avg_out + max_out
        return self.sigmoid(out).unsqueeze(2).unsqueeze(3)

class SpatialAttention(nn.Module):
    def __init__(self, kernel_size=7):
        super(SpatialAttention, self).__init__()
        self.conv = nn.Conv2d(2, 1, kernel_size, padding=kernel_size//2)
        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)
        combined = torch.cat([avg_out, max_out], dim=1)
        return self.sigmoid(self.conv(combined))

class CBAM(nn.Module):
    def __init__(self, in_channels, reduction_ratio=16):
        super(CBAM, self).__init__()
        self.channel_att = ChannelAttention(in_channels, reduction_ratio)
        self.spatial_att = SpatialAttention()

    def forward(self, x):
        out = self.channel_att(x) * x
        out = self.spatial_att(out) * out
        return out

# 定义带有CBAM的CNN模型
class CBAM_CNN(nn.Module):
    def __init__(self):
        super(CBAM_CNN, self).__init__()
        
        # ---------------------- 第一个卷积块(带CBAM) ----------------------
        self.conv1 = nn.Conv2d(3, 32, kernel_size=3, padding=1)
        self.bn1 = nn.BatchNorm2d(32) # 批归一化
        self.relu1 = nn.ReLU()
        self.pool1 = nn.MaxPool2d(kernel_size=2)
        self.cbam1 = CBAM(in_channels=32)  # 在第一个卷积块后添加CBAM
        
        # ---------------------- 第二个卷积块(带CBAM) ----------------------
        self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1)
        self.bn2 = nn.BatchNorm2d(64)
        self.relu2 = nn.ReLU()
        self.pool2 = nn.MaxPool2d(kernel_size=2)
        self.cbam2 = CBAM(in_channels=64)  # 在第二个卷积块后添加CBAM
        
        # ---------------------- 第三个卷积块(带CBAM) ----------------------
        self.conv3 = nn.Conv2d(64, 128, kernel_size=3, padding=1)
        self.bn3 = nn.BatchNorm2d(128)
        self.relu3 = nn.ReLU()
        self.pool3 = nn.MaxPool2d(kernel_size=2)
        self.cbam3 = CBAM(in_channels=128)  # 在第三个卷积块后添加CBAM
        
        # ---------------------- 全连接层 ----------------------
        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):
        # 第一个卷积块
        x = self.conv1(x)
        x = self.bn1(x)
        x = self.relu1(x)
        x = self.pool1(x)
        x = self.cbam1(x)  # 应用CBAM
        
        # 第二个卷积块
        x = self.conv2(x)
        x = self.bn2(x)
        x = self.relu2(x)
        x = self.pool2(x)
        x = self.cbam2(x)  # 应用CBAM
        
        # 第三个卷积块
        x = self.conv3(x)
        x = self.bn3(x)
        x = self.relu3(x)
        x = self.pool3(x)
        x = self.cbam3(x)  # 应用CBAM
        
        # 全连接层
        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 = CBAM_CNN().to(device)

# ==================== 计算模型参数数量 ====================
def count_parameters(model):
    return sum(p.numel() for p in model.parameters() if p.requires_grad)

total_params = count_parameters(model)
print(f"模型总参数数量: {total_params:,}")
print(f"模型结构:\n{model}")
# =======================================================

criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
scheduler = optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', patience=3, factor=0.5)

# 训练函数 - 添加TensorBoard支持
def train(model, train_loader, test_loader, criterion, optimizer, scheduler, device, epochs):
    # 创建TensorBoard的SummaryWriter,使用时间戳命名目录
    timestamp = time.strftime("%Y%m%d_%H%M%S")
    writer = SummaryWriter(f'runs/CBAM_CNN_CIFAR10_{timestamp}')
    
    model.train()
    all_iter_losses = []
    iter_indices = []
    train_acc_history = []
    test_acc_history = []
    train_loss_history = []
    test_loss_history = []
    
    for epoch in range(epochs):
        running_loss = 0.0
        correct = 0
        total = 0
        
        for 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(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()
            
            # ==================== 记录每个batch的损失到TensorBoard ====================
            writer.add_scalar('Loss/train_batch', iter_loss, epoch * len(train_loader) + batch_idx)
            # ======================================================================
            
            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_train_loss = running_loss / len(train_loader)
        epoch_train_acc = 100. * correct / total
        train_acc_history.append(epoch_train_acc)
        train_loss_history.append(epoch_train_loss)
        
        # 测试阶段
        model.eval()
        test_loss = 0
        correct_test = 0
        total_test = 0
        
        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()
        
        epoch_test_loss = test_loss / len(test_loader)
        epoch_test_acc = 100. * correct_test / total_test
        test_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}%')
        
        # ==================== 记录每个epoch的指标到TensorBoard ====================
        writer.add_scalar('Loss/train_epoch', epoch_train_loss, epoch)
        writer.add_scalar('Loss/test_epoch', epoch_test_loss, epoch)
        writer.add_scalar('Accuracy/train', epoch_train_acc, epoch)
        writer.add_scalar('Accuracy/test', epoch_test_acc, epoch)
        writer.add_scalar('Learning Rate', optimizer.param_groups[0]['lr'], epoch)
        # =====================================================================
    
    # 关闭TensorBoard writer
    writer.close()
    
    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()

# 执行训练
epochs = 50
print("开始使用带CBAM的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_cbam_cnn_model.pth')
print("模型已保存为: cifar10_cbam_cnn_model.pth")
python 复制代码
使用设备: cuda
Files already downloaded and verified
模型总参数数量: 1,151,137
模型结构:
CBAM_CNN(
  (conv1): Conv2d(3, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (bn1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
  (relu1): ReLU()
  (pool1): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
  (cbam1): CBAM(
    (channel_att): ChannelAttention(
      (avg_pool): AdaptiveAvgPool2d(output_size=1)
      (max_pool): AdaptiveMaxPool2d(output_size=1)
      (fc): Sequential(
        (0): Linear(in_features=32, out_features=2, bias=True)
        (1): ReLU(inplace=True)
        (2): Linear(in_features=2, out_features=32, bias=True)
      )
      (sigmoid): Sigmoid()
    )
    (spatial_att): SpatialAttention(
      (conv): Conv2d(2, 1, kernel_size=(7, 7), stride=(1, 1), padding=(3, 3))
      (sigmoid): Sigmoid()
    )
  )
  (conv2): Conv2d(32, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
  (relu2): ReLU()
  (pool2): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
  (cbam2): CBAM(
    (channel_att): ChannelAttention(
      (avg_pool): AdaptiveAvgPool2d(output_size=1)
      (max_pool): AdaptiveMaxPool2d(output_size=1)
      (fc): Sequential(
        (0): Linear(in_features=64, out_features=4, bias=True)
        (1): ReLU(inplace=True)
        (2): Linear(in_features=4, out_features=64, bias=True)
      )
      (sigmoid): Sigmoid()
    )
    (spatial_att): SpatialAttention(
      (conv): Conv2d(2, 1, kernel_size=(7, 7), stride=(1, 1), padding=(3, 3))
      (sigmoid): Sigmoid()
    )
  )
  (conv3): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (bn3): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
  (relu3): ReLU()
  (pool3): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
  (cbam3): CBAM(
    (channel_att): ChannelAttention(
      (avg_pool): AdaptiveAvgPool2d(output_size=1)
      (max_pool): AdaptiveMaxPool2d(output_size=1)
      (fc): Sequential(
        (0): Linear(in_features=128, out_features=8, bias=True)
        (1): ReLU(inplace=True)
        (2): Linear(in_features=8, out_features=128, bias=True)
      )
      (sigmoid): Sigmoid()
    )
    (spatial_att): SpatialAttention(
      (conv): Conv2d(2, 1, kernel_size=(7, 7), stride=(1, 1), padding=(3, 3))
      (sigmoid): Sigmoid()
    )
  )
  (fc1): Linear(in_features=2048, out_features=512, bias=True)
  (dropout): Dropout(p=0.5, inplace=False)
  (fc2): Linear(in_features=512, out_features=10, bias=True)
)
开始使用带CBAM的CNN训练模型...
Epoch: 1/50 | Batch: 100/782 | 单Batch损失: 1.8801 | 累计平均损失: 1.9983
Epoch: 1/50 | Batch: 200/782 | 单Batch损失: 1.6547 | 累计平均损失: 1.8710
Epoch: 1/50 | Batch: 300/782 | 单Batch损失: 1.3068 | 累计平均损失: 1.7782
Epoch: 1/50 | Batch: 400/782 | 单Batch损失: 1.6768 | 累计平均损失: 1.7178
Epoch: 1/50 | Batch: 500/782 | 单Batch损失: 1.2715 | 累计平均损失: 1.6661
Epoch: 1/50 | Batch: 600/782 | 单Batch损失: 1.6022 | 累计平均损失: 1.6280
Epoch: 1/50 | Batch: 700/782 | 单Batch损失: 1.3048 | 累计平均损失: 1.5905
Epoch 1/50 完成 | 训练准确率: 42.56% | 测试准确率: 57.26%
Epoch: 2/50 | Batch: 100/782 | 单Batch损失: 1.4613 | 累计平均损失: 1.3216
Epoch: 2/50 | Batch: 200/782 | 单Batch损失: 1.1526 | 累计平均损失: 1.3035
Epoch: 2/50 | Batch: 300/782 | 单Batch损失: 1.0683 | 累计平均损失: 1.2678
Epoch: 2/50 | Batch: 400/782 | 单Batch损失: 1.2574 | 累计平均损失: 1.2498
Epoch: 2/50 | Batch: 500/782 | 单Batch损失: 1.0820 | 累计平均损失: 1.2305
Epoch: 2/50 | Batch: 600/782 | 单Batch损失: 1.1691 | 累计平均损失: 1.2144
Epoch: 2/50 | Batch: 700/782 | 单Batch损失: 1.0932 | 累计平均损失: 1.2037
Epoch 2/50 完成 | 训练准确率: 57.30% | 测试准确率: 67.90%
Epoch: 3/50 | Batch: 100/782 | 单Batch损失: 0.8475 | 累计平均损失: 1.0831
Epoch: 3/50 | Batch: 200/782 | 单Batch损失: 1.1217 | 累计平均损失: 1.0638
Epoch: 3/50 | Batch: 300/782 | 单Batch损失: 0.7955 | 累计平均损失: 1.0510
Epoch: 3/50 | Batch: 400/782 | 单Batch损失: 0.9575 | 累计平均损失: 1.0483
Epoch: 3/50 | Batch: 500/782 | 单Batch损失: 1.0279 | 累计平均损失: 1.0444
Epoch: 3/50 | Batch: 600/782 | 单Batch损失: 0.8695 | 累计平均损失: 1.0405
Epoch: 3/50 | Batch: 700/782 | 单Batch损失: 0.7802 | 累计平均损失: 1.0278
Epoch 3/50 完成 | 训练准确率: 63.68% | 测试准确率: 69.07%
Epoch: 4/50 | Batch: 100/782 | 单Batch损失: 0.8595 | 累计平均损失: 0.9731
Epoch: 4/50 | Batch: 200/782 | 单Batch损失: 1.1730 | 累计平均损失: 0.9719
Epoch: 4/50 | Batch: 300/782 | 单Batch损失: 0.7371 | 累计平均损失: 0.9733
Epoch: 4/50 | Batch: 400/782 | 单Batch损失: 0.9110 | 累计平均损失: 0.9593
Epoch: 4/50 | Batch: 500/782 | 单Batch损失: 0.7657 | 累计平均损失: 0.9548
Epoch: 4/50 | Batch: 600/782 | 单Batch损失: 0.9950 | 累计平均损失: 0.9499
Epoch: 4/50 | Batch: 700/782 | 单Batch损失: 0.8668 | 累计平均损失: 0.9453
Epoch 4/50 完成 | 训练准确率: 66.76% | 测试准确率: 70.83%
Epoch: 5/50 | Batch: 100/782 | 单Batch损失: 0.9088 | 累计平均损失: 0.9141
Epoch: 5/50 | Batch: 200/782 | 单Batch损失: 1.3144 | 累计平均损失: 0.8901
Epoch: 5/50 | Batch: 300/782 | 单Batch损失: 0.8408 | 累计平均损失: 0.8876
Epoch: 5/50 | Batch: 400/782 | 单Batch损失: 0.8693 | 累计平均损失: 0.8833
Epoch: 5/50 | Batch: 500/782 | 单Batch损失: 0.8696 | 累计平均损失: 0.8808
Epoch: 5/50 | Batch: 600/782 | 单Batch损失: 0.7560 | 累计平均损失: 0.8774
Epoch: 5/50 | Batch: 700/782 | 单Batch损失: 0.8642 | 累计平均损失: 0.8738
Epoch 5/50 完成 | 训练准确率: 69.36% | 测试准确率: 75.02%
Epoch: 6/50 | Batch: 100/782 | 单Batch损失: 0.6962 | 累计平均损失: 0.8449
Epoch: 6/50 | Batch: 200/782 | 单Batch损失: 0.6057 | 累计平均损失: 0.8163
Epoch: 6/50 | Batch: 300/782 | 单Batch损失: 0.8287 | 累计平均损失: 0.8207
Epoch: 6/50 | Batch: 400/782 | 单Batch损失: 0.5901 | 累计平均损失: 0.8228
Epoch: 6/50 | Batch: 500/782 | 单Batch损失: 0.5817 | 累计平均损失: 0.8249
Epoch: 6/50 | Batch: 600/782 | 单Batch损失: 0.9032 | 累计平均损失: 0.8258
Epoch: 6/50 | Batch: 700/782 | 单Batch损失: 0.8734 | 累计平均损失: 0.8243
Epoch 6/50 完成 | 训练准确率: 70.94% | 测试准确率: 76.75%
Epoch: 7/50 | Batch: 100/782 | 单Batch损失: 0.6908 | 累计平均损失: 0.7851
Epoch: 7/50 | Batch: 200/782 | 单Batch损失: 0.6765 | 累计平均损失: 0.7930
Epoch: 7/50 | Batch: 300/782 | 单Batch损失: 0.6273 | 累计平均损失: 0.7986
Epoch: 7/50 | Batch: 400/782 | 单Batch损失: 0.6730 | 累计平均损失: 0.8008
Epoch: 7/50 | Batch: 500/782 | 单Batch损失: 0.9539 | 累计平均损失: 0.7946
Epoch: 7/50 | Batch: 600/782 | 单Batch损失: 0.6971 | 累计平均损失: 0.7909
Epoch: 7/50 | Batch: 700/782 | 单Batch损失: 0.6998 | 累计平均损失: 0.7906
Epoch 7/50 完成 | 训练准确率: 72.06% | 测试准确率: 75.50%
Epoch: 8/50 | Batch: 100/782 | 单Batch损失: 0.8544 | 累计平均损失: 0.7621
Epoch: 8/50 | Batch: 200/782 | 单Batch损失: 0.8345 | 累计平均损失: 0.7670
Epoch: 8/50 | Batch: 300/782 | 单Batch损失: 0.7430 | 累计平均损失: 0.7612
Epoch: 8/50 | Batch: 400/782 | 单Batch损失: 0.7725 | 累计平均损失: 0.7559
Epoch: 8/50 | Batch: 500/782 | 单Batch损失: 0.6570 | 累计平均损失: 0.7583
Epoch: 8/50 | Batch: 600/782 | 单Batch损失: 0.7565 | 累计平均损失: 0.7557
Epoch: 8/50 | Batch: 700/782 | 单Batch损失: 0.8612 | 累计平均损失: 0.7564
Epoch 8/50 完成 | 训练准确率: 73.35% | 测试准确率: 75.77%
Epoch: 9/50 | Batch: 100/782 | 单Batch损失: 0.7659 | 累计平均损失: 0.7236
Epoch: 9/50 | Batch: 200/782 | 单Batch损失: 0.6214 | 累计平均损失: 0.7228
Epoch: 9/50 | Batch: 300/782 | 单Batch损失: 0.7191 | 累计平均损失: 0.7294
Epoch: 9/50 | Batch: 400/782 | 单Batch损失: 0.5123 | 累计平均损失: 0.7269
Epoch: 9/50 | Batch: 500/782 | 单Batch损失: 0.9697 | 累计平均损失: 0.7275
Epoch: 9/50 | Batch: 600/782 | 单Batch损失: 0.9047 | 累计平均损失: 0.7283
Epoch: 9/50 | Batch: 700/782 | 单Batch损失: 0.6620 | 累计平均损失: 0.7293
Epoch 9/50 完成 | 训练准确率: 74.46% | 测试准确率: 78.75%
Epoch: 10/50 | Batch: 100/782 | 单Batch损失: 0.7420 | 累计平均损失: 0.7175
Epoch: 10/50 | Batch: 200/782 | 单Batch损失: 0.8328 | 累计平均损失: 0.7205
Epoch: 10/50 | Batch: 300/782 | 单Batch损失: 0.8413 | 累计平均损失: 0.7164
Epoch: 10/50 | Batch: 400/782 | 单Batch损失: 0.8590 | 累计平均损失: 0.7167
Epoch: 10/50 | Batch: 500/782 | 单Batch损失: 0.7680 | 累计平均损失: 0.7120
Epoch: 10/50 | Batch: 600/782 | 单Batch损失: 0.5507 | 累计平均损失: 0.7084
Epoch: 10/50 | Batch: 700/782 | 单Batch损失: 0.7296 | 累计平均损失: 0.7101
Epoch 10/50 完成 | 训练准确率: 75.10% | 测试准确率: 78.08%
Epoch: 11/50 | Batch: 100/782 | 单Batch损失: 0.9901 | 累计平均损失: 0.6924
Epoch: 11/50 | Batch: 200/782 | 单Batch损失: 0.6549 | 累计平均损失: 0.6859
Epoch: 11/50 | Batch: 300/782 | 单Batch损失: 0.7163 | 累计平均损失: 0.6842
Epoch: 11/50 | Batch: 400/782 | 单Batch损失: 0.6723 | 累计平均损失: 0.6845
Epoch: 11/50 | Batch: 500/782 | 单Batch损失: 0.6244 | 累计平均损失: 0.6870
Epoch: 11/50 | Batch: 600/782 | 单Batch损失: 0.7632 | 累计平均损失: 0.6932
Epoch: 11/50 | Batch: 700/782 | 单Batch损失: 0.6513 | 累计平均损失: 0.6922
Epoch 11/50 完成 | 训练准确率: 75.77% | 测试准确率: 79.35%
Epoch: 12/50 | Batch: 100/782 | 单Batch损失: 0.4564 | 累计平均损失: 0.6491
Epoch: 12/50 | Batch: 200/782 | 单Batch损失: 0.6397 | 累计平均损失: 0.6554
Epoch: 12/50 | Batch: 300/782 | 单Batch损失: 0.4868 | 累计平均损失: 0.6631
Epoch: 12/50 | Batch: 400/782 | 单Batch损失: 0.4382 | 累计平均损失: 0.6634
Epoch: 12/50 | Batch: 500/782 | 单Batch损失: 0.6255 | 累计平均损失: 0.6667
Epoch: 12/50 | Batch: 600/782 | 单Batch损失: 0.5949 | 累计平均损失: 0.6665
Epoch: 12/50 | Batch: 700/782 | 单Batch损失: 0.8421 | 累计平均损失: 0.6676
Epoch 12/50 完成 | 训练准确率: 76.64% | 测试准确率: 78.47%
Epoch: 13/50 | Batch: 100/782 | 单Batch损失: 0.5975 | 累计平均损失: 0.6415
Epoch: 13/50 | Batch: 200/782 | 单Batch损失: 0.4651 | 累计平均损失: 0.6535
Epoch: 13/50 | Batch: 300/782 | 单Batch损失: 0.6588 | 累计平均损失: 0.6536
Epoch: 13/50 | Batch: 400/782 | 单Batch损失: 0.6124 | 累计平均损失: 0.6544
Epoch: 13/50 | Batch: 500/782 | 单Batch损失: 0.7564 | 累计平均损失: 0.6536
Epoch: 13/50 | Batch: 600/782 | 单Batch损失: 0.6378 | 累计平均损失: 0.6554
Epoch: 13/50 | Batch: 700/782 | 单Batch损失: 0.5632 | 累计平均损失: 0.6552
Epoch 13/50 完成 | 训练准确率: 77.12% | 测试准确率: 79.68%
Epoch: 14/50 | Batch: 100/782 | 单Batch损失: 0.5398 | 累计平均损失: 0.6277
Epoch: 14/50 | Batch: 200/782 | 单Batch损失: 0.5735 | 累计平均损失: 0.6306
Epoch: 14/50 | Batch: 300/782 | 单Batch损失: 0.6767 | 累计平均损失: 0.6344
Epoch: 14/50 | Batch: 400/782 | 单Batch损失: 0.4776 | 累计平均损失: 0.6380
Epoch: 14/50 | Batch: 500/782 | 单Batch损失: 0.4073 | 累计平均损失: 0.6359
Epoch: 14/50 | Batch: 600/782 | 单Batch损失: 0.6509 | 累计平均损失: 0.6410
Epoch: 14/50 | Batch: 700/782 | 单Batch损失: 0.8875 | 累计平均损失: 0.6421
Epoch 14/50 完成 | 训练准确率: 77.54% | 测试准确率: 80.07%
Epoch: 15/50 | Batch: 100/782 | 单Batch损失: 0.5849 | 累计平均损失: 0.6192
Epoch: 15/50 | Batch: 200/782 | 单Batch损失: 0.9357 | 累计平均损失: 0.6169
Epoch: 15/50 | Batch: 300/782 | 单Batch损失: 0.6022 | 累计平均损失: 0.6200
Epoch: 15/50 | Batch: 400/782 | 单Batch损失: 0.5525 | 累计平均损失: 0.6232
Epoch: 15/50 | Batch: 500/782 | 单Batch损失: 0.6197 | 累计平均损失: 0.6204
Epoch: 15/50 | Batch: 600/782 | 单Batch损失: 0.6540 | 累计平均损失: 0.6174
Epoch: 15/50 | Batch: 700/782 | 单Batch损失: 0.6514 | 累计平均损失: 0.6187
Epoch 15/50 完成 | 训练准确率: 78.28% | 测试准确率: 80.51%
Epoch: 16/50 | Batch: 100/782 | 单Batch损失: 0.5011 | 累计平均损失: 0.6224
Epoch: 16/50 | Batch: 200/782 | 单Batch损失: 0.4095 | 累计平均损失: 0.6225
Epoch: 16/50 | Batch: 300/782 | 单Batch损失: 0.6191 | 累计平均损失: 0.6228
Epoch: 16/50 | Batch: 400/782 | 单Batch损失: 0.7305 | 累计平均损失: 0.6220
Epoch: 16/50 | Batch: 500/782 | 单Batch损失: 0.5042 | 累计平均损失: 0.6200
Epoch: 16/50 | Batch: 600/782 | 单Batch损失: 0.5407 | 累计平均损失: 0.6201
Epoch: 16/50 | Batch: 700/782 | 单Batch损失: 0.6982 | 累计平均损失: 0.6185
Epoch 16/50 完成 | 训练准确率: 78.45% | 测试准确率: 81.46%
Epoch: 17/50 | Batch: 100/782 | 单Batch损失: 0.6869 | 累计平均损失: 0.5787
Epoch: 17/50 | Batch: 200/782 | 单Batch损失: 0.5747 | 累计平均损失: 0.5943
Epoch: 17/50 | Batch: 300/782 | 单Batch损失: 0.5623 | 累计平均损失: 0.5937
Epoch: 17/50 | Batch: 400/782 | 单Batch损失: 0.5060 | 累计平均损失: 0.5975
Epoch: 17/50 | Batch: 500/782 | 单Batch损失: 0.5889 | 累计平均损失: 0.5989
Epoch: 17/50 | Batch: 600/782 | 单Batch损失: 0.6412 | 累计平均损失: 0.6001
Epoch: 17/50 | Batch: 700/782 | 单Batch损失: 0.6942 | 累计平均损失: 0.6006
Epoch 17/50 完成 | 训练准确率: 78.93% | 测试准确率: 80.88%
Epoch: 18/50 | Batch: 100/782 | 单Batch损失: 0.5767 | 累计平均损失: 0.5937
Epoch: 18/50 | Batch: 200/782 | 单Batch损失: 0.5029 | 累计平均损失: 0.5893
Epoch: 18/50 | Batch: 300/782 | 单Batch损失: 0.5306 | 累计平均损失: 0.5927
Epoch: 18/50 | Batch: 400/782 | 单Batch损失: 0.5404 | 累计平均损失: 0.5877
Epoch: 18/50 | Batch: 500/782 | 单Batch损失: 0.6796 | 累计平均损失: 0.5928
Epoch: 18/50 | Batch: 600/782 | 单Batch损失: 0.3992 | 累计平均损失: 0.5916
Epoch: 18/50 | Batch: 700/782 | 单Batch损失: 0.7993 | 累计平均损失: 0.5920
Epoch 18/50 完成 | 训练准确率: 79.27% | 测试准确率: 79.84%
Epoch: 19/50 | Batch: 100/782 | 单Batch损失: 0.5797 | 累计平均损失: 0.5807
Epoch: 19/50 | Batch: 200/782 | 单Batch损失: 0.4097 | 累计平均损失: 0.5819
Epoch: 19/50 | Batch: 300/782 | 单Batch损失: 0.4068 | 累计平均损失: 0.5854
Epoch: 19/50 | Batch: 400/782 | 单Batch损失: 0.4906 | 累计平均损失: 0.5814
Epoch: 19/50 | Batch: 500/782 | 单Batch损失: 0.6434 | 累计平均损失: 0.5810
Epoch: 19/50 | Batch: 600/782 | 单Batch损失: 0.6184 | 累计平均损失: 0.5842
Epoch: 19/50 | Batch: 700/782 | 单Batch损失: 0.5369 | 累计平均损失: 0.5787
Epoch 19/50 完成 | 训练准确率: 79.63% | 测试准确率: 82.02%
Epoch: 20/50 | Batch: 100/782 | 单Batch损失: 0.6228 | 累计平均损失: 0.5625
Epoch: 20/50 | Batch: 200/782 | 单Batch损失: 0.6240 | 累计平均损失: 0.5803
Epoch: 20/50 | Batch: 300/782 | 单Batch损失: 0.5687 | 累计平均损失: 0.5738
Epoch: 20/50 | Batch: 400/782 | 单Batch损失: 0.6452 | 累计平均损失: 0.5724
Epoch: 20/50 | Batch: 500/782 | 单Batch损失: 0.6260 | 累计平均损失: 0.5683
Epoch: 20/50 | Batch: 600/782 | 单Batch损失: 0.5972 | 累计平均损失: 0.5692
Epoch: 20/50 | Batch: 700/782 | 单Batch损失: 0.6436 | 累计平均损失: 0.5703
Epoch 20/50 完成 | 训练准确率: 80.03% | 测试准确率: 82.34%
Epoch: 21/50 | Batch: 100/782 | 单Batch损失: 0.3788 | 累计平均损失: 0.5307
Epoch: 21/50 | Batch: 200/782 | 单Batch损失: 0.4643 | 累计平均损失: 0.5441
Epoch: 21/50 | Batch: 300/782 | 单Batch损失: 0.5248 | 累计平均损失: 0.5553
Epoch: 21/50 | Batch: 400/782 | 单Batch损失: 0.5865 | 累计平均损失: 0.5581
Epoch: 21/50 | Batch: 500/782 | 单Batch损失: 0.5042 | 累计平均损失: 0.5546
Epoch: 21/50 | Batch: 600/782 | 单Batch损失: 0.5868 | 累计平均损失: 0.5566
Epoch: 21/50 | Batch: 700/782 | 单Batch损失: 0.5667 | 累计平均损失: 0.5608
Epoch 21/50 完成 | 训练准确率: 80.45% | 测试准确率: 82.77%
Epoch: 22/50 | Batch: 100/782 | 单Batch损失: 0.4111 | 累计平均损失: 0.5600
Epoch: 22/50 | Batch: 200/782 | 单Batch损失: 0.4253 | 累计平均损失: 0.5522
Epoch: 22/50 | Batch: 300/782 | 单Batch损失: 0.3515 | 累计平均损失: 0.5559
Epoch: 22/50 | Batch: 400/782 | 单Batch损失: 0.4728 | 累计平均损失: 0.5590
Epoch: 22/50 | Batch: 500/782 | 单Batch损失: 0.6740 | 累计平均损失: 0.5593
Epoch: 22/50 | Batch: 600/782 | 单Batch损失: 0.5254 | 累计平均损失: 0.5589
Epoch: 22/50 | Batch: 700/782 | 单Batch损失: 0.5093 | 累计平均损失: 0.5587
Epoch 22/50 完成 | 训练准确率: 80.46% | 测试准确率: 81.50%
Epoch: 23/50 | Batch: 100/782 | 单Batch损失: 0.5397 | 累计平均损失: 0.5520
Epoch: 23/50 | Batch: 200/782 | 单Batch损失: 0.3560 | 累计平均损失: 0.5472
Epoch: 23/50 | Batch: 300/782 | 单Batch损失: 0.8992 | 累计平均损失: 0.5514
Epoch: 23/50 | Batch: 400/782 | 单Batch损失: 0.5166 | 累计平均损失: 0.5459
Epoch: 23/50 | Batch: 500/782 | 单Batch损失: 0.6366 | 累计平均损失: 0.5474
Epoch: 23/50 | Batch: 600/782 | 单Batch损失: 0.5000 | 累计平均损失: 0.5440
Epoch: 23/50 | Batch: 700/782 | 单Batch损失: 0.5560 | 累计平均损失: 0.5458
Epoch 23/50 完成 | 训练准确率: 80.90% | 测试准确率: 82.17%
Epoch: 24/50 | Batch: 100/782 | 单Batch损失: 0.5900 | 累计平均损失: 0.5350
Epoch: 24/50 | Batch: 200/782 | 单Batch损失: 0.7218 | 累计平均损失: 0.5398
Epoch: 24/50 | Batch: 300/782 | 单Batch损失: 0.6075 | 累计平均损失: 0.5373
Epoch: 24/50 | Batch: 400/782 | 单Batch损失: 0.6921 | 累计平均损失: 0.5351
Epoch: 24/50 | Batch: 500/782 | 单Batch损失: 0.2924 | 累计平均损失: 0.5333
Epoch: 24/50 | Batch: 600/782 | 单Batch损失: 0.3581 | 累计平均损失: 0.5378
Epoch: 24/50 | Batch: 700/782 | 单Batch损失: 0.5705 | 累计平均损失: 0.5374
Epoch 24/50 完成 | 训练准确率: 81.13% | 测试准确率: 83.24%
Epoch: 25/50 | Batch: 100/782 | 单Batch损失: 0.4988 | 累计平均损失: 0.5524
Epoch: 25/50 | Batch: 200/782 | 单Batch损失: 0.3267 | 累计平均损失: 0.5427
Epoch: 25/50 | Batch: 300/782 | 单Batch损失: 0.3857 | 累计平均损失: 0.5417
Epoch: 25/50 | Batch: 400/782 | 单Batch损失: 0.5547 | 累计平均损失: 0.5377
Epoch: 25/50 | Batch: 500/782 | 单Batch损失: 0.3588 | 累计平均损失: 0.5384
Epoch: 25/50 | Batch: 600/782 | 单Batch损失: 0.5970 | 累计平均损失: 0.5387
Epoch: 25/50 | Batch: 700/782 | 单Batch损失: 0.7617 | 累计平均损失: 0.5377
Epoch 25/50 完成 | 训练准确率: 81.12% | 测试准确率: 82.92%
Epoch: 26/50 | Batch: 100/782 | 单Batch损失: 0.5143 | 累计平均损失: 0.5100
Epoch: 26/50 | Batch: 200/782 | 单Batch损失: 0.4421 | 累计平均损失: 0.5113
Epoch: 26/50 | Batch: 300/782 | 单Batch损失: 0.4626 | 累计平均损失: 0.5134
Epoch: 26/50 | Batch: 400/782 | 单Batch损失: 0.3854 | 累计平均损失: 0.5181
Epoch: 26/50 | Batch: 500/782 | 单Batch损失: 0.7884 | 累计平均损失: 0.5231
Epoch: 26/50 | Batch: 600/782 | 单Batch损失: 0.4597 | 累计平均损失: 0.5238
Epoch: 26/50 | Batch: 700/782 | 单Batch损失: 0.5840 | 累计平均损失: 0.5257
Epoch 26/50 完成 | 训练准确率: 81.60% | 测试准确率: 83.06%
Epoch: 27/50 | Batch: 100/782 | 单Batch损失: 0.6826 | 累计平均损失: 0.5137
Epoch: 27/50 | Batch: 200/782 | 单Batch损失: 0.3891 | 累计平均损失: 0.5209
Epoch: 27/50 | Batch: 300/782 | 单Batch损失: 0.4926 | 累计平均损失: 0.5184
Epoch: 27/50 | Batch: 400/782 | 单Batch损失: 0.5839 | 累计平均损失: 0.5158
Epoch: 27/50 | Batch: 500/782 | 单Batch损失: 0.3643 | 累计平均损失: 0.5128
Epoch: 27/50 | Batch: 600/782 | 单Batch损失: 0.5490 | 累计平均损失: 0.5161
Epoch: 27/50 | Batch: 700/782 | 单Batch损失: 0.5879 | 累计平均损失: 0.5167
Epoch 27/50 完成 | 训练准确率: 81.71% | 测试准确率: 83.71%
Epoch: 28/50 | Batch: 100/782 | 单Batch损失: 0.5975 | 累计平均损失: 0.4911
Epoch: 28/50 | Batch: 200/782 | 单Batch损失: 0.5100 | 累计平均损失: 0.4984
Epoch: 28/50 | Batch: 300/782 | 单Batch损失: 0.3246 | 累计平均损失: 0.4970
Epoch: 28/50 | Batch: 400/782 | 单Batch损失: 0.3910 | 累计平均损失: 0.5013
Epoch: 28/50 | Batch: 500/782 | 单Batch损失: 0.3908 | 累计平均损失: 0.5053
Epoch: 28/50 | Batch: 600/782 | 单Batch损失: 0.4339 | 累计平均损失: 0.5111
Epoch: 28/50 | Batch: 700/782 | 单Batch损失: 0.5329 | 累计平均损失: 0.5120
Epoch 28/50 完成 | 训练准确率: 82.13% | 测试准确率: 83.09%
Epoch: 29/50 | Batch: 100/782 | 单Batch损失: 0.6111 | 累计平均损失: 0.4987
Epoch: 29/50 | Batch: 200/782 | 单Batch损失: 0.3614 | 累计平均损失: 0.4889
Epoch: 29/50 | Batch: 300/782 | 单Batch损失: 0.3899 | 累计平均损失: 0.5005
Epoch: 29/50 | Batch: 400/782 | 单Batch损失: 0.5074 | 累计平均损失: 0.5021
Epoch: 29/50 | Batch: 500/782 | 单Batch损失: 0.5379 | 累计平均损失: 0.4998
Epoch: 29/50 | Batch: 600/782 | 单Batch损失: 0.5615 | 累计平均损失: 0.5025
Epoch: 29/50 | Batch: 700/782 | 单Batch损失: 0.5155 | 累计平均损失: 0.5023
Epoch 29/50 完成 | 训练准确率: 82.37% | 测试准确率: 83.12%
Epoch: 30/50 | Batch: 100/782 | 单Batch损失: 0.3229 | 累计平均损失: 0.4977
Epoch: 30/50 | Batch: 200/782 | 单Batch损失: 0.4954 | 累计平均损失: 0.4939
Epoch: 30/50 | Batch: 300/782 | 单Batch损失: 0.4926 | 累计平均损失: 0.4995
Epoch: 30/50 | Batch: 400/782 | 单Batch损失: 0.5568 | 累计平均损失: 0.5015
Epoch: 30/50 | Batch: 500/782 | 单Batch损失: 0.7476 | 累计平均损失: 0.5010
Epoch: 30/50 | Batch: 600/782 | 单Batch损失: 0.6925 | 累计平均损失: 0.5041
Epoch: 30/50 | Batch: 700/782 | 单Batch损失: 0.4762 | 累计平均损失: 0.5054
Epoch 30/50 完成 | 训练准确率: 82.18% | 测试准确率: 83.87%
Epoch: 31/50 | Batch: 100/782 | 单Batch损失: 0.5573 | 累计平均损失: 0.4712
Epoch: 31/50 | Batch: 200/782 | 单Batch损失: 0.7184 | 累计平均损失: 0.4915
Epoch: 31/50 | Batch: 300/782 | 单Batch损失: 0.4220 | 累计平均损失: 0.4895
Epoch: 31/50 | Batch: 400/782 | 单Batch损失: 0.5039 | 累计平均损失: 0.4909
Epoch: 31/50 | Batch: 500/782 | 单Batch损失: 0.4514 | 累计平均损失: 0.4953
Epoch: 31/50 | Batch: 600/782 | 单Batch损失: 0.3512 | 累计平均损失: 0.4943
Epoch: 31/50 | Batch: 700/782 | 单Batch损失: 0.5835 | 累计平均损失: 0.4937
Epoch 31/50 完成 | 训练准确率: 82.61% | 测试准确率: 83.01%
Epoch: 32/50 | Batch: 100/782 | 单Batch损失: 0.3412 | 累计平均损失: 0.4912
Epoch: 32/50 | Batch: 200/782 | 单Batch损失: 0.4189 | 累计平均损失: 0.4840
Epoch: 32/50 | Batch: 300/782 | 单Batch损失: 0.3748 | 累计平均损失: 0.4854
Epoch: 32/50 | Batch: 400/782 | 单Batch损失: 0.4254 | 累计平均损失: 0.4889
Epoch: 32/50 | Batch: 500/782 | 单Batch损失: 0.4979 | 累计平均损失: 0.4883
Epoch: 32/50 | Batch: 600/782 | 单Batch损失: 0.5022 | 累计平均损失: 0.4921
Epoch: 32/50 | Batch: 700/782 | 单Batch损失: 0.5987 | 累计平均损失: 0.4984
Epoch 32/50 完成 | 训练准确率: 82.60% | 测试准确率: 84.21%
Epoch: 33/50 | Batch: 100/782 | 单Batch损失: 0.6557 | 累计平均损失: 0.4767
Epoch: 33/50 | Batch: 200/782 | 单Batch损失: 0.3913 | 累计平均损失: 0.4801
Epoch: 33/50 | Batch: 300/782 | 单Batch损失: 0.5680 | 累计平均损失: 0.4805
Epoch: 33/50 | Batch: 400/782 | 单Batch损失: 0.5931 | 累计平均损失: 0.4764
Epoch: 33/50 | Batch: 500/782 | 单Batch损失: 0.4919 | 累计平均损失: 0.4779
Epoch: 33/50 | Batch: 600/782 | 单Batch损失: 0.5885 | 累计平均损失: 0.4794
Epoch: 33/50 | Batch: 700/782 | 单Batch损失: 0.7861 | 累计平均损失: 0.4823
Epoch 33/50 完成 | 训练准确率: 83.08% | 测试准确率: 82.22%
Epoch: 34/50 | Batch: 100/782 | 单Batch损失: 0.5273 | 累计平均损失: 0.4793
Epoch: 34/50 | Batch: 200/782 | 单Batch损失: 0.6026 | 累计平均损失: 0.4810
Epoch: 34/50 | Batch: 300/782 | 单Batch损失: 0.5227 | 累计平均损失: 0.4771
Epoch: 34/50 | Batch: 400/782 | 单Batch损失: 0.5303 | 累计平均损失: 0.4789
Epoch: 34/50 | Batch: 500/782 | 单Batch损失: 0.4652 | 累计平均损失: 0.4806
Epoch: 34/50 | Batch: 600/782 | 单Batch损失: 0.5308 | 累计平均损失: 0.4796
Epoch: 34/50 | Batch: 700/782 | 单Batch损失: 0.7209 | 累计平均损失: 0.4804
Epoch 34/50 完成 | 训练准确率: 83.26% | 测试准确率: 82.85%
Epoch: 35/50 | Batch: 100/782 | 单Batch损失: 0.4437 | 累计平均损失: 0.4420
Epoch: 35/50 | Batch: 200/782 | 单Batch损失: 0.2363 | 累计平均损失: 0.4322
Epoch: 35/50 | Batch: 300/782 | 单Batch损失: 0.6219 | 累计平均损失: 0.4278
Epoch: 35/50 | Batch: 400/782 | 单Batch损失: 0.3405 | 累计平均损失: 0.4302
Epoch: 35/50 | Batch: 500/782 | 单Batch损失: 0.2414 | 累计平均损失: 0.4324
Epoch: 35/50 | Batch: 600/782 | 单Batch损失: 0.3923 | 累计平均损失: 0.4324
Epoch: 35/50 | Batch: 700/782 | 单Batch损失: 0.3818 | 累计平均损失: 0.4303
Epoch 35/50 完成 | 训练准确率: 84.88% | 测试准确率: 84.80%
Epoch: 36/50 | Batch: 100/782 | 单Batch损失: 0.5747 | 累计平均损失: 0.4297
Epoch: 36/50 | Batch: 200/782 | 单Batch损失: 0.5380 | 累计平均损失: 0.4234
Epoch: 36/50 | Batch: 300/782 | 单Batch损失: 0.3824 | 累计平均损失: 0.4192
Epoch: 36/50 | Batch: 400/782 | 单Batch损失: 0.5342 | 累计平均损失: 0.4209
Epoch: 36/50 | Batch: 500/782 | 单Batch损失: 0.5871 | 累计平均损失: 0.4213
Epoch: 36/50 | Batch: 600/782 | 单Batch损失: 0.4256 | 累计平均损失: 0.4191
Epoch: 36/50 | Batch: 700/782 | 单Batch损失: 0.4101 | 累计平均损失: 0.4205
Epoch 36/50 完成 | 训练准确率: 85.28% | 测试准确率: 85.08%
Epoch: 37/50 | Batch: 100/782 | 单Batch损失: 0.2740 | 累计平均损失: 0.4024
Epoch: 37/50 | Batch: 200/782 | 单Batch损失: 0.2937 | 累计平均损失: 0.4052
Epoch: 37/50 | Batch: 300/782 | 单Batch损失: 0.4925 | 累计平均损失: 0.4103
Epoch: 37/50 | Batch: 400/782 | 单Batch损失: 0.4161 | 累计平均损失: 0.4106
Epoch: 37/50 | Batch: 500/782 | 单Batch损失: 0.3986 | 累计平均损失: 0.4106
Epoch: 37/50 | Batch: 600/782 | 单Batch损失: 0.4012 | 累计平均损失: 0.4121
Epoch: 37/50 | Batch: 700/782 | 单Batch损失: 0.6927 | 累计平均损失: 0.4146
Epoch 37/50 完成 | 训练准确率: 85.37% | 测试准确率: 84.59%
Epoch: 38/50 | Batch: 100/782 | 单Batch损失: 0.2603 | 累计平均损失: 0.4106
Epoch: 38/50 | Batch: 200/782 | 单Batch损失: 0.3628 | 累计平均损失: 0.4018
Epoch: 38/50 | Batch: 300/782 | 单Batch损失: 0.4196 | 累计平均损失: 0.4028
Epoch: 38/50 | Batch: 400/782 | 单Batch损失: 0.4075 | 累计平均损失: 0.4079
Epoch: 38/50 | Batch: 500/782 | 单Batch损失: 0.5313 | 累计平均损失: 0.4076
Epoch: 38/50 | Batch: 600/782 | 单Batch损失: 0.3363 | 累计平均损失: 0.4050
Epoch: 38/50 | Batch: 700/782 | 单Batch损失: 0.4430 | 累计平均损失: 0.4074
Epoch 38/50 完成 | 训练准确率: 85.75% | 测试准确率: 84.45%
Epoch: 39/50 | Batch: 100/782 | 单Batch损失: 0.4298 | 累计平均损失: 0.4130
Epoch: 39/50 | Batch: 200/782 | 单Batch损失: 0.4168 | 累计平均损失: 0.4099
Epoch: 39/50 | Batch: 300/782 | 单Batch损失: 0.4269 | 累计平均损失: 0.4076
Epoch: 39/50 | Batch: 400/782 | 单Batch损失: 0.4963 | 累计平均损失: 0.4071
Epoch: 39/50 | Batch: 500/782 | 单Batch损失: 0.5424 | 累计平均损失: 0.4044
Epoch: 39/50 | Batch: 600/782 | 单Batch损失: 0.5796 | 累计平均损失: 0.4041
Epoch: 39/50 | Batch: 700/782 | 单Batch损失: 0.4438 | 累计平均损失: 0.4057
Epoch 39/50 完成 | 训练准确率: 85.65% | 测试准确率: 84.99%
Epoch: 40/50 | Batch: 100/782 | 单Batch损失: 0.5875 | 累计平均损失: 0.4032
Epoch: 40/50 | Batch: 200/782 | 单Batch损失: 0.4634 | 累计平均损失: 0.4026
Epoch: 40/50 | Batch: 300/782 | 单Batch损失: 0.2196 | 累计平均损失: 0.4037
Epoch: 40/50 | Batch: 400/782 | 单Batch损失: 0.5623 | 累计平均损失: 0.4090
Epoch: 40/50 | Batch: 500/782 | 单Batch损失: 0.3187 | 累计平均损失: 0.4074
Epoch: 40/50 | Batch: 600/782 | 单Batch损失: 0.3077 | 累计平均损失: 0.4029
Epoch: 40/50 | Batch: 700/782 | 单Batch损失: 0.3007 | 累计平均损失: 0.4006
Epoch 40/50 完成 | 训练准确率: 86.05% | 测试准确率: 85.23%
Epoch: 41/50 | Batch: 100/782 | 单Batch损失: 0.2842 | 累计平均损失: 0.3951
Epoch: 41/50 | Batch: 200/782 | 单Batch损失: 0.2542 | 累计平均损失: 0.3877
Epoch: 41/50 | Batch: 300/782 | 单Batch损失: 0.3478 | 累计平均损失: 0.3772
Epoch: 41/50 | Batch: 400/782 | 单Batch损失: 0.3335 | 累计平均损失: 0.3698
Epoch: 41/50 | Batch: 500/782 | 单Batch损失: 0.3094 | 累计平均损失: 0.3704
Epoch: 41/50 | Batch: 600/782 | 单Batch损失: 0.3066 | 累计平均损失: 0.3701
Epoch: 41/50 | Batch: 700/782 | 单Batch损失: 0.5142 | 累计平均损失: 0.3734
Epoch 41/50 完成 | 训练准确率: 86.70% | 测试准确率: 85.15%
Epoch: 42/50 | Batch: 100/782 | 单Batch损失: 0.3458 | 累计平均损失: 0.3623
Epoch: 42/50 | Batch: 200/782 | 单Batch损失: 0.3583 | 累计平均损失: 0.3704
Epoch: 42/50 | Batch: 300/782 | 单Batch损失: 0.2809 | 累计平均损失: 0.3770
Epoch: 42/50 | Batch: 400/782 | 单Batch损失: 0.2250 | 累计平均损失: 0.3731
Epoch: 42/50 | Batch: 500/782 | 单Batch损失: 0.4611 | 累计平均损失: 0.3726
Epoch: 42/50 | Batch: 600/782 | 单Batch损失: 0.4003 | 累计平均损失: 0.3704
Epoch: 42/50 | Batch: 700/782 | 单Batch损失: 0.4579 | 累计平均损失: 0.3698
Epoch 42/50 完成 | 训练准确率: 86.99% | 测试准确率: 85.45%
Epoch: 43/50 | Batch: 100/782 | 单Batch损失: 0.1621 | 累计平均损失: 0.3609
Epoch: 43/50 | Batch: 200/782 | 单Batch损失: 0.3488 | 累计平均损失: 0.3617
Epoch: 43/50 | Batch: 300/782 | 单Batch损失: 0.3337 | 累计平均损失: 0.3616
Epoch: 43/50 | Batch: 400/782 | 单Batch损失: 0.3426 | 累计平均损失: 0.3601
Epoch: 43/50 | Batch: 500/782 | 单Batch损失: 0.1961 | 累计平均损失: 0.3627
Epoch: 43/50 | Batch: 600/782 | 单Batch损失: 0.3800 | 累计平均损失: 0.3659
Epoch: 43/50 | Batch: 700/782 | 单Batch损失: 0.3547 | 累计平均损失: 0.3655
Epoch 43/50 完成 | 训练准确率: 87.03% | 测试准确率: 85.51%
Epoch: 44/50 | Batch: 100/782 | 单Batch损失: 0.2813 | 累计平均损失: 0.3554
Epoch: 44/50 | Batch: 200/782 | 单Batch损失: 0.2918 | 累计平均损失: 0.3523
Epoch: 44/50 | Batch: 300/782 | 单Batch损失: 0.2617 | 累计平均损失: 0.3591
Epoch: 44/50 | Batch: 400/782 | 单Batch损失: 0.5801 | 累计平均损失: 0.3613
Epoch: 44/50 | Batch: 500/782 | 单Batch损失: 0.2999 | 累计平均损失: 0.3623
Epoch: 44/50 | Batch: 600/782 | 单Batch损失: 0.4191 | 累计平均损失: 0.3620
Epoch: 44/50 | Batch: 700/782 | 单Batch损失: 0.3146 | 累计平均损失: 0.3613
Epoch 44/50 完成 | 训练准确率: 87.14% | 测试准确率: 85.40%
Epoch: 45/50 | Batch: 100/782 | 单Batch损失: 0.3495 | 累计平均损失: 0.3674
Epoch: 45/50 | Batch: 200/782 | 单Batch损失: 0.3842 | 累计平均损失: 0.3619
Epoch: 45/50 | Batch: 300/782 | 单Batch损失: 0.3891 | 累计平均损失: 0.3618
Epoch: 45/50 | Batch: 400/782 | 单Batch损失: 0.4163 | 累计平均损失: 0.3618
Epoch: 45/50 | Batch: 500/782 | 单Batch损失: 0.3320 | 累计平均损失: 0.3593
Epoch: 45/50 | Batch: 600/782 | 单Batch损失: 0.4402 | 累计平均损失: 0.3580
Epoch: 45/50 | Batch: 700/782 | 单Batch损失: 0.3165 | 累计平均损失: 0.3570
Epoch 45/50 完成 | 训练准确率: 87.38% | 测试准确率: 85.59%
Epoch: 46/50 | Batch: 100/782 | 单Batch损失: 0.3824 | 累计平均损失: 0.3448
Epoch: 46/50 | Batch: 200/782 | 单Batch损失: 0.4664 | 累计平均损失: 0.3611
Epoch: 46/50 | Batch: 300/782 | 单Batch损失: 0.2922 | 累计平均损失: 0.3638
Epoch: 46/50 | Batch: 400/782 | 单Batch损失: 0.2986 | 累计平均损失: 0.3629
Epoch: 46/50 | Batch: 500/782 | 单Batch损失: 0.2366 | 累计平均损失: 0.3618
Epoch: 46/50 | Batch: 600/782 | 单Batch损失: 0.3335 | 累计平均损失: 0.3618
Epoch: 46/50 | Batch: 700/782 | 单Batch损失: 0.3573 | 累计平均损失: 0.3584
Epoch 46/50 完成 | 训练准确率: 87.37% | 测试准确率: 85.51%
Epoch: 47/50 | Batch: 100/782 | 单Batch损失: 0.3050 | 累计平均损失: 0.3556
Epoch: 47/50 | Batch: 200/782 | 单Batch损失: 0.4918 | 累计平均损失: 0.3575
Epoch: 47/50 | Batch: 300/782 | 单Batch损失: 0.2253 | 累计平均损失: 0.3610
Epoch: 47/50 | Batch: 400/782 | 单Batch损失: 0.3172 | 累计平均损失: 0.3589
Epoch: 47/50 | Batch: 500/782 | 单Batch损失: 0.3497 | 累计平均损失: 0.3576
Epoch: 47/50 | Batch: 600/782 | 单Batch损失: 0.3460 | 累计平均损失: 0.3572
Epoch: 47/50 | Batch: 700/782 | 单Batch损失: 0.3619 | 累计平均损失: 0.3577
Epoch 47/50 完成 | 训练准确率: 87.53% | 测试准确率: 85.87%
Epoch: 48/50 | Batch: 100/782 | 单Batch损失: 0.3415 | 累计平均损失: 0.3416
Epoch: 48/50 | Batch: 200/782 | 单Batch损失: 0.2568 | 累计平均损失: 0.3476
Epoch: 48/50 | Batch: 300/782 | 单Batch损失: 0.3267 | 累计平均损失: 0.3562
Epoch: 48/50 | Batch: 400/782 | 单Batch损失: 0.4096 | 累计平均损失: 0.3583
Epoch: 48/50 | Batch: 500/782 | 单Batch损失: 0.3828 | 累计平均损失: 0.3552
Epoch: 48/50 | Batch: 600/782 | 单Batch损失: 0.3245 | 累计平均损失: 0.3539
Epoch: 48/50 | Batch: 700/782 | 单Batch损失: 0.2525 | 累计平均损失: 0.3528
Epoch 48/50 完成 | 训练准确率: 87.50% | 测试准确率: 85.51%
Epoch: 49/50 | Batch: 100/782 | 单Batch损失: 0.2363 | 累计平均损失: 0.3292
Epoch: 49/50 | Batch: 200/782 | 单Batch损失: 0.2670 | 累计平均损失: 0.3331
Epoch: 49/50 | Batch: 300/782 | 单Batch损失: 0.3061 | 累计平均损失: 0.3330
Epoch: 49/50 | Batch: 400/782 | 单Batch损失: 0.2604 | 累计平均损失: 0.3341
Epoch: 49/50 | Batch: 500/782 | 单Batch损失: 0.3631 | 累计平均损失: 0.3339
Epoch: 49/50 | Batch: 600/782 | 单Batch损失: 0.2107 | 累计平均损失: 0.3371
Epoch: 49/50 | Batch: 700/782 | 单Batch损失: 0.3077 | 累计平均损失: 0.3394
Epoch 49/50 完成 | 训练准确率: 88.02% | 测试准确率: 85.78%
Epoch: 50/50 | Batch: 100/782 | 单Batch损失: 0.4536 | 累计平均损失: 0.3245
Epoch: 50/50 | Batch: 200/782 | 单Batch损失: 0.3102 | 累计平均损失: 0.3336
Epoch: 50/50 | Batch: 300/782 | 单Batch损失: 0.2525 | 累计平均损失: 0.3285
Epoch: 50/50 | Batch: 400/782 | 单Batch损失: 0.4984 | 累计平均损失: 0.3302
Epoch: 50/50 | Batch: 500/782 | 单Batch损失: 0.3456 | 累计平均损失: 0.3300
Epoch: 50/50 | Batch: 600/782 | 单Batch损失: 0.3816 | 累计平均损失: 0.3308
Epoch: 50/50 | Batch: 700/782 | 单Batch损失: 0.4313 | 累计平均损失: 0.3311
Epoch 50/50 完成 | 训练准确率: 88.29% | 测试准确率: 85.85%

训练完成!最终测试准确率: 85.85%

模型已保存为: cifar10_cbam_cnn_model.pth

@浙大疏锦行

相关推荐
hbwhmama5 分钟前
ubuntu24.04安装IDEA2025.1.2搭建java开发环境
java·开发语言
斯文by累14 分钟前
Python环境搭建
开发语言·python
.似水39 分钟前
Python requests
开发语言·python
不会飞的鲨鱼41 分钟前
FastMoss 国际电商Tiktok数据分析 JS 逆向 | MD5加密
javascript·python·数据挖掘·数据分析
tanyyinyu1 小时前
Python列表:高效灵活的数据存储与操作指南
开发语言·windows·python
沐雨潇竹1 小时前
vs2022中detach qt widgets designer
开发语言·qt
加油搞钱加油搞钱1 小时前
鹰盾加密器“一机一码”技术全维度剖析:从底层实现到生态防护体系
开发语言·网络·python
朝朝又沐沐1 小时前
基于算法竞赛的c++编程(28)结构体的进阶应用
开发语言·c++·算法
站大爷IP1 小时前
Python项目文件组织与PyCharm实践:打造高效开发环境
python
豪斯有话说1 小时前
C++_红黑树
开发语言·数据结构·c++