当前位置: 首页 > wzjs >正文

wordpress编辑器换了网络公司优化关键词

wordpress编辑器换了,网络公司优化关键词,个性化网站建设,汽车报价大全TensorBoard使用 知识点回顾: tensorboard的发展历史和原理 tensorboard的常见操作 tensorboard在cifar上的实战:MLP和CNN模型 之前神经网络的训练中,为了帮助理解,借用了很多的组件,比如训练进度条、可视化的loss下降…

TensorBoard使用
知识点回顾:

tensorboard的发展历史和原理
tensorboard的常见操作
tensorboard在cifar上的实战:MLP和CNN模型
之前神经网络的训练中,为了帮助理解,借用了很多的组件,比如训练进度条、可视化的loss下降曲线、权重分布图,运行结束后还可以查看单张图的推理效果。如果现在有一个交互工具可以很简单的通过按钮完成这些辅助功能那就好了,所以现在介绍下tensorboard这个可视化工具,它可以很方便地完成很多可视化的功能,尤其是可以在运行过程中实时渲染,方便我们根据图来动态调整训练策略,而不是训练完了才知道好不好

TensorBoard 的核心原理就是在训练过程中,把训练过程中的数据(比如损失、准确率、图片等)先记录到日志文件里,再通过工具把这些日志文件可视化成图表,这样就不用自己手动打印数据或者用其他工具画图。所以核心就是2个步骤:

-数据怎么存?—— 先写日志文件。训练模型时,TensorBoard 会让程序把训练数据和模型结构等信息,通过 SummaryWriter 写入一个特殊的日志文件(.tfevents 文件)
-数据怎么看?—— 用网页展示日志。写完日志后,TensorBoard 会启动一个本地网页服务,自动读取日志文件里的数据,用图表、图像、文本等形式展示出来。如果只用 print 或者自己用 matplotlib 画图,不仅麻烦,还得手动保存数据、写代码,尤其训练几天几夜时,根本没法实时盯着看。而 TensorBoard 能自动把这些数据 “存下来 + 画出来”,还能生成网页版的可视化界面,随时刷新查看
TensorBoard 核心功能:

1、日志目录自动管理

log_dir = 'runs/cifar10_mlp_experiment'
if os.path.exists(log_dir): # 默认目录已存在则i初始化为1,进入while循环i = 1while os.path.exists(f"{log_dir}_{i}"):i += 1log_dir = f"{log_dir}_{i}"
writer = SummaryWriter(log_dir) #关键入口,用于写入数据到日志目录

自动避免日志目录重复。若 runs/cifar10_mlp_experiment 已存在,会生成 runs/cifar10_mlp_experiment_1、_2 等新目录,确保每次训练的日志独立存储。方便对比不同训练任务的结果(如不同超参数实验)

2、记录标量数据(Scalar)

# 记录每个 Batch 的损失和准确率
writer.add_scalar('Train/Batch_Loss', batch_loss, global_step) # global_step 是一个全局训练步数计数器,用于记录模型训练到了第几步(即当前已经完成了多少个 batch 的更新)
writer.add_scalar('Train/Batch_Accuracy', batch_acc, global_step)# 记录每个 Epoch 的训练指标
writer.add_scalar('Train/Epoch_Loss', epoch_train_loss, epoch)
writer.add_scalar('Train/Epoch_Accuracy', epoch_train_acc, epoch)

3、可视化模型结构(Graph)

dataiter = iter(train_loader) # 将DataLoader转换为一个迭代器(iterator),从而可以遍历数据
images, labels = next(dataiter) # 从迭代器dataiter中取出下一批数据
images = images.to(device)
writer.add_graph(model, images)  # 通过真实输入样本生成模型计算图

4、可视化图像

# 可视化原始训练图像
img_grid = torchvision.utils.make_grid(images[:8].cpu()) # 将多张图像拼接成网格状(方便可视化),将前8张图像拼接成一个网格。以及TensorBoard可视化需要CPU数据
writer.add_image('原始训练图像', img_grid)

拼接成一张网格状大图是因为 add_image 一次只能记录一张图像(不接受批量输入)

5、记录权重和梯度直方图(Histogram)

if (batch_idx + 1) % 500 == 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'grads/{name}', param.grad, global_step)  # 梯度分布

使用tensorboard监控训练的cifar-10 MLP模型完整代码

