第四十五天打卡
知识点回顾:
tensorboard的发展历史和原理
tensorboard的常见操作
tensorboard在cifar上的实战:MLP和CNN模型
效果展示如下,很适合拿去组会汇报撑页数:
作业:对resnet18在cifar10上采用微调策略下,用tensorboard监控训练过程。
!pip install tensorboard -i https://pypi.tuna.tsinghua.edu.cn/simple
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 os
from torch.utils.tensorboard import SummaryWriter # 添加TensorBoard支持
import torchvision # 用于图像网格可视化# 设置中文字体支持
plt.rcParams["font.family"] = ["SimHei"]
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题# 检查GPU是否可用
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(f"使用设备: {device}")# 1. 数据预处理(训练集增强,测试集标准化)
train_transform = transforms.Compose([transforms.RandomCrop(32, padding=4),transforms.RandomHorizontalFlip(),transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1),transforms.RandomRotation(15),transforms.ToTensor(),transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010))
])test_transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010))
])# 2. 加载CIFAR-10数据集
train_dataset = datasets.CIFAR10(root='./data',train=True,download=True,transform=train_transform
)test_dataset = datasets.CIFAR10(root='./data',train=False,transform=test_transform
)# 3. 创建数据加载器
batch_size = 64
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)# 4. 定义ResNet18模型
def create_resnet18(pretrained=True, num_classes=10):model = models.resnet18(pretrained=pretrained)# 修改最后一层全连接层in_features = model.fc.in_featuresmodel.fc = nn.Linear(in_features, num_classes)return model.to(device)# 5. 冻结/解冻模型层的函数
def freeze_model(model, freeze=True):"""冻结或解冻模型的卷积层参数"""# 冻结/解冻除fc层外的所有参数for name, param in model.named_parameters():if 'fc' not in name:param.requires_grad = not freeze# 打印冻结状态frozen_params = sum(p.numel() for p in model.parameters() if not p.requires_grad)total_params = sum(p.numel() for p in model.parameters())if freeze:print(f"已冻结模型卷积层参数 ({frozen_params}/{total_params} 参数)")else:print(f"已解冻模型所有参数 ({total_params}/{total_params} 参数可训练)")return model# 6. 训练函数(支持阶段式训练并集成TensorBoard)
def train_with_freeze_schedule(model, train_loader, test_loader, criterion, optimizer, scheduler, device, epochs, freeze_epochs=5, writer=None):"""前freeze_epochs轮冻结卷积层,之后解冻所有层进行训练"""train_loss_history = []test_loss_history = []train_acc_history = []test_acc_history = []all_iter_losses = []iter_indices = []global_step = 0 # 用于TensorBoard的全局步数计数器# 记录模型结构和样本图像到TensorBoardif writer is not None:dataiter = iter(train_loader)images, _ = next(dataiter)images = images.to(device)writer.add_graph(model, images) # 记录模型计算图# 可视化训练样本img_grid = torchvision.utils.make_grid(images[:8].cpu())writer.add_image('训练样本', img_grid, global_step=0)# 初始冻结卷积层if freeze_epochs > 0:model = freeze_model(model, freeze=True)for epoch in range(epochs):# 解冻控制:在指定轮次后解冻所有层if epoch == freeze_epochs:model = freeze_model(model, freeze=False)# 解冻后调整优化器(可选)optimizer.param_groups[0]['lr'] = 1e-4 # 降低学习率防止过拟合if writer is not None:writer.add_text('训练状态', f'Epoch {epoch+1}: 解冻所有层并调整学习率', global_step)model.train() # 设置为训练模式running_loss = 0.0correct_train = 0total_train = 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 * len(train_loader) + batch_idx + 1)# 统计训练指标running_loss += iter_loss_, predicted = output.max(1)total_train += target.size(0)correct_train += predicted.eq(target).sum().item()# ================= TensorBoard记录 =================if writer is not None:# 每100批次记录一次训练指标if (batch_idx + 1) % 100 == 0:batch_acc = 100. * correct_train / total_trainwriter.add_scalar('Train/Batch Loss', iter_loss, global_step)writer.add_scalar('Train/Batch Accuracy', batch_acc, global_step)writer.add_scalar('Train/Learning Rate', optimizer.param_groups[0]['lr'], global_step)# 每200批次记录一次权重和梯度分布if (batch_idx + 1) % 200 == 0:for name, param in model.named_parameters():if param.requires_grad: # 只记录可训练参数writer.add_histogram(f'Weights/{name}', param, global_step)if param.grad is not None:writer.add_histogram(f'Gradients/{name}', param.grad, global_step)# =================================================# 每100批次打印进度if (batch_idx + 1) % 100 == 0:print(f"Epoch {epoch+1}/{epochs} | Batch {batch_idx+1}/{len(train_loader)} "f"| 单Batch损失: {iter_loss:.4f}")global_step += 1 # 更新全局步数# 计算 epoch 级指标epoch_train_loss = running_loss / len(train_loader)epoch_train_acc = 100. * correct_train / total_train# 测试阶段model.eval()correct_test = 0total_test = 0test_loss = 0.0# 用于收集错误预测样本wrong_images = []wrong_labels = []wrong_preds = []with torch.no_grad():for data, target in test_loader:data, target = data.to(device), target.to(device)output = model(data)test_loss += criterion(output, target).item()_, predicted = output.max(1)total_test += target.size(0)correct_test += predicted.eq(target).sum().item()# 收集错误预测样本wrong_mask = (predicted != target)if wrong_mask.any():wrong_images.append(data[wrong_mask].cpu())wrong_labels.append(target[wrong_mask].cpu())wrong_preds.append(predicted[wrong_mask].cpu())epoch_test_loss = test_loss / len(test_loader)epoch_test_acc = 100. * correct_test / total_test# 记录历史数据train_loss_history.append(epoch_train_loss)test_loss_history.append(epoch_test_loss)train_acc_history.append(epoch_train_acc)test_acc_history.append(epoch_test_acc)# ================= TensorBoard记录 =================if writer is not None:# 记录epoch级指标writer.add_scalar('Train/Epoch Loss', epoch_train_loss, epoch)writer.add_scalar('Train/Epoch Accuracy', epoch_train_acc, epoch)writer.add_scalar('Test/Epoch Loss', epoch_test_loss, epoch)writer.add_scalar('Test/Epoch Accuracy', epoch_test_acc, epoch)# 记录冻结状态frozen_params = sum(1 for p in model.parameters() if not p.requires_grad)writer.add_scalar('Train/Frozen Parameters', frozen_params, epoch)# 在最后一个epoch记录错误预测样本if epoch == epochs - 1 and wrong_images:wrong_images = torch.cat(wrong_images)[:8] # 最多取8个错误样本wrong_labels = torch.cat(wrong_labels)[:8]wrong_preds = torch.cat(wrong_preds)[:8]img_grid = torchvision.utils.make_grid(wrong_images)writer.add_image('错误预测样本', img_grid, epoch)# 添加错误预测标签classes = ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck')labels_text = '\n'.join([f'真实: {classes[l]}, 预测: {classes[p]}' for l, p in zip(wrong_labels, wrong_preds)])writer.add_text('错误预测详情', labels_text, epoch)# =================================================# 更新学习率调度器if scheduler is not None:scheduler.step(epoch_test_loss)# 打印 epoch 结果print(f"Epoch {epoch+1} 完成 | 训练损失: {epoch_train_loss:.4f} "f"| 训练准确率: {epoch_train_acc:.2f}% | 测试准确率: {epoch_test_acc:.2f}%")# 关闭TensorBoard写入器if writer is not None: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 # 返回最终测试准确率# 7. 绘制Iteration损失曲线
def plot_iter_losses(losses, indices):plt.figure(figsize=(10, 4))plt.plot(indices, losses, 'b-', alpha=0.7)plt.xlabel('Iteration(Batch序号)')plt.ylabel('损失值')plt.title('训练过程中的Iteration损失变化')plt.grid(True)plt.show()# 8. 绘制Epoch级指标曲线
def plot_epoch_metrics(train_acc, test_acc, train_loss, test_loss):epochs = range(1, len(train_acc) + 1)plt.figure(figsize=(12, 5))# 准确率曲线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('准确率随Epoch变化')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('损失值随Epoch变化')plt.legend()plt.grid(True)plt.tight_layout()plt.show()# 主函数:训练模型
def main():# 参数设置epochs = 40 # 总训练轮次freeze_epochs = 5 # 冻结卷积层的轮次learning_rate = 1e-3 # 初始学习率weight_decay = 1e-4 # 权重衰减# ================= 创建TensorBoard写入器 =================log_dir = "runs/cifar10_resnet18_finetune"if os.path.exists(log_dir):version = 1while os.path.exists(f"{log_dir}_v{version}"):version += 1log_dir = f"{log_dir}_v{version}"writer = SummaryWriter(log_dir)print(f"TensorBoard日志目录: {log_dir}")print("训练后执行: tensorboard --logdir=runs 查看可视化")# =======================================================# 创建ResNet18模型(加载预训练权重)model = create_resnet18(pretrained=True, num_classes=10)# 定义优化器和损失函数optimizer = optim.Adam(model.parameters(), lr=learning_rate, weight_decay=weight_decay)criterion = nn.CrossEntropyLoss()# 定义学习率调度器scheduler = optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.5, patience=2, verbose=True)# 开始训练(前5轮冻结卷积层,之后解冻)final_accuracy = train_with_freeze_schedule(model=model,train_loader=train_loader,test_loader=test_loader,criterion=criterion,optimizer=optimizer,scheduler=scheduler,device=device,epochs=epochs,freeze_epochs=freeze_epochs,writer=writer # 传入TensorBoard写入器)print(f"训练完成!最终测试准确率: {final_accuracy:.2f}%")# # 保存模型# torch.save(model.state_dict(), 'resnet18_cifar10_finetuned.pth')# print("模型已保存至: resnet18_cifar10_finetuned.pth")if __name__ == "__main__":main()
已冻结模型卷积层参数 (11176512/11181642 参数)
Epoch 1/40 | Batch 100/782 | 单Batch损失: 1.9845
Epoch 1/40 | Batch 200/782 | 单Batch损失: 1.9221
Epoch 1/40 | Batch 300/782 | 单Batch损失: 2.1262
Epoch 1/40 | Batch 400/782 | 单Batch损失: 1.9537
Epoch 1/40 | Batch 500/782 | 单Batch损失: 1.6979
Epoch 1/40 | Batch 600/782 | 单Batch损失: 1.7894
Epoch 1/40 | Batch 700/782 | 单Batch损失: 1.9485
Epoch 1 完成 | 训练损失: 1.9627 | 训练准确率: 30.03% | 测试准确率: 32.34%
Epoch 2/40 | Batch 100/782 | 单Batch损失: 1.7793
Epoch 2/40 | Batch 200/782 | 单Batch损失: 1.8816
Epoch 2/40 | Batch 300/782 | 单Batch损失: 1.7683
Epoch 2/40 | Batch 400/782 | 单Batch损失: 1.9009
Epoch 2/40 | Batch 500/782 | 单Batch损失: 1.9358
Epoch 2/40 | Batch 600/782 | 单Batch损失: 1.7030
Epoch 2/40 | Batch 700/782 | 单Batch损失: 1.8201
Epoch 2 完成 | 训练损失: 1.8657 | 训练准确率: 33.73% | 测试准确率: 33.70%
Epoch 3/40 | Batch 100/782 | 单Batch损失: 1.7812
Epoch 3/40 | Batch 200/782 | 单Batch损失: 1.8254
Epoch 3/40 | Batch 300/782 | 单Batch损失: 2.0188
Epoch 3/40 | Batch 400/782 | 单Batch损失: 1.8106
Epoch 3/40 | Batch 500/782 | 单Batch损失: 1.8855
Epoch 3/40 | Batch 600/782 | 单Batch损失: 1.7753
Epoch 3/40 | Batch 700/782 | 单Batch损失: 1.7371
Epoch 3 完成 | 训练损失: 1.8509 | 训练准确率: 34.66% | 测试准确率: 33.65%
Epoch 4/40 | Batch 100/782 | 单Batch损失: 1.8383
Epoch 4/40 | Batch 200/782 | 单Batch损失: 1.8095
Epoch 4/40 | Batch 300/782 | 单Batch损失: 2.0029
Epoch 4/40 | Batch 400/782 | 单Batch损失: 1.7765
Epoch 4/40 | Batch 500/782 | 单Batch损失: 1.8919
Epoch 4/40 | Batch 600/782 | 单Batch损失: 1.7515
Epoch 4/40 | Batch 700/782 | 单Batch损失: 1.8964
Epoch 4 完成 | 训练损失: 1.8491 | 训练准确率: 34.36% | 测试准确率: 34.47%
Epoch 5/40 | Batch 100/782 | 单Batch损失: 1.9020
Epoch 5/40 | Batch 200/782 | 单Batch损失: 2.0807
Epoch 5/40 | Batch 300/782 | 单Batch损失: 1.8857
Epoch 5/40 | Batch 400/782 | 单Batch损失: 1.9153
Epoch 5/40 | Batch 500/782 | 单Batch损失: 1.8053
Epoch 5/40 | Batch 600/782 | 单Batch损失: 1.8766
Epoch 5/40 | Batch 700/782 | 单Batch损失: 1.8560
Epoch 5 完成 | 训练损失: 1.8454 | 训练准确率: 34.51% | 测试准确率: 35.81%
已解冻模型所有参数 (11181642/11181642 参数可训练)
Epoch 6/40 | Batch 100/782 | 单Batch损失: 1.7783
Epoch 6/40 | Batch 200/782 | 单Batch损失: 1.3492
Epoch 6/40 | Batch 300/782 | 单Batch损失: 1.2985
Epoch 6/40 | Batch 400/782 | 单Batch损失: 1.1477
Epoch 6/40 | Batch 500/782 | 单Batch损失: 1.0184
Epoch 6/40 | Batch 600/782 | 单Batch损失: 1.0792
Epoch 6/40 | Batch 700/782 | 单Batch损失: 0.9014
Epoch 6 完成 | 训练损失: 1.2920 | 训练准确率: 54.37% | 测试准确率: 68.44%
Epoch 7/40 | Batch 100/782 | 单Batch损失: 1.1539
Epoch 7/40 | Batch 200/782 | 单Batch损失: 1.0359
Epoch 7/40 | Batch 300/782 | 单Batch损失: 0.9367
Epoch 7/40 | Batch 400/782 | 单Batch损失: 0.9108
Epoch 7/40 | Batch 500/782 | 单Batch损失: 0.8993
Epoch 7/40 | Batch 600/782 | 单Batch损失: 0.7143
Epoch 7/40 | Batch 700/782 | 单Batch损失: 0.9862
Epoch 7 完成 | 训练损失: 0.9915 | 训练准确率: 65.46% | 测试准确率: 74.44%
Epoch 8/40 | Batch 100/782 | 单Batch损失: 0.9431
Epoch 8/40 | Batch 200/782 | 单Batch损失: 0.9887
Epoch 8/40 | Batch 300/782 | 单Batch损失: 0.7520
Epoch 8/40 | Batch 400/782 | 单Batch损失: 0.8691
Epoch 8/40 | Batch 500/782 | 单Batch损失: 0.8537
Epoch 8/40 | Batch 600/782 | 单Batch损失: 0.8077
Epoch 8/40 | Batch 700/782 | 单Batch损失: 0.9450
Epoch 8 完成 | 训练损失: 0.8706 | 训练准确率: 69.68% | 测试准确率: 76.69%
Epoch 9/40 | Batch 100/782 | 单Batch损失: 0.6912
Epoch 9/40 | Batch 200/782 | 单Batch损失: 1.0554
Epoch 9/40 | Batch 300/782 | 单Batch损失: 0.8509
Epoch 9/40 | Batch 400/782 | 单Batch损失: 0.6163
Epoch 9/40 | Batch 500/782 | 单Batch损失: 0.6654
Epoch 9/40 | Batch 600/782 | 单Batch损失: 0.7246
Epoch 9/40 | Batch 700/782 | 单Batch损失: 0.7361
Epoch 9 完成 | 训练损失: 0.8005 | 训练准确率: 72.25% | 测试准确率: 78.66%
Epoch 10/40 | Batch 100/782 | 单Batch损失: 0.7592
Epoch 10/40 | Batch 200/782 | 单Batch损失: 0.6813
Epoch 10/40 | Batch 300/782 | 单Batch损失: 0.8109
Epoch 10/40 | Batch 400/782 | 单Batch损失: 0.8108
Epoch 10/40 | Batch 500/782 | 单Batch损失: 0.4869
Epoch 10/40 | Batch 600/782 | 单Batch损失: 0.6479
Epoch 10/40 | Batch 700/782 | 单Batch损失: 0.6231
Epoch 10 完成 | 训练损失: 0.7458 | 训练准确率: 74.18% | 测试准确率: 79.61%
Epoch 11/40 | Batch 100/782 | 单Batch损失: 0.9745
Epoch 11/40 | Batch 200/782 | 单Batch损失: 0.7001
Epoch 11/40 | Batch 300/782 | 单Batch损失: 0.5166
Epoch 11/40 | Batch 400/782 | 单Batch损失: 0.9212
Epoch 11/40 | Batch 500/782 | 单Batch损失: 0.8682
Epoch 11/40 | Batch 600/782 | 单Batch损失: 0.7065
Epoch 11/40 | Batch 700/782 | 单Batch损失: 0.5803
Epoch 11 完成 | 训练损失: 0.7058 | 训练准确率: 75.47% | 测试准确率: 80.05%
Epoch 12/40 | Batch 100/782 | 单Batch损失: 0.5478
Epoch 12/40 | Batch 200/782 | 单Batch损失: 0.8005
Epoch 12/40 | Batch 300/782 | 单Batch损失: 0.7657
Epoch 12/40 | Batch 400/782 | 单Batch损失: 0.5238
Epoch 12/40 | Batch 500/782 | 单Batch损失: 0.6686
Epoch 12/40 | Batch 600/782 | 单Batch损失: 0.6046
Epoch 12/40 | Batch 700/782 | 单Batch损失: 0.4792
Epoch 12 完成 | 训练损失: 0.6713 | 训练准确率: 76.52% | 测试准确率: 80.93%
Epoch 13/40 | Batch 100/782 | 单Batch损失: 1.0814
Epoch 13/40 | Batch 200/782 | 单Batch损失: 0.8355
Epoch 13/40 | Batch 300/782 | 单Batch损失: 0.7163
Epoch 13/40 | Batch 400/782 | 单Batch损失: 0.8455
Epoch 13/40 | Batch 500/782 | 单Batch损失: 0.7083
Epoch 13/40 | Batch 600/782 | 单Batch损失: 0.4937
Epoch 13/40 | Batch 700/782 | 单Batch损失: 0.7588
Epoch 13 完成 | 训练损失: 0.6509 | 训练准确率: 77.38% | 测试准确率: 81.50%
Epoch 14/40 | Batch 100/782 | 单Batch损失: 0.7048
Epoch 14/40 | Batch 200/782 | 单Batch损失: 0.6938
Epoch 14/40 | Batch 300/782 | 单Batch损失: 0.6346
Epoch 14/40 | Batch 400/782 | 单Batch损失: 0.5922
Epoch 14/40 | Batch 500/782 | 单Batch损失: 0.6982
Epoch 14/40 | Batch 600/782 | 单Batch损失: 0.7085
Epoch 14/40 | Batch 700/782 | 单Batch损失: 0.7181
Epoch 14 完成 | 训练损失: 0.6167 | 训练准确率: 78.43% | 测试准确率: 82.15%
Epoch 15/40 | Batch 100/782 | 单Batch损失: 0.9140
Epoch 15/40 | Batch 200/782 | 单Batch损失: 0.5345
Epoch 15/40 | Batch 300/782 | 单Batch损失: 0.4287
Epoch 15/40 | Batch 400/782 | 单Batch损失: 0.5277
Epoch 15/40 | Batch 500/782 | 单Batch损失: 0.7996
Epoch 15/40 | Batch 600/782 | 单Batch损失: 0.4521
Epoch 15/40 | Batch 700/782 | 单Batch损失: 0.5768
Epoch 15 完成 | 训练损失: 0.5981 | 训练准确率: 79.22% | 测试准确率: 82.28%
Epoch 16/40 | Batch 100/782 | 单Batch损失: 0.5512
Epoch 16/40 | Batch 200/782 | 单Batch损失: 0.3907
Epoch 16/40 | Batch 300/782 | 单Batch损失: 0.5873
Epoch 16/40 | Batch 400/782 | 单Batch损失: 0.7727
Epoch 16/40 | Batch 500/782 | 单Batch损失: 0.6523
Epoch 16/40 | Batch 600/782 | 单Batch损失: 0.8028
Epoch 16/40 | Batch 700/782 | 单Batch损失: 0.3571
Epoch 16 完成 | 训练损失: 0.5809 | 训练准确率: 79.84% | 测试准确率: 82.45%
Epoch 17/40 | Batch 100/782 | 单Batch损失: 0.4884
Epoch 17/40 | Batch 200/782 | 单Batch损失: 0.6235
Epoch 17/40 | Batch 300/782 | 单Batch损失: 0.6000
Epoch 17/40 | Batch 400/782 | 单Batch损失: 0.5768
Epoch 17/40 | Batch 500/782 | 单Batch损失: 0.6355
Epoch 17/40 | Batch 600/782 | 单Batch损失: 0.9570
Epoch 17/40 | Batch 700/782 | 单Batch损失: 0.3773
Epoch 17 完成 | 训练损失: 0.5583 | 训练准确率: 80.59% | 测试准确率: 83.44%
Epoch 18/40 | Batch 100/782 | 单Batch损失: 0.4415
Epoch 18/40 | Batch 200/782 | 单Batch损失: 0.4202
Epoch 18/40 | Batch 300/782 | 单Batch损失: 0.4529
Epoch 18/40 | Batch 400/782 | 单Batch损失: 0.5010
Epoch 18/40 | Batch 500/782 | 单Batch损失: 0.5142
Epoch 18/40 | Batch 600/782 | 单Batch损失: 0.3954
Epoch 18/40 | Batch 700/782 | 单Batch损失: 0.5276
Epoch 18 完成 | 训练损失: 0.5491 | 训练准确率: 80.88% | 测试准确率: 83.22%
Epoch 19/40 | Batch 100/782 | 单Batch损失: 0.4030
Epoch 19/40 | Batch 200/782 | 单Batch损失: 0.4581
Epoch 19/40 | Batch 300/782 | 单Batch损失: 0.5019
Epoch 19/40 | Batch 400/782 | 单Batch损失: 0.4664
Epoch 19/40 | Batch 500/782 | 单Batch损失: 0.4308
Epoch 19/40 | Batch 600/782 | 单Batch损失: 0.4998
Epoch 19/40 | Batch 700/782 | 单Batch损失: 0.4180
Epoch 19 完成 | 训练损失: 0.5372 | 训练准确率: 81.29% | 测试准确率: 83.87%
Epoch 20/40 | Batch 100/782 | 单Batch损失: 0.5643
Epoch 20/40 | Batch 200/782 | 单Batch损失: 0.6189
Epoch 20/40 | Batch 300/782 | 单Batch损失: 0.4015
Epoch 20/40 | Batch 400/782 | 单Batch损失: 0.4931
Epoch 20/40 | Batch 500/782 | 单Batch损失: 0.5194
Epoch 20/40 | Batch 600/782 | 单Batch损失: 0.5057
Epoch 20/40 | Batch 700/782 | 单Batch损失: 0.5244
Epoch 20 完成 | 训练损失: 0.5196 | 训练准确率: 81.80% | 测试准确率: 84.25%
Epoch 21/40 | Batch 100/782 | 单Batch损失: 0.3585
Epoch 21/40 | Batch 200/782 | 单Batch损失: 0.2221
Epoch 21/40 | Batch 300/782 | 单Batch损失: 0.5224
Epoch 21/40 | Batch 400/782 | 单Batch损失: 0.4546
Epoch 21/40 | Batch 500/782 | 单Batch损失: 0.3895
Epoch 21/40 | Batch 600/782 | 单Batch损失: 0.4467
Epoch 21/40 | Batch 700/782 | 单Batch损失: 0.4560
Epoch 21 完成 | 训练损失: 0.4971 | 训练准确率: 82.57% | 测试准确率: 83.88%
Epoch 22/40 | Batch 100/782 | 单Batch损失: 0.3642
Epoch 22/40 | Batch 200/782 | 单Batch损失: 0.7551
Epoch 22/40 | Batch 300/782 | 单Batch损失: 0.4533
Epoch 22/40 | Batch 400/782 | 单Batch损失: 0.6884
Epoch 22/40 | Batch 500/782 | 单Batch损失: 0.5062
Epoch 22/40 | Batch 600/782 | 单Batch损失: 0.5316
Epoch 22/40 | Batch 700/782 | 单Batch损失: 0.3991
Epoch 22 完成 | 训练损失: 0.4949 | 训练准确率: 82.76% | 测试准确率: 84.23%
Epoch 23/40 | Batch 100/782 | 单Batch损失: 0.4934
Epoch 23/40 | Batch 200/782 | 单Batch损失: 0.3914
Epoch 23/40 | Batch 300/782 | 单Batch损失: 0.5075
Epoch 23/40 | Batch 400/782 | 单Batch损失: 0.6494
Epoch 23/40 | Batch 500/782 | 单Batch损失: 0.4456
Epoch 23/40 | Batch 600/782 | 单Batch损失: 0.4376
Epoch 23/40 | Batch 700/782 | 单Batch损失: 0.5029
Epoch 23 完成 | 训练损失: 0.4820 | 训练准确率: 83.05% | 测试准确率: 84.24%
Epoch 24/40 | Batch 100/782 | 单Batch损失: 0.4478
Epoch 24/40 | Batch 200/782 | 单Batch损失: 0.4439
Epoch 24/40 | Batch 300/782 | 单Batch损失: 0.6566
Epoch 24/40 | Batch 400/782 | 单Batch损失: 0.3610
Epoch 24/40 | Batch 500/782 | 单Batch损失: 0.3373
Epoch 24/40 | Batch 600/782 | 单Batch损失: 0.4565
Epoch 24/40 | Batch 700/782 | 单Batch损失: 0.5308
Epoch 24 完成 | 训练损失: 0.4746 | 训练准确率: 83.40% | 测试准确率: 84.45%
Epoch 25/40 | Batch 100/782 | 单Batch损失: 0.4398
Epoch 25/40 | Batch 200/782 | 单Batch损失: 0.3060
Epoch 25/40 | Batch 300/782 | 单Batch损失: 0.5542
Epoch 25/40 | Batch 400/782 | 单Batch损失: 0.4484
Epoch 25/40 | Batch 500/782 | 单Batch损失: 0.3688
Epoch 25/40 | Batch 600/782 | 单Batch损失: 0.5104
Epoch 25/40 | Batch 700/782 | 单Batch损失: 0.5033
Epoch 25 完成 | 训练损失: 0.4536 | 训练准确率: 83.94% | 测试准确率: 84.60%
Epoch 26/40 | Batch 100/782 | 单Batch损失: 0.6212
Epoch 26/40 | Batch 200/782 | 单Batch损失: 0.4445
Epoch 26/40 | Batch 300/782 | 单Batch损失: 0.4936
Epoch 26/40 | Batch 400/782 | 单Batch损失: 0.4348
Epoch 26/40 | Batch 500/782 | 单Batch损失: 0.4900
Epoch 26/40 | Batch 600/782 | 单Batch损失: 0.5532
Epoch 26/40 | Batch 700/782 | 单Batch损失: 0.3503
Epoch 26 完成 | 训练损失: 0.4523 | 训练准确率: 84.11% | 测试准确率: 85.29%
Epoch 27/40 | Batch 100/782 | 单Batch损失: 0.4809
Epoch 27/40 | Batch 200/782 | 单Batch损失: 0.3168
Epoch 27/40 | Batch 300/782 | 单Batch损失: 0.4344
Epoch 27/40 | Batch 400/782 | 单Batch损失: 0.2452
Epoch 27/40 | Batch 500/782 | 单Batch损失: 0.4902
Epoch 27/40 | Batch 600/782 | 单Batch损失: 0.4841
Epoch 27/40 | Batch 700/782 | 单Batch损失: 0.4331
Epoch 27 完成 | 训练损失: 0.4347 | 训练准确率: 84.82% | 测试准确率: 84.93%
Epoch 28/40 | Batch 100/782 | 单Batch损失: 0.5113
Epoch 28/40 | Batch 200/782 | 单Batch损失: 0.4025
Epoch 28/40 | Batch 300/782 | 单Batch损失: 0.5368
Epoch 28/40 | Batch 400/782 | 单Batch损失: 0.4800
Epoch 28/40 | Batch 500/782 | 单Batch损失: 0.5973
Epoch 28/40 | Batch 600/782 | 单Batch损失: 0.4407
Epoch 28/40 | Batch 700/782 | 单Batch损失: 0.5990
Epoch 28 完成 | 训练损失: 0.4299 | 训练准确率: 84.99% | 测试准确率: 84.38%
Epoch 29/40 | Batch 100/782 | 单Batch损失: 0.2680
Epoch 29/40 | Batch 200/782 | 单Batch损失: 0.2952
Epoch 29/40 | Batch 300/782 | 单Batch损失: 0.4970
Epoch 29/40 | Batch 400/782 | 单Batch损失: 0.3671
Epoch 29/40 | Batch 500/782 | 单Batch损失: 0.3845
Epoch 29/40 | Batch 600/782 | 单Batch损失: 0.2393
Epoch 29/40 | Batch 700/782 | 单Batch损失: 0.4481
Epoch 29 完成 | 训练损失: 0.4242 | 训练准确率: 85.12% | 测试准确率: 85.04%
Epoch 30/40 | Batch 100/782 | 单Batch损失: 0.5809
Epoch 30/40 | Batch 200/782 | 单Batch损失: 0.3701
Epoch 30/40 | Batch 300/782 | 单Batch损失: 0.2804
Epoch 30/40 | Batch 400/782 | 单Batch损失: 0.3507
Epoch 30/40 | Batch 500/782 | 单Batch损失: 0.1962
Epoch 30/40 | Batch 600/782 | 单Batch损失: 0.4570
Epoch 30/40 | Batch 700/782 | 单Batch损失: 0.2103
Epoch 30 完成 | 训练损失: 0.3778 | 训练准确率: 86.65% | 测试准确率: 85.71%
Epoch 31/40 | Batch 100/782 | 单Batch损失: 0.3076
Epoch 31/40 | Batch 200/782 | 单Batch损失: 0.2548
Epoch 31/40 | Batch 300/782 | 单Batch损失: 0.3434
Epoch 31/40 | Batch 400/782 | 单Batch损失: 0.3898
Epoch 31/40 | Batch 500/782 | 单Batch损失: 0.5643
Epoch 31/40 | Batch 600/782 | 单Batch损失: 0.2407
Epoch 31/40 | Batch 700/782 | 单Batch损失: 0.2459
Epoch 31 完成 | 训练损失: 0.3647 | 训练准确率: 87.05% | 测试准确率: 85.72%
Epoch 32/40 | Batch 100/782 | 单Batch损失: 0.5242
Epoch 32/40 | Batch 200/782 | 单Batch损失: 0.3581
Epoch 32/40 | Batch 300/782 | 单Batch损失: 0.5027
Epoch 32/40 | Batch 400/782 | 单Batch损失: 0.2311
Epoch 32/40 | Batch 500/782 | 单Batch损失: 0.4504
Epoch 32/40 | Batch 600/782 | 单Batch损失: 0.4259
Epoch 32/40 | Batch 700/782 | 单Batch损失: 0.2881
Epoch 32 完成 | 训练损失: 0.3509 | 训练准确率: 87.40% | 测试准确率: 85.88%
Epoch 33/40 | Batch 100/782 | 单Batch损失: 0.2308
Epoch 33/40 | Batch 200/782 | 单Batch损失: 0.2749
Epoch 33/40 | Batch 300/782 | 单Batch损失: 0.3666
Epoch 33/40 | Batch 400/782 | 单Batch损失: 0.3093
Epoch 33/40 | Batch 500/782 | 单Batch损失: 0.4387
Epoch 33/40 | Batch 600/782 | 单Batch损失: 0.3664
Epoch 33/40 | Batch 700/782 | 单Batch损失: 0.3048
Epoch 33 完成 | 训练损失: 0.3424 | 训练准确率: 87.83% | 测试准确率: 85.93%
Epoch 34/40 | Batch 100/782 | 单Batch损失: 0.1878
Epoch 34/40 | Batch 200/782 | 单Batch损失: 0.2186
Epoch 34/40 | Batch 300/782 | 单Batch损失: 0.2953
Epoch 34/40 | Batch 400/782 | 单Batch损失: 0.4248
Epoch 34/40 | Batch 500/782 | 单Batch损失: 0.4961
Epoch 34/40 | Batch 600/782 | 单Batch损失: 0.2806
Epoch 34/40 | Batch 700/782 | 单Batch损失: 0.3832
Epoch 34 完成 | 训练损失: 0.3364 | 训练准确率: 88.01% | 测试准确率: 85.88%
Epoch 35/40 | Batch 100/782 | 单Batch损失: 0.4153
Epoch 35/40 | Batch 200/782 | 单Batch损失: 0.2748
Epoch 35/40 | Batch 300/782 | 单Batch损失: 0.3258
Epoch 35/40 | Batch 400/782 | 单Batch损失: 0.2264
Epoch 35/40 | Batch 500/782 | 单Batch损失: 0.2102
Epoch 35/40 | Batch 600/782 | 单Batch损失: 0.2262
Epoch 35/40 | Batch 700/782 | 单Batch损失: 0.3287
Epoch 35 完成 | 训练损失: 0.3117 | 训练准确率: 88.96% | 测试准确率: 86.21%
Epoch 36/40 | Batch 100/782 | 单Batch损失: 0.2270
Epoch 36/40 | Batch 200/782 | 单Batch损失: 0.2434
Epoch 36/40 | Batch 300/782 | 单Batch损失: 0.2651
Epoch 36/40 | Batch 400/782 | 单Batch损失: 0.1981
Epoch 36/40 | Batch 500/782 | 单Batch损失: 0.3411
Epoch 36/40 | Batch 600/782 | 单Batch损失: 0.3588
Epoch 36/40 | Batch 700/782 | 单Batch损失: 0.4123
Epoch 36 完成 | 训练损失: 0.3059 | 训练准确率: 89.21% | 测试准确率: 86.49%
Epoch 37/40 | Batch 100/782 | 单Batch损失: 0.2236
Epoch 37/40 | Batch 200/782 | 单Batch损失: 0.1829
Epoch 37/40 | Batch 300/782 | 单Batch损失: 0.3180
Epoch 37/40 | Batch 400/782 | 单Batch损失: 0.1161
Epoch 37/40 | Batch 500/782 | 单Batch损失: 0.2394
Epoch 37/40 | Batch 600/782 | 单Batch损失: 0.3800
Epoch 37/40 | Batch 700/782 | 单Batch损失: 0.1893
Epoch 37 完成 | 训练损失: 0.2973 | 训练准确率: 89.51% | 测试准确率: 86.20%
Epoch 38/40 | Batch 100/782 | 单Batch损失: 0.2446
Epoch 38/40 | Batch 200/782 | 单Batch损失: 0.3209
Epoch 38/40 | Batch 300/782 | 单Batch损失: 0.2194
Epoch 38/40 | Batch 400/782 | 单Batch损失: 0.3172
Epoch 38/40 | Batch 500/782 | 单Batch损失: 0.3022
Epoch 38/40 | Batch 600/782 | 单Batch损失: 0.2326
Epoch 38/40 | Batch 700/782 | 单Batch损失: 0.3124
Epoch 38 完成 | 训练损失: 0.2827 | 训练准确率: 90.02% | 测试准确率: 86.50%
Epoch 39/40 | Batch 100/782 | 单Batch损失: 0.2458
Epoch 39/40 | Batch 200/782 | 单Batch损失: 0.3421
Epoch 39/40 | Batch 300/782 | 单Batch损失: 0.2558
Epoch 39/40 | Batch 400/782 | 单Batch损失: 0.2393
Epoch 39/40 | Batch 500/782 | 单Batch损失: 0.3710
Epoch 39/40 | Batch 600/782 | 单Batch损失: 0.2537
Epoch 39/40 | Batch 700/782 | 单Batch损失: 0.1849
Epoch 39 完成 | 训练损失: 0.2763 | 训练准确率: 90.11% | 测试准确率: 86.72%
Epoch 40/40 | Batch 100/782 | 单Batch损失: 0.2092
Epoch 40/40 | Batch 200/782 | 单Batch损失: 0.2279
Epoch 40/40 | Batch 300/782 | 单Batch损失: 0.1306
Epoch 40/40 | Batch 400/782 | 单Batch损失: 0.3211
Epoch 40/40 | Batch 500/782 | 单Batch损失: 0.3480
Epoch 40/40 | Batch 600/782 | 单Batch损失: 0.1992
Epoch 40/40 | Batch 700/782 | 单Batch损失: 0.3205
Epoch 40 完成 | 训练损失: 0.2782 | 训练准确率: 90.06% | 测试准确率: 86.57%
相关文章:

