训练和测试的规范写法

article/2025/7/18 23:47:05

单通道图片的规范写法

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  # 解决负号显示问题# 1. 数据预处理
transform = transforms.Compose([transforms.ToTensor(),  # 转换为张量并归一化到[0,1]transforms.Normalize((0.1307,), (0.3081,))  # MNIST数据集的均值和标准差
])# 2. 加载MNIST数据集
train_dataset = datasets.MNIST(root='./data',train=True,download=True,transform=transform
)test_dataset = datasets.MNIST(root='./data',train=False,transform=transform
)# 3. 创建数据加载器
batch_size = 64  # 每批处理64个样本
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)# 4. 定义模型、损失函数和优化器
class MLP(nn.Module):def __init__(self):super(MLP, self).__init__()self.flatten = nn.Flatten()  # 将28x28的图像展平为784维向量self.layer1 = nn.Linear(784, 128)  # 第一层:784个输入,128个神经元self.relu = nn.ReLU()  # 激活函数self.layer2 = nn.Linear(128, 10)  # 第二层:128个输入,10个输出(对应10个数字类别)def forward(self, x):x = self.flatten(x)  # 展平图像x = self.layer1(x)   # 第一层线性变换x = self.relu(x)     # 应用ReLU激活函数x = self.layer2(x)   # 第二层线性变换,输出logitsreturn x# 检查GPU是否可用
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")# 初始化模型
model = MLP()
model = model.to(device)  # 将模型移至GPU(如果可用)criterion = nn.CrossEntropyLoss()  # 交叉熵损失函数,适用于多分类问题
optimizer = optim.Adam(model.parameters(), lr=0.001)  # Adam优化器# 5. 训练模型(记录每个 iteration 的损失)
def train(model, train_loader, test_loader, criterion, optimizer, device, epochs):model.train()  # 设置为训练模式# 新增:记录每个 iteration 的损失all_iter_losses = []  # 存储所有 batch 的损失iter_indices = []     # 存储 iteration 序号(从1开始)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)  # 移至GPU(如果可用)optimizer.zero_grad()  # 梯度清零output = model(data)  # 前向传播loss = criterion(output, target)  # 计算损失loss.backward()  # 反向传播optimizer.step()  # 更新参数# 记录当前 iteration 的损失(注意:这里直接使用单 batch 损失,而非累加平均)iter_loss = loss.item()all_iter_losses.append(iter_loss)iter_indices.append(epoch * len(train_loader) + batch_idx + 1)  # iteration 序号从1开始# 统计准确率和损失(原逻辑保留,用于 epoch 级统计)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+1}/{epochs} | Batch: {batch_idx+1}/{len(train_loader)} 'f'| 单Batch损失: {iter_loss:.4f} | 累计平均损失: {running_loss/(batch_idx+1):.4f}')# 原 epoch 级逻辑(测试、打印 epoch 结果)不变epoch_train_loss = running_loss / len(train_loader)epoch_train_acc = 100. * correct / totalepoch_test_loss, epoch_test_acc = test(model, test_loader, criterion, device)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_metrics(train_losses, test_losses, train_accuracies, test_accuracies, epochs)return epoch_test_acc  # 返回最终测试准确率# 6. 测试模型
def test(model, test_loader, criterion, device):model.eval()  # 设置为评估模式test_loss = 0correct = 0total = 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 += target.size(0)correct += predicted.eq(target).sum().item()avg_loss = test_loss / len(test_loader)accuracy = 100. * correct / totalreturn avg_loss, accuracy  # 返回损失和准确率# 7.绘制每个 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()# 8. 执行训练和测试(设置 epochs=2 验证效果)
epochs = 2  
print("开始训练模型...")
final_accuracy = train(model, train_loader, test_loader, criterion, optimizer, device, epochs)
print(f"训练完成!最终测试准确率: {final_accuracy:.2f}%")

开始训练模型...
Epoch: 1/2 | Batch: 100/938 | 单Batch损失: 0.3583 | 累计平均损失: 0.6321
Epoch: 1/2 | Batch: 200/938 | 单Batch损失: 0.2035 | 累计平均损失: 0.4776
Epoch: 1/2 | Batch: 300/938 | 单Batch损失: 0.3044 | 累计平均损失: 0.4053
Epoch: 1/2 | Batch: 400/938 | 单Batch损失: 0.1427 | 累计平均损失: 0.3669
Epoch: 1/2 | Batch: 500/938 | 单Batch损失: 0.1742 | 累计平均损失: 0.3321
Epoch: 1/2 | Batch: 600/938 | 单Batch损失: 0.3089 | 累计平均损失: 0.3104
Epoch: 1/2 | Batch: 700/938 | 单Batch损失: 0.0456 | 累计平均损失: 0.2921
Epoch: 1/2 | Batch: 800/938 | 单Batch损失: 0.1008 | 累计平均损失: 0.2763
Epoch: 1/2 | Batch: 900/938 | 单Batch损失: 0.3017 | 累计平均损失: 0.2629
Epoch 1/2 完成 | 训练准确率: 92.43% | 测试准确率: 95.90%
Epoch: 2/2 | Batch: 100/938 | 单Batch损失: 0.1727 | 累计平均损失: 0.1358
Epoch: 2/2 | Batch: 200/938 | 单Batch损失: 0.1751 | 累计平均损失: 0.1291
Epoch: 2/2 | Batch: 300/938 | 单Batch损失: 0.1239 | 累计平均损失: 0.1283
Epoch: 2/2 | Batch: 400/938 | 单Batch损失: 0.2183 | 累计平均损失: 0.1233
Epoch: 2/2 | Batch: 500/938 | 单Batch损失: 0.0211 | 累计平均损失: 0.1206
Epoch: 2/2 | Batch: 600/938 | 单Batch损失: 0.0590 | 累计平均损失: 0.1191
Epoch: 2/2 | Batch: 700/938 | 单Batch损失: 0.0954 | 累计平均损失: 0.1169
Epoch: 2/2 | Batch: 800/938 | 单Batch损失: 0.1728 | 累计平均损失: 0.1151
Epoch: 2/2 | Batch: 900/938 | 单Batch损失: 0.0786 | 累计平均损失: 0.1137
Epoch 2/2 完成 | 训练准确率: 96.67% | 测试准确率: 96.91%

 彩色图片的规范写法

