6月5日day45
Tensorboard使用介绍
知识点回顾:
- tensorboard的发展历史和原理
- tensorboard的常见操作
- tensorboard在cifar上的实战:MLP和CNN模型
效果展示如下,很适合拿去组会汇报撑页数:
作业:对resnet18在cifar10上采用微调策略下,用tensorboard监控训练过程。
PS:
- tensorboard和torch版本存在一定的不兼容性,如果报错请新建环境尝试。
- tensorboard的代码还有有一定的记忆量,实际上深度学习的经典代码都是类似于八股文,看多了就习惯了,难度远远小于考研数学等需要思考的内容
- 实际上对目前的ai而言,你只需要先完成最简单的demo,然后让他给你加上tensorboard需要打印的部分即可。---核心是弄懂tensorboard可以打印什么信息,以及如何看可视化后的结果,把ai当成记忆大师用到的时候通过它来调取对应的代码即可。
import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
import torchvision
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
import matplotlib.pyplot as plt
import numpy as np
import os# 设置中文字体支持
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. 定义CNN模型
class CNN(nn.Module):def __init__(self):super(CNN, self).__init__()# 卷积块1self.conv1 = nn.Conv2d(3, 32, 3, padding=1)self.bn1 = nn.BatchNorm2d(32)self.relu1 = nn.ReLU()self.pool1 = nn.MaxPool2d(2)# 卷积块2self.conv2 = nn.Conv2d(32, 64, 3, padding=1)self.bn2 = nn.BatchNorm2d(64)self.relu2 = nn.ReLU()self.pool2 = nn.MaxPool2d(2)# 卷积块3self.conv3 = nn.Conv2d(64, 128, 3, padding=1)self.bn3 = nn.BatchNorm2d(128)self.relu3 = nn.ReLU()self.pool3 = nn.MaxPool2d(2)# 全连接层self.fc1 = nn.Linear(128 * 4 * 4, 512)self.dropout = nn.Dropout(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.conv2(x)x = self.bn2(x)x = self.relu2(x)x = self.pool2(x)x = self.conv3(x)x = self.bn3(x)x = self.relu3(x)x = self.pool3(x)x = x.view(-1, 128 * 4 * 4)x = self.fc1(x)x = self.relu3(x)x = self.dropout(x)x = self.fc2(x)return x# 初始化模型并移至设备
model = CNN()
model = model.to(device)# 定义损失函数、优化器和学习率调度器
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
scheduler = optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', patience=3, factor=0.5, verbose=True
)# TensorBoard 配置(自动创建不重复的日志目录)
log_dir = "runs/cifar10_cnn_exp"
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}")# 5. 训练函数(集成 TensorBoard 记录)
def train(model, train_loader, test_loader, criterion, optimizer, scheduler, device, epochs, writer):model.train()all_iter_losses = []iter_indices = []global_step = 0# 记录模型结构和训练图像dataiter = iter(train_loader)images, labels = 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)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)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(global_step + 1)# 统计准确率running_loss += iter_loss_, predicted = output.max(1)total += target.size(0)correct += predicted.eq(target).sum().item()# TensorBoard 记录batch_acc = 100. * correct / totalwriter.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个batch记录参数直方图if (batch_idx + 1) % 200 == 0:for name, param in model.named_parameters():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)# 控制台日志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}')global_step += 1# 记录Epoch级训练指标epoch_train_loss = running_loss / len(train_loader)epoch_train_acc = 100. * correct / totalwriter.add_scalar('Train/Epoch Loss', epoch_train_loss, epoch)writer.add_scalar('Train/Epoch Accuracy', epoch_train_acc, epoch)# 测试阶段model.eval()test_loss = 0correct_test = 0total_test = 0wrong_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.sum() > 0:wrong_batch_images = data[wrong_mask][:8].cpu()wrong_batch_labels = target[wrong_mask][:8].cpu()wrong_batch_preds = predicted[wrong_mask][:8].cpu()wrong_images.extend(wrong_batch_images)wrong_labels.extend(wrong_batch_labels)wrong_preds.extend(wrong_batch_preds)# 记录Epoch级测试指标epoch_test_loss = test_loss / len(test_loader)epoch_test_acc = 100. * correct_test / total_testwriter.add_scalar('Test/Epoch Loss', epoch_test_loss, epoch)writer.add_scalar('Test/Epoch Accuracy', epoch_test_acc, epoch)# 可视化错误样本if wrong_images:wrong_img_grid = torchvision.utils.make_grid(wrong_images)writer.add_image('错误预测样本', wrong_img_grid, epoch)wrong_text = [f"真实: {classes[wl]}, 预测: {classes[wp]}" for wl, wp in zip(wrong_labels, wrong_preds)]writer.add_text('错误预测标签', '\n'.join(wrong_text), epoch)# 更新学习率scheduler.step(epoch_test_loss)print(f'Epoch {epoch+1}/{epochs} 完成 | 训练准确率: {epoch_train_acc:.2f}% | 测试准确率: {epoch_test_acc:.2f}%')# 关闭TensorBoard并绘制损失曲线writer.close()plot_iter_losses(all_iter_losses, iter_indices)return epoch_test_acc# 6. 绘制迭代损失曲线函数
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()# CIFAR-10 类别名
classes = ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck')# 7. 执行训练
epochs = 20
print("开始使用CNN训练模型...")
print("训练后执行: tensorboard --logdir=runs 查看可视化")final_accuracy = train(model, train_loader, test_loader, criterion, optimizer, scheduler, device, epochs, writer)
print(f"训练完成!最终测试准确率: {final_accuracy:.2f}%")
TensorBoard 日志目录: runs/cifar10_cnn_exp
开始使用CNN训练模型...
训练后执行: tensorboard --logdir=runs 查看可视化
Epoch: 1/20 | Batch: 100/782 | 单Batch损失: 1.8987 | 累计平均损失: 2.0473
Epoch: 1/20 | Batch: 200/782 | 单Batch损失: 1.5763 | 累计平均损失: 1.9201
Epoch: 1/20 | Batch: 300/782 | 单Batch损失: 1.4725 | 累计平均损失: 1.8510
Epoch: 1/20 | Batch: 400/782 | 单Batch损失: 1.6346 | 累计平均损失: 1.8075
Epoch: 1/20 | Batch: 500/782 | 单Batch损失: 1.6184 | 累计平均损失: 1.7714
Epoch: 1/20 | Batch: 600/782 | 单Batch损失: 1.4166 | 累计平均损失: 1.7340
Epoch: 1/20 | Batch: 700/782 | 单Batch损失: 1.3198 | 累计平均损失: 1.7109
Epoch 1/20 完成 | 训练准确率: 37.67% | 测试准确率: 51.67%
Epoch: 2/20 | Batch: 100/782 | 单Batch损失: 1.4704 | 累计平均损失: 1.4808
Epoch: 2/20 | Batch: 200/782 | 单Batch损失: 1.4521 | 累计平均损失: 1.4334
Epoch: 2/20 | Batch: 300/782 | 单Batch损失: 1.2865 | 累计平均损失: 1.3951
Epoch: 2/20 | Batch: 400/782 | 单Batch损失: 1.2665 | 累计平均损失: 1.3715
Epoch: 2/20 | Batch: 500/782 | 单Batch损失: 1.2725 | 累计平均损失: 1.3474
Epoch: 2/20 | Batch: 600/782 | 单Batch损失: 1.1385 | 累计平均损失: 1.3245
Epoch: 2/20 | Batch: 700/782 | 单Batch损失: 1.2831 | 累计平均损失: 1.3042
Epoch 2/20 完成 | 训练准确率: 53.26% | 测试准确率: 63.80%
Epoch: 3/20 | Batch: 100/782 | 单Batch损失: 1.2889 | 累计平均损失: 1.1706
Epoch: 3/20 | Batch: 200/782 | 单Batch损失: 0.7893 | 累计平均损失: 1.1467
Epoch: 3/20 | Batch: 300/782 | 单Batch损失: 1.1761 | 累计平均损失: 1.1357
Epoch: 3/20 | Batch: 400/782 | 单Batch损失: 0.9641 | 累计平均损失: 1.1311
Epoch: 3/20 | Batch: 500/782 | 单Batch损失: 1.0027 | 累计平均损失: 1.1210
Epoch: 3/20 | Batch: 600/782 | 单Batch损失: 0.9101 | 累计平均损失: 1.1117
Epoch: 3/20 | Batch: 700/782 | 单Batch损失: 1.2073 | 累计平均损失: 1.1032
Epoch 3/20 完成 | 训练准确率: 60.68% | 测试准确率: 67.95%
Epoch: 4/20 | Batch: 100/782 | 单Batch损失: 1.0803 | 累计平均损失: 1.0484
Epoch: 4/20 | Batch: 200/782 | 单Batch损失: 1.0465 | 累计平均损失: 1.0337
Epoch: 4/20 | Batch: 300/782 | 单Batch损失: 1.0871 | 累计平均损失: 1.0263
Epoch: 4/20 | Batch: 400/782 | 单Batch损失: 0.8972 | 累计平均损失: 1.0260
Epoch: 4/20 | Batch: 500/782 | 单Batch损失: 1.1755 | 累计平均损失: 1.0157
Epoch: 4/20 | Batch: 600/782 | 单Batch损失: 1.1488 | 累计平均损失: 1.0056
Epoch: 4/20 | Batch: 700/782 | 单Batch损失: 0.8496 | 累计平均损失: 1.0033
Epoch 4/20 完成 | 训练准确率: 64.47% | 测试准确率: 71.60%
Epoch: 5/20 | Batch: 100/782 | 单Batch损失: 0.6796 | 累计平均损失: 0.9412
Epoch: 5/20 | Batch: 200/782 | 单Batch损失: 1.0199 | 累计平均损失: 0.9391
Epoch: 5/20 | Batch: 300/782 | 单Batch损失: 0.7394 | 累计平均损失: 0.9375
Epoch: 5/20 | Batch: 400/782 | 单Batch损失: 1.0875 | 累计平均损失: 0.9402
Epoch: 5/20 | Batch: 500/782 | 单Batch损失: 0.7730 | 累计平均损失: 0.9394
Epoch: 5/20 | Batch: 600/782 | 单Batch损失: 1.0526 | 累计平均损失: 0.9349
Epoch: 5/20 | Batch: 700/782 | 单Batch损失: 0.9433 | 累计平均损失: 0.9315
Epoch 5/20 完成 | 训练准确率: 67.02% | 测试准确率: 73.65%
Epoch: 6/20 | Batch: 100/782 | 单Batch损失: 0.9564 | 累计平均损失: 0.8849
Epoch: 6/20 | Batch: 200/782 | 单Batch损失: 0.7790 | 累计平均损失: 0.8757
Epoch: 6/20 | Batch: 300/782 | 单Batch损失: 0.6307 | 累计平均损失: 0.8784
Epoch: 6/20 | Batch: 400/782 | 单Batch损失: 0.8731 | 累计平均损失: 0.8762
Epoch: 6/20 | Batch: 500/782 | 单Batch损失: 1.0062 | 累计平均损失: 0.8790
Epoch: 6/20 | Batch: 600/782 | 单Batch损失: 0.8409 | 累计平均损失: 0.8815
Epoch: 6/20 | Batch: 700/782 | 单Batch损失: 0.7364 | 累计平均损失: 0.8838
Epoch 6/20 完成 | 训练准确率: 68.94% | 测试准确率: 73.11%
Epoch: 7/20 | Batch: 100/782 | 单Batch损失: 0.9937 | 累计平均损失: 0.8394
Epoch: 7/20 | Batch: 200/782 | 单Batch损失: 0.7873 | 累计平均损失: 0.8455
Epoch: 7/20 | Batch: 300/782 | 单Batch损失: 0.6735 | 累计平均损失: 0.8413
Epoch: 7/20 | Batch: 400/782 | 单Batch损失: 1.0844 | 累计平均损失: 0.8434
Epoch: 7/20 | Batch: 500/782 | 单Batch损失: 1.0046 | 累计平均损失: 0.8435
Epoch: 7/20 | Batch: 600/782 | 单Batch损失: 0.9337 | 累计平均损失: 0.8426
Epoch: 7/20 | Batch: 700/782 | 单Batch损失: 0.8759 | 累计平均损失: 0.8434
Epoch 7/20 完成 | 训练准确率: 70.39% | 测试准确率: 76.19%
Epoch: 8/20 | Batch: 100/782 | 单Batch损失: 0.8458 | 累计平均损失: 0.8197
Epoch: 8/20 | Batch: 200/782 | 单Batch损失: 0.8156 | 累计平均损失: 0.8211
Epoch: 8/20 | Batch: 300/782 | 单Batch损失: 0.7666 | 累计平均损失: 0.8156
Epoch: 8/20 | Batch: 400/782 | 单Batch损失: 0.6120 | 累计平均损失: 0.8134
Epoch: 8/20 | Batch: 500/782 | 单Batch损失: 0.6858 | 累计平均损失: 0.8102
Epoch: 8/20 | Batch: 600/782 | 单Batch损失: 0.7514 | 累计平均损失: 0.8121
Epoch: 8/20 | Batch: 700/782 | 单Batch损失: 0.6480 | 累计平均损失: 0.8114
Epoch 8/20 完成 | 训练准确率: 71.51% | 测试准确率: 77.02%
Epoch: 9/20 | Batch: 100/782 | 单Batch损失: 0.7981 | 累计平均损失: 0.7802
Epoch: 9/20 | Batch: 200/782 | 单Batch损失: 0.7362 | 累计平均损失: 0.7854
Epoch: 9/20 | Batch: 300/782 | 单Batch损失: 0.9844 | 累计平均损失: 0.7890
Epoch: 9/20 | Batch: 400/782 | 单Batch损失: 0.8628 | 累计平均损失: 0.7902
Epoch: 9/20 | Batch: 500/782 | 单Batch损失: 0.6584 | 累计平均损失: 0.7813
Epoch: 9/20 | Batch: 600/782 | 单Batch损失: 0.7845 | 累计平均损失: 0.7785
Epoch: 9/20 | Batch: 700/782 | 单Batch损失: 0.7625 | 累计平均损失: 0.7808
Epoch 9/20 完成 | 训练准确率: 72.76% | 测试准确率: 75.81%
Epoch: 10/20 | Batch: 100/782 | 单Batch损失: 0.9217 | 累计平均损失: 0.7708
Epoch: 10/20 | Batch: 200/782 | 单Batch损失: 0.6924 | 累计平均损失: 0.7577
Epoch: 10/20 | Batch: 300/782 | 单Batch损失: 0.8563 | 累计平均损失: 0.7611
Epoch: 10/20 | Batch: 400/782 | 单Batch损失: 0.7075 | 累计平均损失: 0.7601
Epoch: 10/20 | Batch: 500/782 | 单Batch损失: 0.8329 | 累计平均损失: 0.7599
Epoch: 10/20 | Batch: 600/782 | 单Batch损失: 0.8095 | 累计平均损失: 0.7577
Epoch: 10/20 | Batch: 700/782 | 单Batch损失: 0.8299 | 累计平均损失: 0.7606
Epoch 10/20 完成 | 训练准确率: 73.43% | 测试准确率: 77.93%
Epoch: 11/20 | Batch: 100/782 | 单Batch损失: 0.5439 | 累计平均损失: 0.7166
Epoch: 11/20 | Batch: 200/782 | 单Batch损失: 0.5489 | 累计平均损失: 0.7403
Epoch: 11/20 | Batch: 300/782 | 单Batch损失: 0.6350 | 累计平均损失: 0.7432
Epoch: 11/20 | Batch: 400/782 | 单Batch损失: 0.8438 | 累计平均损失: 0.7419
Epoch: 11/20 | Batch: 500/782 | 单Batch损失: 0.7595 | 累计平均损失: 0.7411
Epoch: 11/20 | Batch: 600/782 | 单Batch损失: 0.8895 | 累计平均损失: 0.7448
Epoch: 11/20 | Batch: 700/782 | 单Batch损失: 0.7595 | 累计平均损失: 0.7465
Epoch 11/20 完成 | 训练准确率: 74.09% | 测试准确率: 78.10%
Epoch: 12/20 | Batch: 100/782 | 单Batch损失: 0.6579 | 累计平均损失: 0.7168
Epoch: 12/20 | Batch: 200/782 | 单Batch损失: 0.6543 | 累计平均损失: 0.7165
Epoch: 12/20 | Batch: 300/782 | 单Batch损失: 0.7679 | 累计平均损失: 0.7220
Epoch: 12/20 | Batch: 400/782 | 单Batch损失: 0.8142 | 累计平均损失: 0.7237
Epoch: 12/20 | Batch: 500/782 | 单Batch损失: 0.8004 | 累计平均损失: 0.7218
Epoch: 12/20 | Batch: 600/782 | 单Batch损失: 0.7744 | 累计平均损失: 0.7234
Epoch: 12/20 | Batch: 700/782 | 单Batch损失: 0.7173 | 累计平均损失: 0.7214
Epoch 12/20 完成 | 训练准确率: 74.68% | 测试准确率: 77.65%
Epoch: 13/20 | Batch: 100/782 | 单Batch损失: 0.6869 | 累计平均损失: 0.6944
Epoch: 13/20 | Batch: 200/782 | 单Batch损失: 0.6580 | 累计平均损失: 0.7084
Epoch: 13/20 | Batch: 300/782 | 单Batch损失: 0.6064 | 累计平均损失: 0.7080
Epoch: 13/20 | Batch: 400/782 | 单Batch损失: 0.7195 | 累计平均损失: 0.7179
Epoch: 13/20 | Batch: 500/782 | 单Batch损失: 1.0343 | 累计平均损失: 0.7175
Epoch: 13/20 | Batch: 600/782 | 单Batch损失: 0.5850 | 累计平均损失: 0.7148
Epoch: 13/20 | Batch: 700/782 | 单Batch损失: 0.5754 | 累计平均损失: 0.7128
Epoch 13/20 完成 | 训练准确率: 75.09% | 测试准确率: 77.66%
Epoch: 14/20 | Batch: 100/782 | 单Batch损失: 0.5283 | 累计平均损失: 0.6975
Epoch: 14/20 | Batch: 200/782 | 单Batch损失: 1.1302 | 累计平均损失: 0.7035
Epoch: 14/20 | Batch: 300/782 | 单Batch损失: 0.9454 | 累计平均损失: 0.6984
Epoch: 14/20 | Batch: 400/782 | 单Batch损失: 0.7083 | 累计平均损失: 0.6949
Epoch: 14/20 | Batch: 500/782 | 单Batch损失: 0.5797 | 累计平均损失: 0.6971
Epoch: 14/20 | Batch: 600/782 | 单Batch损失: 0.5849 | 累计平均损失: 0.6962
Epoch: 14/20 | Batch: 700/782 | 单Batch损失: 0.9050 | 累计平均损失: 0.6976
Epoch 14/20 完成 | 训练准确率: 75.49% | 测试准确率: 79.01%
Epoch: 15/20 | Batch: 100/782 | 单Batch损失: 0.2844 | 累计平均损失: 0.6537
Epoch: 15/20 | Batch: 200/782 | 单Batch损失: 1.1000 | 累计平均损失: 0.6781
Epoch: 15/20 | Batch: 300/782 | 单Batch损失: 0.8135 | 累计平均损失: 0.6796
Epoch: 15/20 | Batch: 400/782 | 单Batch损失: 0.6680 | 累计平均损失: 0.6832
Epoch: 15/20 | Batch: 500/782 | 单Batch损失: 0.5335 | 累计平均损失: 0.6831
Epoch: 15/20 | Batch: 600/782 | 单Batch损失: 0.7422 | 累计平均损失: 0.6872
Epoch: 15/20 | Batch: 700/782 | 单Batch损失: 0.6485 | 累计平均损失: 0.6897
Epoch 15/20 完成 | 训练准确率: 75.92% | 测试准确率: 79.58%
Epoch: 16/20 | Batch: 100/782 | 单Batch损失: 0.7250 | 累计平均损失: 0.6679
Epoch: 16/20 | Batch: 200/782 | 单Batch损失: 0.6936 | 累计平均损失: 0.6638
Epoch: 16/20 | Batch: 300/782 | 单Batch损失: 0.8627 | 累计平均损失: 0.6633
Epoch: 16/20 | Batch: 400/782 | 单Batch损失: 0.7659 | 累计平均损失: 0.6649
Epoch: 16/20 | Batch: 500/782 | 单Batch损失: 0.7195 | 累计平均损失: 0.6654
Epoch: 16/20 | Batch: 600/782 | 单Batch损失: 0.6420 | 累计平均损失: 0.6669
Epoch: 16/20 | Batch: 700/782 | 单Batch损失: 0.6305 | 累计平均损失: 0.6669
Epoch 16/20 完成 | 训练准确率: 76.55% | 测试准确率: 79.43%
Epoch: 17/20 | Batch: 100/782 | 单Batch损失: 0.7332 | 累计平均损失: 0.6623
Epoch: 17/20 | Batch: 200/782 | 单Batch损失: 0.6911 | 累计平均损失: 0.6589
Epoch: 17/20 | Batch: 300/782 | 单Batch损失: 0.6546 | 累计平均损失: 0.6595
Epoch: 17/20 | Batch: 400/782 | 单Batch损失: 0.5204 | 累计平均损失: 0.6593
Epoch: 17/20 | Batch: 500/782 | 单Batch损失: 0.7961 | 累计平均损失: 0.6638
Epoch: 17/20 | Batch: 600/782 | 单Batch损失: 0.6816 | 累计平均损失: 0.6633
Epoch: 17/20 | Batch: 700/782 | 单Batch损失: 0.5737 | 累计平均损失: 0.6634
Epoch 17/20 完成 | 训练准确率: 76.80% | 测试准确率: 80.08%
Epoch: 18/20 | Batch: 100/782 | 单Batch损失: 0.6912 | 累计平均损失: 0.6587
Epoch: 18/20 | Batch: 200/782 | 单Batch损失: 0.4426 | 累计平均损失: 0.6489
Epoch: 18/20 | Batch: 300/782 | 单Batch损失: 0.5549 | 累计平均损失: 0.6413
Epoch: 18/20 | Batch: 400/782 | 单Batch损失: 0.5941 | 累计平均损失: 0.6498
Epoch: 18/20 | Batch: 500/782 | 单Batch损失: 0.7530 | 累计平均损失: 0.6523
Epoch: 18/20 | Batch: 600/782 | 单Batch损失: 0.6738 | 累计平均损失: 0.6531
Epoch: 18/20 | Batch: 700/782 | 单Batch损失: 0.7091 | 累计平均损失: 0.6538
Epoch 18/20 完成 | 训练准确率: 77.14% | 测试准确率: 80.46%
Epoch: 19/20 | Batch: 100/782 | 单Batch损失: 0.5360 | 累计平均损失: 0.6525
Epoch: 19/20 | Batch: 200/782 | 单Batch损失: 0.4450 | 累计平均损失: 0.6557
Epoch: 19/20 | Batch: 300/782 | 单Batch损失: 0.5930 | 累计平均损失: 0.6473
Epoch: 19/20 | Batch: 400/782 | 单Batch损失: 0.5342 | 累计平均损失: 0.6479
Epoch: 19/20 | Batch: 500/782 | 单Batch损失: 0.5547 | 累计平均损失: 0.6504
Epoch: 19/20 | Batch: 600/782 | 单Batch损失: 0.7113 | 累计平均损失: 0.6451
Epoch: 19/20 | Batch: 700/782 | 单Batch损失: 0.9240 | 累计平均损失: 0.6441
Epoch 19/20 完成 | 训练准确率: 77.63% | 测试准确率: 80.91%
Epoch: 20/20 | Batch: 100/782 | 单Batch损失: 0.4548 | 累计平均损失: 0.6245
Epoch: 20/20 | Batch: 200/782 | 单Batch损失: 0.6227 | 累计平均损失: 0.6339
Epoch: 20/20 | Batch: 300/782 | 单Batch损失: 0.4400 | 累计平均损失: 0.6365
Epoch: 20/20 | Batch: 400/782 | 单Batch损失: 0.7307 | 累计平均损失: 0.6365
Epoch: 20/20 | Batch: 500/782 | 单Batch损失: 0.7341 | 累计平均损失: 0.6390
Epoch: 20/20 | Batch: 600/782 | 单Batch损失: 0.6771 | 累计平均损失: 0.6410
Epoch: 20/20 | Batch: 700/782 | 单Batch损失: 0.5984 | 累计平均损失: 0.6384
Epoch 20/20 完成 | 训练准确率: 77.50% | 测试准确率: 81.18%
路径如下:
在终端中打卡 一直显示没有日志。还没弄懂什么原因。
@浙大疏锦行
相关文章:

6月5日day45
Tensorboard使用介绍 知识点回顾: tensorboard的发展历史和原理tensorboard的常见操作tensorboard在cifar上的实战:MLP和CNN模型 效果展示如下,很适合拿去组会汇报撑页数: 作业:对resnet18在cifar10上采用微调策略下&a…...
Linux 系统 rsyslog 配置
Linux 系统 rsyslog 配置指南 rsyslog 是 Linux 系统的下一代日志处理系统,功能强大且高效。以下是从基础到高级的全面配置指南: 1. 安装与基础配置 安装 rsyslog # Ubuntu/Debian sudo apt update sudo apt install rsyslog# CentOS/RHEL sudo yum …...

基于rpc框架Dubbo实现的微服务转发实战
目录 rpc微服务模块 导入依赖 配置dubbo 注解 开启Dubbo Dubbo的使用 特殊点 并没有使用 Reference 注入 微服务之间调用 可以选用Http 也可以Dubbo 我们 Dubbo 的实现需要一个注册中心 我作为一个服务的提供者 我需要把我的服务注册到注册中心去 调用方需要注册中心…...
matlab基于GUI实现水果识别
基于GUI实现水果识别系统,限一个图片内存在一种水果 图像处理是一种利用计算机分析图像以达到预期结果的技术。图像处理一般指数字图像处理,而数字图像指由工业相机、摄像机、扫描仪等设备捕捉到的二维数组,数组中的元素称为像素,…...
视频爬虫的Python库
1. 请求与网络库 最基础的 HTTP 请求库,用于发送 GET/POST 请求获取网页内容。 示例:获取视频页面 HTML 或 API 响应。 import requests response requests.get(https://example.com/video/123) aiohttp 异步 HTTP 请求库,适合大规模并发下…...

深度学习N2周:构建词典
🍨 本文为🔗365天深度学习训练营中的学习记录博客🍖 原作者:K同学啊 本周任务:使用N1周的.txt文件构建词典,停用词请自定义 1.导入数据 from torchtext.vocab import build_vocab_from_iterator from co…...
Qt多线程访问同一个数据库源码分享(基于Sqlite实现)
Qt多线程访问同一个数据库源码分享(基于Sqlite实现) 一、实现难点线程安全问题死锁风险连接管理问题数据一致性性能瓶颈跨线程信号槽最佳实践建议 二、源码分享三、测试1、新建一个多线程类2、开启多线程插入数据 一、实现难点 多线程环境下多个线程同时…...
多类别分类中的宏平均和加权平均
前言 在处理多类别分类问题时,宏平均(Macro-average)和加权平均(Weighted-average)是评估模型性能时常用的两种聚合指标。它们都能将每个类别的独立指标(如精确率、召回率、F1分数等)整合成一个…...
电子电路:什么是扩散电容?
PN结的电容效应主要有两种:势垒电容和扩散电容。势垒电容是由于耗尽层宽度变化引起的,而扩散电容可能和载流子的扩散过程有关。扩散电容通常出现在正向偏置的情况下,因为这时候多子注入到对方区域,形成电荷的积累。 当PN结正向偏置时,电子从N区注入到P区,空穴从P区注入到…...

贪心算法应用:装箱问题(FFD问题)详解
贪心算法应用:装箱问题(FFD问题)详解 1. 装箱问题概述 装箱问题(Bin Packing Problem)是计算机科学和运筹学中的一个经典组合优化问题。问题的描述如下: 给定一组物品,每个物品有一定的体积,以及若干容量相同的箱子,…...
机器学习的数学基础:假设检验
假设检验 默认以错误率为性能度量,错误率由下式给出: E ( f , D ) ∫ x ∼ D I I ( f ( x ) ≠ y ) p ( x ) d x E(f,\mathcal{D})\int_{\boldsymbol{x}\sim \mathcal{D}}\mathbb{II}(f(\boldsymbol{x})\ne y )p(\boldsymbol{x})\text{d}\boldsymbol{x…...
余氯传感器在智慧水务系统中如何实现IoT集成
现代余氯传感器(关键词:智能余氯监测、物联网水质传感器、LoRaWAN水监测)通过(关键词:Modbus RTU、4-20mA输出、NB-IoT传输)协议与SCADA系统对接,实现(关键词:远程氯浓度…...

操作系统学习(九)——存储系统
一、存储系统 在操作系统中,存储系统(Storage System) 是计算机系统的核心组成部分之一,它负责数据的存储、组织、管理和访问。 它不仅包括物理设备(如内存、硬盘),还包括操作系统提供的逻辑抽…...

服务器安装软件失败或缺依赖怎么办?
服务器在安装软件时失败或提示缺少依赖,是运维中非常常见的问题。这个问题大多发生在 Linux 云服务器环境,原因和解决方法也有共性。以下是详细说明和解决建议: 🧠 一、常见原因分析 问题类型描述🔌 软件源不可用服务器…...
linux nm/objdump/readelf/addr2line命令详解
我们在开发过程中通过需要反汇编查看问题,那么我们这里使用rk3568开发板来举例nm/objdump/readelf/addr2line 分析动态库和可执行文件以及.o文件。 1,我们举例nm/objdump/readelf/addr2line解析linux 内核文件vmlinux (1),addr2…...

006网上订餐系统技术解析:打造高效便捷的餐饮服务平台
网上订餐系统技术解析:打造高效便捷的餐饮服务平台 在数字化生活方式普及的当下,网上订餐系统成为连接餐饮商家与消费者的重要桥梁。该系统以菜品分类、订单管理等模块为核心,通过前台展示与后台录入的分工协作,为管理员和会员提…...

[10-2]MPU6050简介 江协科技学习笔记(22个知识点)
1 2 3 欧拉角是描述三维空间中刚体或坐标系之间相对旋转的一种方法。它们由三个角度组成,通常表示为: • 偏航角(Yaw):绕垂直轴(通常是z轴)的旋转,表示偏航方向的变化。 • 俯仰角&a…...
基于行为分析的下一代安全防御指南
一、技术原理演进 从特征匹配到行为建模传统防火墙依赖特征库匹配(如病毒指纹),而行为分析技术通过建立用户/设备/应用的正常行为基线(基线构建误差<0.8%),利用隐马尔可夫模型检测异常。微软Az…...
Redis持久化机制详解:RDB与AOF的深度剖析
一、为什么需要持久化? Redis作为内存数据库,数据存储在易失性内存中。持久化机制解决两大核心问题: 数据安全:防止服务器宕机导致数据丢失灾难恢复:支持数据备份与快速重建 二、RDB:内存快照持久化 ▶ …...
记录一次 apt-key curl导入失败的处理方式
在配置 Kubernetes APT 仓库的过程中,我们通常会执行如下命令来添加阿里云的 GPG 公钥: curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -但这次在某台新机器上执行时,出现了访问失败的问题。具体表现为 cu…...

Spring Boot 3.X 下Redis缓存的尝试(二):自动注解实现自动化缓存操作
前言 上文我们做了在Spring Boot下对Redis的基本操作,如果频繁对Redis进行操作而写对应的方法显示使用注释更会更高效; 比如: 依之前操作对一个业务进行定入缓存需要把数据拉取到后再定入; 而今天我们可以通过注释的方式不需要额外…...

【03】完整开发腾讯云播放器SDK的UniApp官方UTS插件——优雅草上架插件市场-卓伊凡
【03】完整开发腾讯云播放器SDK的UniApp官方UTS插件——优雅草上架插件市场-卓伊凡 一、项目背景与转型原因 1.1 原定计划的变更 本系列教程最初规划是开发即构美颜SDK的UTS插件,但由于甲方公司内部战略调整,原项目被迫中止。考虑到: 技术…...

C:\Users\中文名修改为英文名
C:\Users\中文名修改为英文名 背景操作步骤 背景 买了台新电脑,初始化好不知道啥操作把自己的登录用户名改成了中文,有些安装的软件看见有中文直接就水土不服了。 操作步骤 以下称中文用户名为张三。 正常登录张三用户 进入用户管理页面修改用户名&a…...
Web 架构相关文章目录(持续更新中)
文章目录 目录结构总结 目录结构 序号标题链接1Web 架构之数据库开发规范Web 架构之数据库开发规范2Web 架构之状态码全解Web 架构之状态码全解3Web 架构之会话保持深度解析Web 架构之会话保持深度解析4Web 架构之负载均衡会话保持Web 架构之负载均衡会话保持5Web 架构之攻击应…...
Redis 安装配置和性能优化
目录 简介 一、Redis 基础概念与优势 1.1 关系型与非关系型数据库对比 1.2 Redis 核心特性 二、Redis 部署 2.1 环境准备与源码安装 2.2 服务脚本配置与启动 三、Redis 配置参数 四、Redis 命令工具与常用操作 4.1 命令行工具(redis-cli) 4.2…...

购物商城网站 Java+Vue.js+SpringBoot,包括商家管理、商品分类管理、商品管理、在线客服管理、购物订单模块
购物商城网站 JavaVue.jsSpringBoot,包括商家管理、商品分类管理、商品管理、在线客服管理、购物订单模块 百度云盘链接:https://pan.baidu.com/s/10W0kpwswDSmtbqYFsQmm5w 密码:68jy 摘 要 随着科学技术的飞速发展,各行各业都在…...
PostgreSQL 安全纵深防御:从权限到加密
文章目录 PostgreSQL 安全纵深防御:从权限到加密 第一章:角色与权限体系 - PostgreSQL的安全基石 1.1 角色(ROLE)的本质与演进1.2 权限模型的三层架构1.3 GRANT/REVOKE 实战精解1.4 默认权限(DEFAULT PRIVILEGES&#…...
【美团技术团队】从实际案例聊聊Java应用的GC优化
【美团技术团队】从实际案例聊聊Java应用的GC优化 1. 美团技术团队优秀文章2. 绪论 1. 美团技术团队优秀文章 Java NIO浅析 https://tech.meituan.com/2016/11/04/nio.html红黑树深入剖析及Java实现 https://tech.meituan.com/2016/12/02/redblack-tree.htmlJava 8系列之重新认…...

在word中点击zotero Add/Edit Citation没有反应的解决办法
重新安装了word插件 1.关掉word 2.进入Zotero左上角编辑-引用 3.往下滑找到Microsoft Word,点重新安装加载项...

整合swagger,以及Knife4j优化界面
因为是前后端项目,需要前端的参与,所以一个好看的接口文档非常的重要 1、引入依赖 美化插件其中自带swagger的依赖了 <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi3-spring-boot-starter&…...