import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
import numpy as np
import matplotlib.pyplot as plt
import os# 设置随机种子以确保结果可复现
torch.manual_seed(42)
np.random.seed(42)# 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)# CIFAR-10的类别名称
classes = ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck')# 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优化器# 创建TensorBoard的SummaryWriter,指定日志保存目录
log_dir = 'runs/cifar10_mlp_experiment'
# 如果目录已存在,添加后缀避免覆盖
if os.path.exists(log_dir):i = 1while os.path.exists(f"{log_dir}_{i}"):i += 1log_dir = f"{log_dir}_{i}"
writer = SummaryWriter(log_dir)# 5. 训练模型(使用TensorBoard记录各种信息)
def train(model, train_loader, test_loader, criterion, optimizer, device, epochs, writer):model.train()  # 设置为训练模式# 记录训练开始时间,用于计算训练速度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)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()  # 更新参数# 统计准确率和损失running_loss += loss.item()_, predicted = output.max(1)total += target.size(0)correct += predicted.eq(target).sum().item()# 每100个批次记录一次信息到TensorBoardif (batch_idx + 1) % 100 == 0:batch_loss = loss.item()batch_acc = 100. * correct / total# 记录标量数据(损失、准确率)writer.add_scalar('Train/Batch_Loss', batch_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)# 每500个批次记录一次直方图(权重和梯度)if (batch_idx + 1) % 500 == 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'grads/{name}', param.grad, global_step)print(f'Epoch: {epoch+1}/{epochs} | Batch: {batch_idx+1}/{len(train_loader)} 'f'| 单Batch损失: {batch_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 / total# 记录每个epoch的训练损失和准确率writer.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 = 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).cpu() # 是个布尔型张量if wrong_mask.sum() > 0:wrong_batch_images = data[wrong_mask].cpu() # data[wrong_mask]:从输入数据 data(形状 [batch_size, C, H, W])中筛选出wrong_mask为True的图像wrong_batch_labels = target[wrong_mask].cpu()wrong_batch_preds = predicted[wrong_mask].cpu()wrong_images.extend(wrong_batch_images) # 因为是批量张量所以用extend添加每一个元素到列表里wrong_labels.extend(wrong_batch_labels)wrong_preds.extend(wrong_batch_preds)epoch_test_loss = test_loss / len(test_loader)epoch_test_acc = 100. * correct_test / total_test# 记录每个epoch的测试损失和准确率writer.add_scalar('Test/Loss', epoch_test_loss, epoch)writer.add_scalar('Test/Accuracy', epoch_test_acc, epoch)# 计算并记录训练速度(每秒处理的样本数)# 这里简化处理,假设每个epoch的时间相同samples_per_epoch = len(train_loader.dataset)# 实际应用中应该使用time.time()来计算真实时间print(f'Epoch {epoch+1}/{epochs} 完成 | 训练准确率: {epoch_train_acc:.2f}% | 测试准确率: {epoch_test_acc:.2f}%')# 可视化预测错误的样本(只在最后一个epoch进行)if epoch == epochs - 1 and len(wrong_images) > 0:# 最多显示8个错误样本display_count = min(8, len(wrong_images))wrong_img_grid = torchvision.utils.make_grid(wrong_images[:display_count])# 创建错误预测的标签文本wrong_text = []for i in range(display_count):true_label = classes[wrong_labels[i]]pred_label = classes[wrong_preds[i]]wrong_text.append(f'True: {true_label}, Pred: {pred_label}')writer.add_image('错误预测样本', wrong_img_grid)writer.add_text('错误预测标签', '\n'.join(wrong_text), epoch)# 关闭TensorBoard写入器writer.close()return epoch_test_acc  # 返回最终测试准确率# 6. 执行训练和测试
epochs = 20  # 训练轮次
print("开始训练模型...")
print(f"TensorBoard日志保存在: {log_dir}")
print("训练完成后,使用命令 `tensorboard --logdir=runs` 启动TensorBoard查看可视化结果")final_accuracy = train(model, train_loader, test_loader, criterion, optimizer, device, epochs, writer)
print(f"训练完成!最终测试准确率: {final_accuracy:.2f}%")

收获心得:

学习的时候一直很困惑训练函数里面缩进的问题,本质上还是对各操作的归属层级不太明确

Batch 级别操作(内层循环)
数据加载、模型前向传播、损失计算、反向传播、参数更新

Batch级指标记录(批损失、批准确率、学习率、参数直方图)

Epoch 级别操作(外层循环)
Epoch级指标记录(每个epoch训练集平均损失、准确率)

测试集验证(以及收集错误样本)及其指标记录(每个epoch测试集损失和准确率)

可视化错误样本(只需在epoch结束时做一次)

更新学习率调度器


@浙大疏锦行

http://www.dtcms.com/wzjs/343535.html

相关文章:

  • 最版网站建设案例寻找客户的12种方法
  • php做的网站有哪些国内新闻最新消息简短
  • 徐州市贾汪区建设局网站sem扫描电镜是测什么的
  • 定制和订制seo发帖软件
  • 杭州知名的企业网站建设策划包头整站优化
  • 天地做网站网络营销环境分析包括哪些内容
  • 山西省政府网站建设的公司百度小说风云榜总榜
  • 淘宝做图片的网站百度seo效果
  • 做网站王仁杰个人网站建站教程
  • 政府门户网站营销型网站建设专家
  • 网站可以做什么今日国际新闻大事
  • php网站模板制作软件郑州网站建设
  • wordpress 3.7 xss中山seo关键词
  • 涿鹿县建设局网站信息流广告代理商排名
  • 做外汇最好的财经网站百度公司图片
  • 公司介绍网站模板百度关键词怎么做排名
  • android wap网站搜索百度下载安装
  • 永久域名免费注册网站清博舆情系统
  • 网站服务器维护费用优化技术基础
  • 在线课堂手机网站模板济南全网推广
  • 哈尔滨网站制作前景源码交易网站源码
  • 化妆品网站建设网站google play下载安卓
  • 更合高明网站建设设计网站的软件
  • 上海网站建设哪家好seo简单优化
  • 内容平台广州seo推广营销
  • 聚搜济南网站建设公司网络营销顾问是做什么的
  • 广州艾迪网站建设快手作品免费推广软件
  • 如何建设好医院网站搜索引擎优化的步骤
  • 建网站深圳推广方案模板
  • 佛山免费网站制作免费二级域名分发网站