彩色的通道也是在第一步被直接展平,其他代码一致

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  # 解决负号显示问题# 1. 数据预处理
transform = transforms.Compose([transforms.ToTensor(),                # 转换为张量transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))  # 标准化处理
])# 2. 加载CIFAR-10数据集
train_dataset = datasets.CIFAR10(root='./data',train=True,download=True,transform=transform
)test_dataset = datasets.CIFAR10(root='./data',train=False,transform=transform
)# 3. 创建数据加载器
batch_size = 64
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)# 4. 定义MLP模型(适应CIFAR-10的输入尺寸)
class MLP(nn.Module):def __init__(self):super(MLP, self).__init__()self.flatten = nn.Flatten()  # 将3x32x32的图像展平为3072维向量self.layer1 = nn.Linear(3072, 512)  # 第一层:3072个输入,512个神经元self.relu1 = nn.ReLU()self.dropout1 = nn.Dropout(0.2)  # 添加Dropout防止过拟合self.layer2 = nn.Linear(512, 256)  # 第二层:512个输入,256个神经元self.relu2 = nn.ReLU()self.dropout2 = nn.Dropout(0.2)self.layer3 = nn.Linear(256, 10)  # 输出层:10个类别def forward(self, x):# 第一步:将输入图像展平为一维向量x = self.flatten(x)  # 输入尺寸: [batch_size, 3, 32, 32] → [batch_size, 3072]# 第一层全连接 + 激活 + Dropoutx = self.layer1(x)   # 线性变换: [batch_size, 3072] → [batch_size, 512]x = self.relu1(x)    # 应用ReLU激活函数x = self.dropout1(x) # 训练时随机丢弃部分神经元输出# 第二层全连接 + 激活 + Dropoutx = self.layer2(x)   # 线性变换: [batch_size, 512] → [batch_size, 256]x = self.relu2(x)    # 应用ReLU激活函数x = self.dropout2(x) # 训练时随机丢弃部分神经元输出# 第三层(输出层)全连接x = self.layer3(x)   # 线性变换: [batch_size, 256] → [batch_size, 10]return x  # 返回未经过Softmax的logits# 检查GPU是否可用
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")# 初始化模型
model = MLP()
model = model.to(device)  # 将模型移至GPU(如果可用)criterion = nn.CrossEntropyLoss()  # 交叉熵损失函数
optimizer = optim.Adam(model.parameters(), lr=0.001)  # Adam优化器# 5. 训练模型(记录每个 iteration 的损失)
def train(model, train_loader, test_loader, criterion, optimizer, device, epochs):model.train()  # 设置为训练模式# 记录每个 iteration 的损失all_iter_losses = []  # 存储所有 batch 的损失iter_indices = []     # 存储 iteration 序号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 / total# 测试阶段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_testprint(f'Epoch {epoch+1}/{epochs} 完成 | 训练准确率: {epoch_train_acc:.2f}% | 测试准确率: {epoch_test_acc:.2f}%')# 绘制所有 iteration 的损失曲线plot_iter_losses(all_iter_losses, iter_indices)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. 执行训练和测试
epochs = 20  # 增加训练轮次以获得更好效果
print("开始训练模型...")
final_accuracy = train(model, train_loader, test_loader, criterion, optimizer, device, epochs)
print(f"训练完成!最终测试准确率: {final_accuracy:.2f}%")# # 保存模型
# torch.save(model.state_dict(), 'cifar10_mlp_model.pth')
# # print("模型已保存为: cifar10_mlp_model.pth")