第四十五天打卡
知识点回顾: tensorboard的发展历史和原理 tensorboard的常见操作 tensorboard在cifar上的实战:MLP和CNN模型 效果展示如下,很适合拿去组会汇报撑页数: 作业:对resnet18在cifar10上采用微调策略下,用tensor…...

springboot mysql/mariadb迁移成oceanbase
前言:项目架构为 springbootmybatis-plusmysql 1.部署oceanbase服务 2.springboot项目引入oceanbase依赖(即ob驱动) ps:删除原有的mysql/mariadb依赖 <dependency> <groupId>com.oceanbase</groupId> …...

npm install 报错:npm error: ...node_modules\deasync npm error command failed
npm install 时报错如下: 首先尝试更换node版本,当前node版本20.15.0,更换node版本为16.17.0。再次执行npm install安装成功...

Filebeat收集nginx日志到elasticsearch,最终在kibana做展示(二)
EFK 项目需求是要将 一天或15分钟内 搜索引擎抓取网站次数做个统计,并且 如 200 301 404 状态码 也要区分出来, 访问 404 报错的 url 也要截取出来 前期 收集数据 看这篇文章,点击跳转 收集数据完成之后,使用下面方法做展示 创建一个 仪表…...

halcon c# 自带examples报错 Matching
最近开始学习halcon与C#的联合编程,打开Matching例程时遇到了下面的问题 “System.TypeInitializationException”类型的未经处理的异常在 halcondotnet.dll 中发生 “HalconDotNet.HHandleBase”的类型初始值设定项引发异常。 System.TypeInitializationExceptio…...