开始训练模型...
Epoch: 1/20 | Batch: 100/782 | 单Batch损失: 1.7651 | 累计平均损失: 1.9071
Epoch: 1/20 | Batch: 200/782 | 单Batch损失: 1.6451 | 累计平均损失: 1.8383
Epoch: 1/20 | Batch: 300/782 | 单Batch损失: 1.7347 | 累计平均损失: 1.7946
Epoch: 1/20 | Batch: 400/782 | 单Batch损失: 1.4815 | 累计平均损失: 1.7699
Epoch: 1/20 | Batch: 500/782 | 单Batch损失: 1.4975 | 累计平均损失: 1.7451
Epoch: 1/20 | Batch: 600/782 | 单Batch损失: 1.5473 | 累计平均损失: 1.7276
Epoch: 1/20 | Batch: 700/782 | 单Batch损失: 1.7658 | 累计平均损失: 1.7156
Epoch 1/20 完成 | 训练准确率: 39.61% | 测试准确率: 45.33%
Epoch: 2/20 | Batch: 100/782 | 单Batch损失: 1.5833 | 累计平均损失: 1.5051
Epoch: 2/20 | Batch: 200/782 | 单Batch损失: 1.6505 | 累计平均损失: 1.4793
Epoch: 2/20 | Batch: 300/782 | 单Batch损失: 1.4405 | 累计平均损失: 1.4739
Epoch: 2/20 | Batch: 400/782 | 单Batch损失: 1.6979 | 累计平均损失: 1.4731
Epoch: 2/20 | Batch: 500/782 | 单Batch损失: 1.3146 | 累计平均损失: 1.4700
Epoch: 2/20 | Batch: 600/782 | 单Batch损失: 1.5724 | 累计平均损失: 1.4658
Epoch: 2/20 | Batch: 700/782 | 单Batch损失: 1.5681 | 累计平均损失: 1.4607
Epoch 2/20 完成 | 训练准确率: 48.26% | 测试准确率: 49.34%
Epoch: 3/20 | Batch: 100/782 | 单Batch损失: 1.3666 | 累计平均损失: 1.3114
Epoch: 3/20 | Batch: 200/782 | 单Batch损失: 1.3532 | 累计平均损失: 1.3148
Epoch: 3/20 | Batch: 300/782 | 单Batch损失: 1.4054 | 累计平均损失: 1.3211
Epoch: 3/20 | Batch: 400/782 | 单Batch损失: 1.3869 | 累计平均损失: 1.3290
Epoch: 3/20 | Batch: 500/782 | 单Batch损失: 1.4669 | 累计平均损失: 1.3355
Epoch: 3/20 | Batch: 600/782 | 单Batch损失: 1.4954 | 累计平均损失: 1.3366
Epoch: 3/20 | Batch: 700/782 | 单Batch损失: 1.4023 | 累计平均损失: 1.3353
Epoch 3/20 完成 | 训练准确率: 52.66% | 测试准确率: 50.85%
Epoch: 4/20 | Batch: 100/782 | 单Batch损失: 1.1709 | 累计平均损失: 1.2249
Epoch: 4/20 | Batch: 200/782 | 单Batch损失: 1.1826 | 累计平均损失: 1.2426
Epoch: 4/20 | Batch: 300/782 | 单Batch损失: 1.1949 | 累计平均损失: 1.2372
Epoch: 4/20 | Batch: 400/782 | 单Batch损失: 1.2972 | 累计平均损失: 1.2403
Epoch: 4/20 | Batch: 500/782 | 单Batch损失: 1.4556 | 累计平均损失: 1.2454
Epoch: 4/20 | Batch: 600/782 | 单Batch损失: 1.2786 | 累计平均损失: 1.2487
Epoch: 4/20 | Batch: 700/782 | 单Batch损失: 1.1699 | 累计平均损失: 1.2466
Epoch 4/20 完成 | 训练准确率: 55.70% | 测试准确率: 52.14%
Epoch: 5/20 | Batch: 100/782 | 单Batch损失: 1.2645 | 累计平均损失: 1.1450
Epoch: 5/20 | Batch: 200/782 | 单Batch损失: 1.1492 | 累计平均损失: 1.1392
Epoch: 5/20 | Batch: 300/782 | 单Batch损失: 1.1347 | 累计平均损失: 1.1361
Epoch: 5/20 | Batch: 400/782 | 单Batch损失: 1.3953 | 累计平均损失: 1.1412
Epoch: 5/20 | Batch: 500/782 | 单Batch损失: 1.1296 | 累计平均损失: 1.1469
Epoch: 5/20 | Batch: 600/782 | 单Batch损失: 1.1949 | 累计平均损失: 1.1510
Epoch: 5/20 | Batch: 700/782 | 单Batch损失: 1.2645 | 累计平均损失: 1.1544
Epoch 5/20 完成 | 训练准确率: 59.00% | 测试准确率: 52.44%
Epoch: 6/20 | Batch: 100/782 | 单Batch损失: 1.0381 | 累计平均损失: 1.0292
Epoch: 6/20 | Batch: 200/782 | 单Batch损失: 0.9202 | 累计平均损失: 1.0359
Epoch: 6/20 | Batch: 300/782 | 单Batch损失: 0.8801 | 累计平均损失: 1.0499
Epoch: 6/20 | Batch: 400/782 | 单Batch损失: 1.1457 | 累计平均损失: 1.0617
Epoch: 6/20 | Batch: 500/782 | 单Batch损失: 1.0391 | 累计平均损失: 1.0674
Epoch: 6/20 | Batch: 600/782 | 单Batch损失: 1.0533 | 累计平均损失: 1.0729
Epoch: 6/20 | Batch: 700/782 | 单Batch损失: 0.9226 | 累计平均损失: 1.0751
Epoch 6/20 完成 | 训练准确率: 61.77% | 测试准确率: 53.18%
Epoch: 7/20 | Batch: 100/782 | 单Batch损失: 1.0547 | 累计平均损失: 0.9957
Epoch: 7/20 | Batch: 200/782 | 单Batch损失: 0.8219 | 累计平均损失: 0.9777
Epoch: 7/20 | Batch: 300/782 | 单Batch损失: 0.9493 | 累计平均损失: 0.9798
Epoch: 7/20 | Batch: 400/782 | 单Batch损失: 1.2563 | 累计平均损失: 0.9864
Epoch: 7/20 | Batch: 500/782 | 单Batch损失: 1.1910 | 累计平均损失: 0.9896
Epoch: 7/20 | Batch: 600/782 | 单Batch损失: 1.0114 | 累计平均损失: 0.9973
Epoch: 7/20 | Batch: 700/782 | 单Batch损失: 1.2899 | 累计平均损失: 1.0011
Epoch 7/20 完成 | 训练准确率: 64.17% | 测试准确率: 53.81%
Epoch: 8/20 | Batch: 100/782 | 单Batch损失: 0.9333 | 累计平均损失: 0.8664
Epoch: 8/20 | Batch: 200/782 | 单Batch损失: 0.9308 | 累计平均损失: 0.8806
Epoch: 8/20 | Batch: 300/782 | 单Batch损失: 0.8810 | 累计平均损失: 0.8839
Epoch: 8/20 | Batch: 400/782 | 单Batch损失: 1.0675 | 累计平均损失: 0.8961
Epoch: 8/20 | Batch: 500/782 | 单Batch损失: 0.9667 | 累计平均损失: 0.9073
Epoch: 8/20 | Batch: 600/782 | 单Batch损失: 0.8929 | 累计平均损失: 0.9172
Epoch: 8/20 | Batch: 700/782 | 单Batch损失: 0.7617 | 累计平均损失: 0.9211
Epoch 8/20 完成 | 训练准确率: 66.93% | 测试准确率: 52.94%
Epoch: 9/20 | Batch: 100/782 | 单Batch损失: 0.7796 | 累计平均损失: 0.8058
Epoch: 9/20 | Batch: 200/782 | 单Batch损失: 0.8115 | 累计平均损失: 0.8100
Epoch: 9/20 | Batch: 300/782 | 单Batch损失: 0.9550 | 累计平均损失: 0.8270
Epoch: 9/20 | Batch: 400/782 | 单Batch损失: 0.9310 | 累计平均损失: 0.8375
Epoch: 9/20 | Batch: 500/782 | 单Batch损失: 0.7261 | 累计平均损失: 0.8444
Epoch: 9/20 | Batch: 600/782 | 单Batch损失: 0.8041 | 累计平均损失: 0.8528
Epoch: 9/20 | Batch: 700/782 | 单Batch损失: 0.9113 | 累计平均损失: 0.8579
Epoch 9/20 完成 | 训练准确率: 69.25% | 测试准确率: 53.07%
Epoch: 10/20 | Batch: 100/782 | 单Batch损失: 0.7703 | 累计平均损失: 0.7477
Epoch: 10/20 | Batch: 200/782 | 单Batch损失: 0.6830 | 累计平均损失: 0.7431
Epoch: 10/20 | Batch: 300/782 | 单Batch损失: 0.7435 | 累计平均损失: 0.7627
Epoch: 10/20 | Batch: 400/782 | 单Batch损失: 0.6192 | 累计平均损失: 0.7673
Epoch: 10/20 | Batch: 500/782 | 单Batch损失: 0.8552 | 累计平均损失: 0.7752
Epoch: 10/20 | Batch: 600/782 | 单Batch损失: 0.8798 | 累计平均损失: 0.7761
Epoch: 10/20 | Batch: 700/782 | 单Batch损失: 0.7172 | 累计平均损失: 0.7835
Epoch 10/20 完成 | 训练准确率: 71.90% | 测试准确率: 53.15%
Epoch: 11/20 | Batch: 100/782 | 单Batch损失: 0.6230 | 累计平均损失: 0.6893
Epoch: 11/20 | Batch: 200/782 | 单Batch损失: 0.4892 | 累计平均损失: 0.6704
Epoch: 11/20 | Batch: 300/782 | 单Batch损失: 0.7135 | 累计平均损失: 0.6817
Epoch: 11/20 | Batch: 400/782 | 单Batch损失: 0.6384 | 累计平均损失: 0.6983
Epoch: 11/20 | Batch: 500/782 | 单Batch损失: 0.6882 | 累计平均损失: 0.7042
Epoch: 11/20 | Batch: 600/782 | 单Batch损失: 0.7682 | 累计平均损失: 0.7159
Epoch: 11/20 | Batch: 700/782 | 单Batch损失: 0.8293 | 累计平均损失: 0.7234
Epoch 11/20 完成 | 训练准确率: 73.90% | 测试准确率: 52.98%
Epoch: 12/20 | Batch: 100/782 | 单Batch损失: 0.8580 | 累计平均损失: 0.6084
Epoch: 12/20 | Batch: 200/782 | 单Batch损失: 0.5278 | 累计平均损失: 0.6107
Epoch: 12/20 | Batch: 300/782 | 单Batch损失: 0.8430 | 累计平均损失: 0.6155
Epoch: 12/20 | Batch: 400/782 | 单Batch损失: 0.6415 | 累计平均损失: 0.6241
Epoch: 12/20 | Batch: 500/782 | 单Batch损失: 0.4772 | 累计平均损失: 0.6379
Epoch: 12/20 | Batch: 600/782 | 单Batch损失: 0.7100 | 累计平均损失: 0.6486
Epoch: 12/20 | Batch: 700/782 | 单Batch损失: 0.6771 | 累计平均损失: 0.6554
Epoch 12/20 完成 | 训练准确率: 76.30% | 测试准确率: 52.73%
Epoch: 13/20 | Batch: 100/782 | 单Batch损失: 0.8751 | 累计平均损失: 0.5509
Epoch: 13/20 | Batch: 200/782 | 单Batch损失: 0.7454 | 累计平均损失: 0.5603
Epoch: 13/20 | Batch: 300/782 | 单Batch损失: 0.5004 | 累计平均损失: 0.5709
Epoch: 13/20 | Batch: 400/782 | 单Batch损失: 0.7007 | 累计平均损失: 0.5801
Epoch: 13/20 | Batch: 500/782 | 单Batch损失: 0.6423 | 累计平均损失: 0.5948
Epoch: 13/20 | Batch: 600/782 | 单Batch损失: 0.6235 | 累计平均损失: 0.5999
Epoch: 13/20 | Batch: 700/782 | 单Batch损失: 0.5021 | 累计平均损失: 0.6096
Epoch 13/20 完成 | 训练准确率: 77.62% | 测试准确率: 51.15%
Epoch: 14/20 | Batch: 100/782 | 单Batch损失: 0.5765 | 累计平均损失: 0.5398
Epoch: 14/20 | Batch: 200/782 | 单Batch损失: 0.6035 | 累计平均损失: 0.5396
Epoch: 14/20 | Batch: 300/782 | 单Batch损失: 0.3353 | 累计平均损失: 0.5436
Epoch: 14/20 | Batch: 400/782 | 单Batch损失: 0.4378 | 累计平均损失: 0.5454
Epoch: 14/20 | Batch: 500/782 | 单Batch损失: 0.4470 | 累计平均损失: 0.5486
Epoch: 14/20 | Batch: 600/782 | 单Batch损失: 0.4291 | 累计平均损失: 0.5543
Epoch: 14/20 | Batch: 700/782 | 单Batch损失: 0.5143 | 累计平均损失: 0.5601
Epoch 14/20 完成 | 训练准确率: 79.44% | 测试准确率: 52.94%
Epoch: 15/20 | Batch: 100/782 | 单Batch损失: 0.2659 | 累计平均损失: 0.5028
Epoch: 15/20 | Batch: 200/782 | 单Batch损失: 0.4221 | 累计平均损失: 0.4937
Epoch: 15/20 | Batch: 300/782 | 单Batch损失: 0.6350 | 累计平均损失: 0.5028
Epoch: 15/20 | Batch: 400/782 | 单Batch损失: 0.5798 | 累计平均损失: 0.5104
Epoch: 15/20 | Batch: 500/782 | 单Batch损失: 0.5818 | 累计平均损失: 0.5190
Epoch: 15/20 | Batch: 600/782 | 单Batch损失: 0.7038 | 累计平均损失: 0.5242
Epoch: 15/20 | Batch: 700/782 | 单Batch损失: 0.4713 | 累计平均损失: 0.5313
Epoch 15/20 完成 | 训练准确率: 80.92% | 测试准确率: 52.52%
Epoch: 16/20 | Batch: 100/782 | 单Batch损失: 0.3545 | 累计平均损失: 0.4665
Epoch: 16/20 | Batch: 200/782 | 单Batch损失: 0.3323 | 累计平均损失: 0.4476
Epoch: 16/20 | Batch: 300/782 | 单Batch损失: 0.5079 | 累计平均损失: 0.4472
Epoch: 16/20 | Batch: 400/782 | 单Batch损失: 0.3290 | 累计平均损失: 0.4582
Epoch: 16/20 | Batch: 500/782 | 单Batch损失: 0.6484 | 累计平均损失: 0.4666
Epoch: 16/20 | Batch: 600/782 | 单Batch损失: 0.5194 | 累计平均损失: 0.4751
Epoch: 16/20 | Batch: 700/782 | 单Batch损失: 0.4114 | 累计平均损失: 0.4820
Epoch 16/20 完成 | 训练准确率: 82.55% | 测试准确率: 53.35%
Epoch: 17/20 | Batch: 100/782 | 单Batch损失: 0.3622 | 累计平均损失: 0.4173
Epoch: 17/20 | Batch: 200/782 | 单Batch损失: 0.5029 | 累计平均损失: 0.4242
Epoch: 17/20 | Batch: 300/782 | 单Batch损失: 0.2175 | 累计平均损失: 0.4257
Epoch: 17/20 | Batch: 400/782 | 单Batch损失: 0.4567 | 累计平均损失: 0.4377
Epoch: 17/20 | Batch: 500/782 | 单Batch损失: 0.4052 | 累计平均损失: 0.4375
Epoch: 17/20 | Batch: 600/782 | 单Batch损失: 0.4757 | 累计平均损失: 0.4386
Epoch: 17/20 | Batch: 700/782 | 单Batch损失: 0.6665 | 累计平均损失: 0.4424
Epoch 17/20 完成 | 训练准确率: 83.99% | 测试准确率: 52.31%
Epoch: 18/20 | Batch: 100/782 | 单Batch损失: 0.2227 | 累计平均损失: 0.3752
Epoch: 18/20 | Batch: 200/782 | 单Batch损失: 0.4372 | 累计平均损失: 0.3792
Epoch: 18/20 | Batch: 300/782 | 单Batch损失: 0.3962 | 累计平均损失: 0.3877
Epoch: 18/20 | Batch: 400/782 | 单Batch损失: 0.3329 | 累计平均损失: 0.3953
Epoch: 18/20 | Batch: 500/782 | 单Batch损失: 0.5082 | 累计平均损失: 0.4019
Epoch: 18/20 | Batch: 600/782 | 单Batch损失: 0.2860 | 累计平均损失: 0.4096
Epoch: 18/20 | Batch: 700/782 | 单Batch损失: 0.3686 | 累计平均损失: 0.4199
Epoch 18/20 完成 | 训练准确率: 84.74% | 测试准确率: 52.00%
Epoch: 19/20 | Batch: 100/782 | 单Batch损失: 0.2916 | 累计平均损失: 0.3487
Epoch: 19/20 | Batch: 200/782 | 单Batch损失: 0.2671 | 累计平均损失: 0.3448
Epoch: 19/20 | Batch: 300/782 | 单Batch损失: 0.4126 | 累计平均损失: 0.3619
Epoch: 19/20 | Batch: 400/782 | 单Batch损失: 0.3170 | 累计平均损失: 0.3716
Epoch: 19/20 | Batch: 500/782 | 单Batch损失: 0.3622 | 累计平均损失: 0.3814
Epoch: 19/20 | Batch: 600/782 | 单Batch损失: 0.7297 | 累计平均损失: 0.3955
Epoch: 19/20 | Batch: 700/782 | 单Batch损失: 0.3780 | 累计平均损失: 0.3996
Epoch 19/20 完成 | 训练准确率: 85.45% | 测试准确率: 52.95%
Epoch: 20/20 | Batch: 100/782 | 单Batch损失: 0.3184 | 累计平均损失: 0.3501
Epoch: 20/20 | Batch: 200/782 | 单Batch损失: 0.3582 | 累计平均损失: 0.3503
Epoch: 20/20 | Batch: 300/782 | 单Batch损失: 0.3684 | 累计平均损失: 0.3620
Epoch: 20/20 | Batch: 400/782 | 单Batch损失: 0.3751 | 累计平均损失: 0.3620
Epoch: 20/20 | Batch: 500/782 | 单Batch损失: 0.5326 | 累计平均损失: 0.3654
Epoch: 20/20 | Batch: 600/782 | 单Batch损失: 0.4992 | 累计平均损失: 0.3738
Epoch: 20/20 | Batch: 700/782 | 单Batch损失: 0.5246 | 累计平均损失: 0.3823
Epoch 20/20 完成 | 训练准确率: 86.43% | 测试准确率: 52.81%

# 7. 执行训练和测试
epochs = 20  # 增加训练轮次以获得更好效果
print("开始训练模型...")
final_accuracy = train(model, train_loader, test_loader, criterion, optimizer, device, epochs)
print(f"训练完成!最终测试准确率: {final_accuracy:.2f}%")

 开始训练模型...
Epoch: 1/20 | Batch: 100/782 | 单Batch损失: 1.2283 | 累计平均损失: 1.2612
Epoch: 1/20 | Batch: 200/782 | 单Batch损失: 0.9276 | 累计平均损失: 1.2284
Epoch: 1/20 | Batch: 300/782 | 单Batch损失: 1.0029 | 累计平均损失: 1.1975
Epoch: 1/20 | Batch: 400/782 | 单Batch损失: 0.9595 | 累计平均损失: 1.1683
Epoch: 1/20 | Batch: 500/782 | 单Batch损失: 0.9711 | 累计平均损失: 1.1434
Epoch: 1/20 | Batch: 600/782 | 单Batch损失: 0.9535 | 累计平均损失: 1.1239
Epoch: 1/20 | Batch: 700/782 | 单Batch损失: 0.8682 | 累计平均损失: 1.1092
Epoch 1/20 完成 | 训练准确率: 63.68% | 测试准确率: 52.26%
Epoch: 2/20 | Batch: 100/782 | 单Batch损失: 0.4003 | 累计平均损失: 0.4802
Epoch: 2/20 | Batch: 200/782 | 单Batch损失: 0.3518 | 累计平均损失: 0.4287
Epoch: 2/20 | Batch: 300/782 | 单Batch损失: 0.3121 | 累计平均损失: 0.4069
Epoch: 2/20 | Batch: 400/782 | 单Batch损失: 0.2630 | 累计平均损失: 0.3871
Epoch: 2/20 | Batch: 500/782 | 单Batch损失: 0.2022 | 累计平均损失: 0.3747
Epoch: 2/20 | Batch: 600/782 | 单Batch损失: 0.4245 | 累计平均损失: 0.3641
Epoch: 2/20 | Batch: 700/782 | 单Batch损失: 0.5932 | 累计平均损失: 0.3624
Epoch 2/20 完成 | 训练准确率: 87.42% | 测试准确率: 53.74%
Epoch: 3/20 | Batch: 100/782 | 单Batch损失: 0.2434 | 累计平均损失: 0.2580
Epoch: 3/20 | Batch: 200/782 | 单Batch损失: 0.1475 | 累计平均损失: 0.2613
Epoch: 3/20 | Batch: 300/782 | 单Batch损失: 0.2406 | 累计平均损失: 0.2677
Epoch: 3/20 | Batch: 400/782 | 单Batch损失: 0.2360 | 累计平均损失: 0.2782
Epoch: 3/20 | Batch: 500/782 | 单Batch损失: 0.4137 | 累计平均损失: 0.2828
Epoch: 3/20 | Batch: 600/782 | 单Batch损失: 0.1983 | 累计平均损失: 0.2897
Epoch: 3/20 | Batch: 700/782 | 单Batch损失: 0.3044 | 累计平均损失: 0.3031
Epoch 3/20 完成 | 训练准确率: 89.02% | 测试准确率: 53.16%
Epoch: 4/20 | Batch: 100/782 | 单Batch损失: 0.1982 | 累计平均损失: 0.3060
Epoch: 4/20 | Batch: 200/782 | 单Batch损失: 0.2221 | 累计平均损失: 0.2822
Epoch: 4/20 | Batch: 300/782 | 单Batch损失: 0.2068 | 累计平均损失: 0.2997
Epoch: 4/20 | Batch: 400/782 | 单Batch损失: 0.2877 | 累计平均损失: 0.3068
Epoch: 4/20 | Batch: 500/782 | 单Batch损失: 0.4148 | 累计平均损失: 0.3083
Epoch: 4/20 | Batch: 600/782 | 单Batch损失: 0.2733 | 累计平均损失: 0.3146
Epoch: 4/20 | Batch: 700/782 | 单Batch损失: 0.3970 | 累计平均损失: 0.3216
Epoch 4/20 完成 | 训练准确率: 88.37% | 测试准确率: 52.74%
Epoch: 5/20 | Batch: 100/782 | 单Batch损失: 0.3190 | 累计平均损失: 0.3077
Epoch: 5/20 | Batch: 200/782 | 单Batch损失: 0.2956 | 累计平均损失: 0.3066
Epoch: 5/20 | Batch: 300/782 | 单Batch损失: 0.4220 | 累计平均损失: 0.3110
Epoch: 5/20 | Batch: 400/782 | 单Batch损失: 0.4378 | 累计平均损失: 0.3096
Epoch: 5/20 | Batch: 500/782 | 单Batch损失: 0.2949 | 累计平均损失: 0.3165
Epoch: 5/20 | Batch: 600/782 | 单Batch损失: 0.3173 | 累计平均损失: 0.3160
Epoch: 5/20 | Batch: 700/782 | 单Batch损失: 0.6067 | 累计平均损失: 0.3183
Epoch 5/20 完成 | 训练准确率: 88.56% | 测试准确率: 52.62%
Epoch: 6/20 | Batch: 100/782 | 单Batch损失: 0.4261 | 累计平均损失: 0.3048
Epoch: 6/20 | Batch: 200/782 | 单Batch损失: 0.2407 | 累计平均损失: 0.2976
Epoch: 6/20 | Batch: 300/782 | 单Batch损失: 0.2988 | 累计平均损失: 0.2992
Epoch: 6/20 | Batch: 400/782 | 单Batch损失: 0.3148 | 累计平均损失: 0.2975
Epoch: 6/20 | Batch: 500/782 | 单Batch损失: 0.1310 | 累计平均损失: 0.3000
Epoch: 6/20 | Batch: 600/782 | 单Batch损失: 0.2803 | 累计平均损失: 0.3041
Epoch: 6/20 | Batch: 700/782 | 单Batch损失: 0.3813 | 累计平均损失: 0.3095
Epoch 6/20 完成 | 训练准确率: 89.00% | 测试准确率: 52.78%
Epoch: 7/20 | Batch: 100/782 | 单Batch损失: 0.2410 | 累计平均损失: 0.2750
Epoch: 7/20 | Batch: 200/782 | 单Batch损失: 0.2276 | 累计平均损失: 0.2663
Epoch: 7/20 | Batch: 300/782 | 单Batch损失: 0.3247 | 累计平均损失: 0.2825
Epoch: 7/20 | Batch: 400/782 | 单Batch损失: 0.6075 | 累计平均损失: 0.2855
Epoch: 7/20 | Batch: 500/782 | 单Batch损失: 0.2506 | 累计平均损失: 0.2876
Epoch: 7/20 | Batch: 600/782 | 单Batch损失: 0.2028 | 累计平均损失: 0.2901
Epoch: 7/20 | Batch: 700/782 | 单Batch损失: 0.3518 | 累计平均损失: 0.2985
Epoch 7/20 完成 | 训练准确率: 89.28% | 测试准确率: 52.29%
Epoch: 8/20 | Batch: 100/782 | 单Batch损失: 0.2655 | 累计平均损失: 0.2793
Epoch: 8/20 | Batch: 200/782 | 单Batch损失: 0.2722 | 累计平均损失: 0.2690
Epoch: 8/20 | Batch: 300/782 | 单Batch损失: 0.1490 | 累计平均损失: 0.2628
Epoch: 8/20 | Batch: 400/782 | 单Batch损失: 0.1699 | 累计平均损失: 0.2589
Epoch: 8/20 | Batch: 500/782 | 单Batch损失: 0.2260 | 累计平均损失: 0.2631
Epoch: 8/20 | Batch: 600/782 | 单Batch损失: 0.2059 | 累计平均损失: 0.2660
Epoch: 8/20 | Batch: 700/782 | 单Batch损失: 0.2786 | 累计平均损失: 0.2707
Epoch 8/20 完成 | 训练准确率: 90.32% | 测试准确率: 52.97%
Epoch: 9/20 | Batch: 100/782 | 单Batch损失: 0.2137 | 累计平均损失: 0.2697
Epoch: 9/20 | Batch: 200/782 | 单Batch损失: 0.3333 | 累计平均损失: 0.2597
Epoch: 9/20 | Batch: 300/782 | 单Batch损失: 0.3019 | 累计平均损失: 0.2573
Epoch: 9/20 | Batch: 400/782 | 单Batch损失: 0.2231 | 累计平均损失: 0.2621
Epoch: 9/20 | Batch: 500/782 | 单Batch损失: 0.3063 | 累计平均损失: 0.2664
Epoch: 9/20 | Batch: 600/782 | 单Batch损失: 0.2879 | 累计平均损失: 0.2664
Epoch: 9/20 | Batch: 700/782 | 单Batch损失: 0.2971 | 累计平均损失: 0.2721
Epoch 9/20 完成 | 训练准确率: 90.35% | 测试准确率: 52.02%
Epoch: 10/20 | Batch: 100/782 | 单Batch损失: 0.0978 | 累计平均损失: 0.2191
Epoch: 10/20 | Batch: 200/782 | 单Batch损失: 0.1508 | 累计平均损失: 0.2164
Epoch: 10/20 | Batch: 300/782 | 单Batch损失: 0.1897 | 累计平均损失: 0.2236
Epoch: 10/20 | Batch: 400/782 | 单Batch损失: 0.1723 | 累计平均损失: 0.2244
Epoch: 10/20 | Batch: 500/782 | 单Batch损失: 0.2125 | 累计平均损失: 0.2364
Epoch: 10/20 | Batch: 600/782 | 单Batch损失: 0.0915 | 累计平均损失: 0.2478
Epoch: 10/20 | Batch: 700/782 | 单Batch损失: 0.4483 | 累计平均损失: 0.2579
Epoch 10/20 完成 | 训练准确率: 91.04% | 测试准确率: 52.06%
Epoch: 11/20 | Batch: 100/782 | 单Batch损失: 0.2468 | 累计平均损失: 0.2272
Epoch: 11/20 | Batch: 200/782 | 单Batch损失: 0.3352 | 累计平均损失: 0.2301
Epoch: 11/20 | Batch: 300/782 | 单Batch损失: 0.1805 | 累计平均损失: 0.2297
Epoch: 11/20 | Batch: 400/782 | 单Batch损失: 0.3984 | 累计平均损失: 0.2327
Epoch: 11/20 | Batch: 500/782 | 单Batch损失: 0.2055 | 累计平均损失: 0.2432
Epoch: 11/20 | Batch: 600/782 | 单Batch损失: 0.2614 | 累计平均损失: 0.2482
Epoch: 11/20 | Batch: 700/782 | 单Batch损失: 0.2049 | 累计平均损失: 0.2594
Epoch 11/20 完成 | 训练准确率: 90.73% | 测试准确率: 52.65%
Epoch: 12/20 | Batch: 100/782 | 单Batch损失: 0.2631 | 累计平均损失: 0.2361
Epoch: 12/20 | Batch: 200/782 | 单Batch损失: 0.3625 | 累计平均损失: 0.2328
Epoch: 12/20 | Batch: 300/782 | 单Batch损失: 0.2776 | 累计平均损失: 0.2361
Epoch: 12/20 | Batch: 400/782 | 单Batch损失: 0.1552 | 累计平均损失: 0.2374
Epoch: 12/20 | Batch: 500/782 | 单Batch损失: 0.4105 | 累计平均损失: 0.2384
Epoch: 12/20 | Batch: 600/782 | 单Batch损失: 0.1825 | 累计平均损失: 0.2440
Epoch: 12/20 | Batch: 700/782 | 单Batch损失: 0.3351 | 累计平均损失: 0.2485
Epoch 12/20 完成 | 训练准确率: 91.36% | 测试准确率: 53.22%
Epoch: 13/20 | Batch: 100/782 | 单Batch损失: 0.1393 | 累计平均损失: 0.2292
Epoch: 13/20 | Batch: 200/782 | 单Batch损失: 0.1081 | 累计平均损失: 0.2329
Epoch: 13/20 | Batch: 300/782 | 单Batch损失: 0.2387 | 累计平均损失: 0.2395
Epoch: 13/20 | Batch: 400/782 | 单Batch损失: 0.3680 | 累计平均损失: 0.2432
Epoch: 13/20 | Batch: 500/782 | 单Batch损失: 0.4173 | 累计平均损失: 0.2502
Epoch: 13/20 | Batch: 600/782 | 单Batch损失: 0.3094 | 累计平均损失: 0.2537
Epoch: 13/20 | Batch: 700/782 | 单Batch损失: 0.1529 | 累计平均损失: 0.2564
Epoch 13/20 完成 | 训练准确率: 91.16% | 测试准确率: 52.58%
Epoch: 14/20 | Batch: 100/782 | 单Batch损失: 0.2478 | 累计平均损失: 0.2165
Epoch: 14/20 | Batch: 200/782 | 单Batch损失: 0.3821 | 累计平均损失: 0.2208
Epoch: 14/20 | Batch: 300/782 | 单Batch损失: 0.1603 | 累计平均损失: 0.2212
Epoch: 14/20 | Batch: 400/782 | 单Batch损失: 0.1973 | 累计平均损失: 0.2231
Epoch: 14/20 | Batch: 500/782 | 单Batch损失: 0.1641 | 累计平均损失: 0.2247
Epoch: 14/20 | Batch: 600/782 | 单Batch损失: 0.1680 | 累计平均损失: 0.2270
Epoch: 14/20 | Batch: 700/782 | 单Batch损失: 0.1552 | 累计平均损失: 0.2346
Epoch 14/20 完成 | 训练准确率: 91.74% | 测试准确率: 52.03%
Epoch: 15/20 | Batch: 100/782 | 单Batch损失: 0.2480 | 累计平均损失: 0.2251
Epoch: 15/20 | Batch: 200/782 | 单Batch损失: 0.3619 | 累计平均损失: 0.2279
Epoch: 15/20 | Batch: 300/782 | 单Batch损失: 0.2186 | 累计平均损失: 0.2332
Epoch: 15/20 | Batch: 400/782 | 单Batch损失: 0.1069 | 累计平均损失: 0.2327
Epoch: 15/20 | Batch: 500/782 | 单Batch损失: 0.1809 | 累计平均损失: 0.2382
Epoch: 15/20 | Batch: 600/782 | 单Batch损失: 0.3298 | 累计平均损失: 0.2412
Epoch: 15/20 | Batch: 700/782 | 单Batch损失: 0.1421 | 累计平均损失: 0.2412
Epoch 15/20 完成 | 训练准确率: 91.66% | 测试准确率: 53.11%
Epoch: 16/20 | Batch: 100/782 | 单Batch损失: 0.1439 | 累计平均损失: 0.1752
Epoch: 16/20 | Batch: 200/782 | 单Batch损失: 0.1940 | 累计平均损失: 0.1878
Epoch: 16/20 | Batch: 300/782 | 单Batch损失: 0.0542 | 累计平均损失: 0.1996
Epoch: 16/20 | Batch: 400/782 | 单Batch损失: 0.1820 | 累计平均损失: 0.2011
Epoch: 16/20 | Batch: 500/782 | 单Batch损失: 0.3156 | 累计平均损失: 0.2065
Epoch: 16/20 | Batch: 600/782 | 单Batch损失: 0.2317 | 累计平均损失: 0.2156
Epoch: 16/20 | Batch: 700/782 | 单Batch损失: 0.2105 | 累计平均损失: 0.2217
Epoch 16/20 完成 | 训练准确率: 92.30% | 测试准确率: 52.40%
Epoch: 17/20 | Batch: 100/782 | 单Batch损失: 0.1793 | 累计平均损失: 0.2449
Epoch: 17/20 | Batch: 200/782 | 单Batch损失: 0.2278 | 累计平均损失: 0.2343
Epoch: 17/20 | Batch: 300/782 | 单Batch损失: 0.1951 | 累计平均损失: 0.2315
Epoch: 17/20 | Batch: 400/782 | 单Batch损失: 0.2841 | 累计平均损失: 0.2280
Epoch: 17/20 | Batch: 500/782 | 单Batch损失: 0.1845 | 累计平均损失: 0.2256
Epoch: 17/20 | Batch: 600/782 | 单Batch损失: 0.2532 | 累计平均损失: 0.2231
Epoch: 17/20 | Batch: 700/782 | 单Batch损失: 0.3938 | 累计平均损失: 0.2261
Epoch 17/20 完成 | 训练准确率: 92.14% | 测试准确率: 52.76%
Epoch: 18/20 | Batch: 100/782 | 单Batch损失: 0.0784 | 累计平均损失: 0.2047
Epoch: 18/20 | Batch: 200/782 | 单Batch损失: 0.2569 | 累计平均损失: 0.1897
Epoch: 18/20 | Batch: 300/782 | 单Batch损失: 0.2867 | 累计平均损失: 0.1934
Epoch: 18/20 | Batch: 400/782 | 单Batch损失: 0.2843 | 累计平均损失: 0.1966
Epoch: 18/20 | Batch: 500/782 | 单Batch损失: 0.2486 | 累计平均损失: 0.2013
Epoch: 18/20 | Batch: 600/782 | 单Batch损失: 0.4471 | 累计平均损失: 0.2068
Epoch: 18/20 | Batch: 700/782 | 单Batch损失: 0.1483 | 累计平均损失: 0.2100
Epoch 18/20 完成 | 训练准确率: 92.80% | 测试准确率: 52.67%
Epoch: 19/20 | Batch: 100/782 | 单Batch损失: 0.1502 | 累计平均损失: 0.1719
Epoch: 19/20 | Batch: 200/782 | 单Batch损失: 0.1885 | 累计平均损失: 0.1848
Epoch: 19/20 | Batch: 300/782 | 单Batch损失: 0.1311 | 累计平均损失: 0.1963
Epoch: 19/20 | Batch: 400/782 | 单Batch损失: 0.1751 | 累计平均损失: 0.1939
Epoch: 19/20 | Batch: 500/782 | 单Batch损失: 0.2365 | 累计平均损失: 0.1970
Epoch: 19/20 | Batch: 600/782 | 单Batch损失: 0.0970 | 累计平均损失: 0.2056
Epoch: 19/20 | Batch: 700/782 | 单Batch损失: 0.3054 | 累计平均损失: 0.2153
Epoch 19/20 完成 | 训练准确率: 92.64% | 测试准确率: 52.34%
Epoch: 20/20 | Batch: 100/782 | 单Batch损失: 0.3200 | 累计平均损失: 0.2084
Epoch: 20/20 | Batch: 200/782 | 单Batch损失: 0.1219 | 累计平均损失: 0.2065
Epoch: 20/20 | Batch: 300/782 | 单Batch损失: 0.3571 | 累计平均损失: 0.2109
Epoch: 20/20 | Batch: 400/782 | 单Batch损失: 0.3528 | 累计平均损失: 0.2068
Epoch: 20/20 | Batch: 500/782 | 单Batch损失: 0.1560 | 累计平均损失: 0.2096
Epoch: 20/20 | Batch: 600/782 | 单Batch损失: 0.4336 | 累计平均损失: 0.2143
Epoch: 20/20 | Batch: 700/782 | 单Batch损失: 0.2936 | 累计平均损失: 0.2166
Epoch 20/20 完成 | 训练准确率: 92.63% | 测试准确率: 52.84%