服务器重启后配置丢失怎么办?
服务器重启后配置丢失是一个常见问题,特别是在云服务器或容器环境中,若未正确保存或持久化配置,系统重启后就会恢复默认状态。下面是问题分析 解决方案: 🧠 一、常见原因分析 原因描述❌ 配置保存在临时目录如 /tmp、…...
Postgresql常用函数操作
目录 一、字符串函数 二、数学函数 三、日期和时间函数 四、条件表达式函数 五、类型转换函数 六、聚合函数 (常与 GROUP BY 一起使用) 重要提示 PostgreSQL 提供了极其丰富的内置函数,用于操作和处理数据。以下是一些最常用的函数分类和示例: 一…...
用 NGINX 搭建高效 IMAP 代理`ngx_mail_imap_module`
一、模块定位与作用 协议代理 ngx_mail_imap_module 使 NGINX 能在 IMAP 层面充当反向代理,客户端与后端 IMAP 服务器之间的会话流量均由 NGINX 接收并转发。认证控制 通过 imap_auth 指定允许的身份验证方式(如 PLAIN、LOGIN、CRAM-MD5、EXTERNAL&…...

湖北理元理律所债务优化实践:法律技术与人文关怀的双轨服务
一、债务优化的法律逻辑与生活平衡 在债务重组领域,专业机构需同时解决两个核心问题: 法律合规性:依据《民法典》第680条、第671条,对高息债务进行合法性审查; 生活可持续性:根据债务人收入设计分期方案…...

Springboot——整合websocket并根据type区别处理
文章目录 前言架构思想项目结构代码实现依赖引入自定义注解定义具体的处理类定义 TypeAWebSocketHandler定义 TypeBWebSocketHandler 定义路由处理类配置类,绑定point制定前端页面编写测试接口方便跳转进入前端页面 测试验证结语 前言 之前写过一篇类似的博客&…...

Qiskit:量子计算模拟器
参考文献: IBM Qiskit 官网Qiskit DocumentationQiskit Benchpress packageQiskit Algorithms package量子计算:基本概念常见的几类矩阵(正交矩阵、酉矩阵、正规矩阵等)Qiskit 安装指南-博客园使用Python实现量子电路模拟&#x…...

龙虎榜——20250605
上证指数放量收阳线,个股涨跌基本持平,日线持续上涨。 深证指数放量收阳线,日线持续上涨。 2025年6月5日龙虎榜行业方向分析 1. 通信设备 代表标的:生益电子、三维通信、瑞可达 驱动逻辑:5.5G商用牌照发放预期加速&…...
PDF 转 HTML5 —— HTML5 填充图形不支持 Even-Odd 奇偶规则?(第二部分)
这是关于该主题的第二部分。如果你还没有阅读第一部分,请先阅读,以便理解“绕组规则”的问题。 快速回顾一下:HTML5 只支持 Non-Zero(非零)绕组规则,而 PDF 同时支持 Non-Zero 和 Even-Odd(奇偶…...
大数据离线同步工具 DataX 深度实践与 DataX Web 可视化指南
一、引言 在大数据领域,异构数据源间的数据同步是核心需求之一。传统工具如 Sqoop 基于磁盘 IO 的 MR 架构在性能上存在瓶颈,而DataX作为阿里巴巴开源的离线数据同步工具,凭借内存级数据传输和分布式并行处理能力,成为国内大数据…...
记一个判决书查询API接口的开发文档
一、引言 在企业风控、背景调查、尽职调查等场景中,判决书查询是一个非常重要的环节。通过判决书查询,可以了解个人或企业的司法涉诉情况,为风险评估提供数据支持。本文将详细介绍如何开发和使用一个司法涉诉查询API接口,包括客户…...

残月个人拟态主页
TwoMicry个人主页 残月个人拟态主页 原项目作者:KAI GE 在此基础上进行二次修改 精简重构一下 项目简介: 一个精美的拟态风格个人主页,采用现代化的玻璃拟态设计和丰富的动画效果 主要特色: 视觉效果: – 玻璃…...

热门消息中间件汇总
文章目录 前言RabbitMQ基本介绍核心特性适用场景 Kafka基本介绍核心特性适用场景 RocketMQ基本介绍核心特性适用场景 NATS基本介绍核心特性适用场景 总结选型建议与未来趋势选型建议未来趋势 结语 前言 大家后,我是沛哥儿。作为技术领域的老湿机,在消息…...

AiPy实战:10分钟用AI造了个音乐游戏!
“在探索AI编程边界时,我尝试了一个实验:能否让自然语言指令直接生成可交互的音乐学习应用?作为新一代智能编程协作框架,AiPy展示了对开发意图的深度理解能力——当输入创建钢琴学习游戏,包含动态难度关卡和即时反馈系…...
Python Rio 【图像处理】库简介
边写代码零食不停口 盼盼麦香鸡味块 、卡乐比(Calbee)薯条三兄弟 独立小包、好时kisses多口味巧克力糖、老金磨方【黑金系列】黑芝麻丸 边写代码边贴面膜 事业美丽两不误 DR. YS 野森博士【AOUFSE/澳芙雪特证】377专研美白淡斑面膜组合 优惠劵 别光顾写…...

贪心算法应用:分数背包问题详解
贪心算法与分数背包问题 贪心算法(Greedy Algorithm)是算法设计中一种重要的思想,它在许多经典问题中展现出独特的优势。本文将用2万字篇幅,深入剖析贪心算法在分数背包问题中的应用,从基础原理到Java实现细节&#x…...

PHP舆情监控分析系统(9个平台)
PHP舆情监控分析系统(9个平台) 项目简介 基于多平台热点API接口的PHP实时舆情监控分析系统,无需数据库,直接调用API实时获取各大平台热点新闻,支持数据采集、搜索和可视化展示。 功能特性 🔄 实时监控 …...

金孚媒重磅推出德国顶级媒体原生广告整合服务,覆盖12家主流媒体
2025年6月1日,为助力中国企业高效开拓德语市场,全球媒体资源直采和新闻分发平台金孚媒Kinfoome Presswire今日正式推出德国大媒体原生广告套餐。该套餐整合德国最具影响力的12家新闻门户资源,以高曝光、强信任度的原生广告形式,为…...

Mnist手写数字
运行实现: import torch from torch.utils.data import DataLoader from torchvision import transforms from torchvision.datasets import MNIST import matplotlib.pyplot as pltclass Net(torch.nn.Module):#net类神经网络主体def __init__(self):#4个全链接层…...

《一生一芯》数字实验三:加法器与ALU
1. 实验目标 设计一个能实现如下功能的4位带符号位的 补码 ALU: Table 4 ALU 功能列表 功能选择 功能 操作 000 加法 AB 001 减法 A-B 010 取反 Not A 011 与 A and B 100 或 A or B 101 异或 A xor B 110 比较大小 If A<B then out1…...
Go 语言并发编程基础:Goroutine 的创建与调度
Go 语言的并发模型是其最显著的语言特性之一。Goroutine 是 Go 实现并发的核心机制,它比线程更轻量,调度效率极高。 本章将带你了解 Goroutine 的基本概念、创建方式以及背后的调度机制。 一、什么是 Goroutine? Goroutine 是由 Go 运行时&a…...

三甲医院“AI平台+专家系统”双轮驱动模式的最新编程方向分析
医疗人工智能领域正在经历从“单点技术应用”到“系统性赋能”的深刻转型。在这一转型过程中,国内领先的三甲医院通过探索“AI平台+专家系统”双轮驱动模式,不仅解决了医疗AI落地“最后一公里”的难题,更推动了医疗服务质量与效率的全面提升。本文从技术架构、编程方向、落地…...

第12期_网站搭建_几时网络验证1.3二改源码包2024 软件卡密系统 虚拟主机搭建笔记
我用夸克网盘分享了「第12期_网站搭建_几时网络验证1.3二改源码包2024.7z」,点击链接即可保存。打开「夸克APP」,无需下载在线播放视频,畅享原画5倍速,支持电视投屏。 链接:https://pan.quark.cn/s/fe8e7786bd6d...

[论文阅读] (38)基于大模型的威胁情报分析与知识图谱构建论文总结(读书笔记)
《娜璋带你读论文》系列主要是督促自己阅读优秀论文及听取学术讲座,并分享给大家,希望您喜欢。由于作者的英文水平和学术能力不高,需要不断提升,所以还请大家批评指正,非常欢迎大家给我留言评论,学术路上期…...
SpringBoot EhCache 缓存
一、EhCache核心原理 层级存储 堆内缓存(Heap):高速访问,受JVM内存限制堆外缓存(Off-Heap):突破JVM堆大小限制(直接内存)磁盘存储(Disk)ÿ…...
flutter 中Stack 使用clipBehavior: Clip.none, 超出的部分无法响应所有事件
原因 在 Flutter 中,当 Stack 使用 clipBehavior: Clip.none 时,子 Widget 可以超出 Stack 的边界,但默认情况下,超出部分无法响应触摸事件(如点击、拖动等)。这是因为 Flutter 的 HitTest 机制默认会裁剪…...