@浙大疏锦行 


http://www.hkcw.cn/article/NuKWWrkwWc.shtml

相关文章

【Web应用】若依框架:基础篇12 项目结构

文章目录 ⭐前言⭐一、课程讲解🌟1、寻找合适的对象✨1) ⭐二、怎样选择设计模式?🌟1、寻找合适的对象✨1) ⭐三、怎样使用设计模式?🌟1、寻找合适的对象✨1) ⭐总结 标题详情作者JosieBook头衔CSDN博客专家资格、阿里…

系统设计——状态机模型设计经验

摘要 本文主要介绍了状态机模型的设计经验,包括其定义、适用场景、建模示例、事件驱动设计以及配置数据化等内容。状态机模型通过事件驱动控制状态变化,适用于流程驱动系统、生命周期管理等场景,不适用于状态变化简单或不确定的场景。文中还…

WSP 对CSV文件中E+如何恢复可用方案

背景 在日常工作中会遇到从系统软件中导出的csv文件,其中长的字符会被自动科学计数,转成E,导致数据失去原来的信息。 样例 从系统中导出的用户表,其中【mobile】和【serial_no】两列的数据被转化为E,失去原始的信息…

突破知识传统依赖:模型内在推理能力评估的基准测试集 KOR-Bench

项目主页:https://kor-bench.github.io/ GitHub: https://github.com/multimodal-art-projection/KOR-BENCH 论文:https://arxiv.org/abs/2410.06526 随着人工智能技术的迅猛发展,大模型评估已成为AI领域的关键议题。在前序文章中&#xf…

ReactHook有哪些

React 中常用的 Hooks 列表及用法 React Hooks 是 React 16.8 版本引入的一项重要特性,它极大地简化和优化了函数组件的开发过程。以下是 React 中常用的 Hooks 列表及其详细用法: 1. useState useState 是用于在函数组件中添加状态的 Hook。通过调用…

移动端上拉 下拉 初始状态解决方案

引入第三方组件嵌套 手机端 将页面分为两部分: top顶部标题 例如search输入mescrollvue 组件嵌套 里面使用for 循环 初始状态下有三个状态的回调函数 分别是down up init 三个 分别对应下拉 上拉 初始状态触发

DMNDDB INSTALL新云文档数据库安装部署

DMNDDB INSTALL新云文档数据库安装部署 1 环境说明2 优化root用户限制3 准备安装包3.1 部署安装包3.2 安装目录介绍3.2.1 默认目录安装路径bin3.2.2 默认目录安装路径conf3.2.3 默认目录安装路径doc3.2.4 默认目录安装路径 thirdparty3.2.5 默认目录安装路径 tools 4 一键安装4…

深入剖析 DMA:原理、结构与工作流程详解

文章目录 DMADMA简介存储器映像DMA框图DMA基本结构DMA请求数据宽度与对齐数据转运DMA变量与常量实验外设寄存器访问DMA 配置与编程思路DMA 代码实现与测试DMA模块主要代码 DMA DMA简介 DMA 简介 功能与权限:英文全称 direct memory access,可直接访问…

从公开到私密:重新思考 Web3 的数据安全

去中心化存储是 Web3 的基石之一,使用户和应用能够在无需依赖中心化服务商的情况下存储数据。但自由也带来了一个重大挑战:数据安全。在一个无许可的世界中,如何确保用户文档、游戏资产或 AI 数据集等敏感内容是私密的、可控访问的&#xff0…

xilinx位置约束

xilinx位置约束 1.set_property LOC XXX XXX 参考:https://blog.csdn.net/Calvin790704/article/details/132980316 参考:https://blog.csdn.net/u011329967/article/details/124466598 pcie bank参考:Xilinx PCIE core管脚分配错误的解决方案…

亚马逊商品评论爬取与情感分析:Python+BeautifulSoup实战(含防封策略)

一、数据爬取模块(Python示例) import requests from bs4 import BeautifulSoup import pandas as pd import timeheaders {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36,Accept-Language: en-US }def scrape_amazon_re…

uniapp使用Canvas生成电子名片

uniapp使用Canvas生成电子名片 工作中有生成电子名片的一个需求&#xff0c;刚刚好弄了发一下分享分享 文章目录 uniapp使用Canvas生成电子名片前言一、上代码&#xff1f;总结 前言 先看效果 一、上代码&#xff1f; 不对不对应该是上才艺&#xff0c;哈哈哈 <template…

量化qmt跟单聚宽小市值策略开发成功

现在分享下一位朋友实盘对接的账户交易信息&#xff0c;给大家看下资金曲线收益&#xff0c;还有聚宽回测曲线&#xff0c;对比图。 哈哈哈&#xff0c;5月份10w小资金&#xff0c;获利2.9点&#xff0c;非常高&#xff0c;刚刚开始&#xff0c;还是可以的。

龙虎榜——20250530

上证指数阳包阴&#xff0c;量能较前期下跌有放大&#xff0c;但个股跌多涨少&#xff0c;下跌超过4000个。 深证指数和上涨总体相同。 2025年5月30日龙虎榜行业方向分析 1. 医药&#xff08;创新药原料药&#xff09; 代表标的&#xff1a;华纳药厂、舒泰神、睿智医药、华…

CPT302-2425-S2-Multi-Agent Systems

Lec1 Introduction Five Trends in the History of Computing • Ubiquity; • Interconnection; • Intelligence; • Delegation; 委派 • Human-orientation. Other Trends in Computer Science • The Grid/Cloud; Grid & MAS • Ubiquitous Computing; • Semant…

Ubuntu系统下可执行文件在桌面单击运行教程

目录 ​编辑 操作环境&#xff1a;这个可执行文件在原目录下还有它的依赖文件 1&#xff0c;方法1&#xff1a;创建启动脚本 操作步骤​&#xff1a; &#xff08;1&#xff09;​​在桌面创建脚本文件​​&#xff08;如 run_main_improve.sh&#xff09;&#xff1a; ​…

SOC-ESP32S3部分:20-SPISPI屏幕驱动

飞书文档https://x509p6c8to.feishu.cn/wiki/RyLFwXd6ViBfi9kUe17cHPeAnhj ESP32-S3 有4个SPI接口 – 2 个 SPI 接口用于连接 flash 和 RAM – 2 个通用 SPI 接口 具体如下&#xff1a; • SPI0&#xff0c;供 ESP32-S3 的 GDMA 控制器与 Cache 访问封装内或封装外 flash/…

DAY 15 复习日

尝试找到一个kaggle或者其他地方的结构化数据集&#xff0c;用之前的内容完成一个全新的项目&#xff0c;这样你也是独立完成了一个专属于自己的项目。 数据来源&#xff1a;糖尿病分类数据集Kaggle 一、数据预处理 1、读取并查看数据 # 忽略警告 import warnings warnings.…

JAVA 常用 API 正则表达式

1 正则表达式作用 作用一&#xff1a;校验字符串是否满足规则作用二&#xff1a;在一段文本中查找满足要求的内容 2 正则表达式规则 2.1 字符类 package com.bjpowernode.test14;public class RegexDemo1 {public static void main(String[] args) {//public boolean matche…

【ArcGIS微课1000例】0147:Geographic Imager6.2下载安装教程

文章目录 一、软件功能二、下载地址三、安装教程Geographic Imager地图工具使Adobe Photoshop空间图像可以快速高效地工作。它增加了导入,编辑,操作和导出地理空间图像的工具,例如航空和卫星图像。Geographic Imager Mac功能非常强大,拥有栅格数据输出、投影信息修改、基于…