目录
1. 目的
- 介绍和使用TensorBoard
- 解释一些训练概念
- 梯度累加
2. TensorBoard
2.1 In TensorFlow
2.2.1 安装 TensorBoard
pip install tensorboard
查看是否安装 TensorBoard:
>> pip show tensorboard
---
Name: tensorboard
Version: 2.8.0
Summary: TensorBoard lets you watch Tensors Flow
Home-page: https://github.com/tensorflow/tensorboard
Author: Google Inc.
Author-email: packages@tensorflow.org
License: Apache 2.0
Location: /opt/vitis_ai/conda/envs/vitis-ai-tensorflow2/lib/python3.7/site-packages
Requires: absl-py, google-auth, google-auth-oauthlib, grpcio, markdown, numpy, protobuf, requests, setuptools, tensorboard-data-server, tensorboard-plugin-wit, werkzeug, wheel
Required-by: tensorflow
2.2.2 导入必要的库
import time
import tensorflow as tf
2.2.3 初始化
# 初始化 TensorBoard 的 SummaryWriter
log_dir = "./"
writer = tf.summary.create_file_writer(log_dir)
2.2.4 记录数据
# 记录数据
with writer.as_default():
for i in range(100):
tf.summary.scalar('Incremental Data', i, step=i)
time.sleep(1) # 延迟 1 秒
2.2.5 启动 TensorBoard
在 Jupyter Lab 中 Terminal 运行以下命令来启动 TensorBoard:
tensorboard --logdir=./
---
NOTE: Using experimental fast data loading logic. To disable, pass
"--load_fast=false" and report issues on GitHub. More details:
https://github.com/tensorflow/tensorboard/issues/4784
Serving TensorBoard on localhost; to expose to the network, use a proxy or pass --bind_all
TensorBoard 2.8.0 at http://localhost:6006/ (Press CTRL+C to quit)
在浏览器中打开显示的 URL(直接单击链接地址即可),查看数据:
2.2.6 刷新间隔
勾选 “Reload data” 选项,并设置 “Reload period” 为你希望的刷新间隔(最少 30 秒)。
2.2 In PyTorch
2.2.1 安装 setuptools
在 Vitis AI 2.5 中,默认安装的 setuptools 版本是 59.8.0,和 Torch 环境不符。
需要降级 setuptools:
pip install setuptools==59.5.0
2.2.2 记录数据
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.tensorboard import SummaryWriter
# 输入数据
X = torch.tensor([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
Y = torch.tensor([[10.0], [20.0]])
# 定义模型
class LinearRegressionModel(nn.Module):
def __init__(self):
super(LinearRegressionModel, self).__init__()
self.linear = nn.Linear(3, 1)
# 初始化权重和偏置为零
nn.init.zeros_(self.linear.weight)
nn.init.zeros_(self.linear.bias)
def forward(self, x):
return self.linear(x)
model = LinearRegressionModel()
# 定义损失函数和优化器
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)
log_dir = "./"
writer = SummaryWriter('log_dir')
# 训练模型
for epoch in range(500):
model.train()
optimizer.zero_grad()
outputs = model(X)
loss = criterion(outputs, Y)
loss.backward()
optimizer.step()
writer.add_scalar('Incremental Data', loss, epoch)
writer.close()
# 打印模型变量
for name, param in model.named_parameters():
print(f"{name}: {param.data}")
在 Jupyter Lab 中 Terminal 运行以下命令来启动 TensorBoard:
tensorboard --logdir=./
---
请访问 http://workspace.featurize.cn:18245 来访问 TensorBoard 面板
如果无法访问面板,清参考文档 https://docs.featurize.cn/docs/manual/tensorboard 解决
2024-08-14 16:25:28.403920: E tensorflow/stream_executor/cuda/cuda_driver.cc:271] failed call to cuInit: CUDA_ERROR_NO_DEVICE: no CUDA-capable device is detected
2024-08-14 16:25:28.404023: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:156] kernel driver does not appear to be running on this host (featurize): /proc/driver/nvidia/version does not exist
NOTE: Using experimental fast data loading logic. To disable, pass
"--load_fast=false" and report issues on GitHub. More details:
https://github.com/tensorflow/tensorboard/issues/4784
TensorBoard 2.7.0 at http://0.0.0.0:6006/ (Press CTRL+C to quit)
2.2.3 查看 Tensorboard
3. 训练周期 Epoch
3.1 Epoch
Epoch,即训练周期是一个非常重要的概念。它指的是整个训练数据集被完整地送入神经网络进行一次前向传播和反向传播的过程。简单来说,就是模型在所有训练数据上训练了一遍。
随着 epoch 数量的增加,模型会逐渐从欠拟合状态(underfitting)转变为过拟合状态(overfitting)。因此,选择合适的epoch数量对于模型的性能至关重要。
可以将训练过程想象成学习一本书。一个 epoch 就像是从头到尾读完这本书一次。每次读完一遍(一个 epoch),你都会对书中的内容理解得更深刻。然而,如果你反复读这本书太多次(过多的epoch),你可能会开始记住每一个细节和句子,而不是理解书的整体意义。这就像是你在考试中只记住了书中的例子,而不是掌握了解决问题的方法。
3.2 Batch
假设你把一本书分成了多个章节(batch),每次你读完一个章节并做笔记(一次 Iteration),你会对这部分内容有更深的理解。完成所有章节的阅读和笔记(所有 Iteration)后,你就完成了一次完整的阅读(一个 epoch)。
- 训练数据会被分成多个小批次(batch)进行训练,每个小批次包含一定数量的样本。
- 只有当前批次的数据会被加载到内存中进行处理。
- 训练中,每个小批次上会进行前向传播和反向传播,更新权重。
3.3 Iteration
如果你的训练数据集有1000个样本,你将其分成每个包含100个样本的10个批次(batch)。那么,完成一个 epoch 需要10次 iteration。
4. 梯度累加
4.1 解释训练代码
在训练模型这部分代码中:
# 训练模型
for epoch in range(500):
model.train() # 将模型设置为训练模式。这会启用一些特定于训练的行为,比如dropout。
optimizer.zero_grad() # 清除优化器中累积的梯度。每次反向传播之前都需要清除梯度,否则梯度会累积。
outputs = model(X)
loss = criterion(outputs, Y) # 计算模型输出outputs和真实标签Y之间的损失。
loss.backward() # 反向传播,计算损失相对于模型参数的梯度。
optimizer.step() # 使用计算出的梯度更新模型参数。
其中,optimizer.zero_grad() 用于清除优化器中累积的梯度。
那么,不清除梯度是否有别的用途?
是的,特别是在处理大模型和有限GPU内存时非常有用。
4.2 累加 or 分批
梯度累加的情况:
- 一个epoch被分成10个mini-batch。
- 每个mini-batch进行一次前向传播和反向传播,但不立即更新参数,而是累积梯度。
- 在处理完第10个mini-batch后,使用累积的梯度更新模型参数。
不分batch的情况:
- 直接使用整个数据集进行一次前向传播和反向传播。
- 完成整个epoch后,使用计算出的梯度更新模型参数。
这两种方法在理论上是等价的,但在实践中可能会有一些差异:
- 计算效率和内存使用:
- Mini-batch:每次只处理一部分数据(mini-batch),因此内存需求较小,并且可以利用现代计算架构(如GPU)的并行处理能力,提高计算效率。
- 不分batch:每次迭代处理整个训练集,这在数据集很大时可能会导致内存问题,并且每次迭代的计算成本非常高。此外,对于非常大的数据集,使用全量数据进行每次更新可能并不是最高效的方法。
- 收敛速度:
- Mini-batch:由于每次只使用一部分数据来估计梯度,可能会引入噪声,这种噪声有时可以帮助模型跳出局部最小值,提高算法的收敛速度和可能达到的全局最小值的概率。
- 不分batch:每次使用整个数据集精确计算梯度,收敛过程较为平稳,但可能容易陷入局部最小值。
- 泛化能力:
- 使用mini-batch可以增加模型的泛化能力,因为每次更新都引入了一定的噪声,相当于对模型进行了一定程度的正则化。相比之下,使用全数据集的方法可能会导致模型过于拟合训练数据。
5. 总结
本文介绍了TensorBoard的使用方法及其在TensorFlow和PyTorch中的应用,同时解释了训练周期(Epoch)、批量(Batch)和迭代(Iteration)等基本概念,并探讨了梯度累加的技术细节和实际应用。通过使用TensorBoard,我们能够有效地监控和分析模型训练过程中的各种指标,如损失和准确率等,这对于模型优化和调试非常有帮助。
我们还讨论了Epoch的重要性,它代表模型在整个数据集上训练一次的过程,以及如何通过调整Epoch的数量来控制模型的拟合程度。此外,Batch和Iteration的概念帮助我们理解数据是如何被分批处理的,以及每个批次如何影响模型学习的效率和效果。
最后,梯度累加的讨论揭示了在资源受限或处理大型数据集时优化模型训练的一种策略。通过累积小批量数据的梯度,然后统一更新模型参数,可以有效管理内存使用,同时可能帮助模型达到更好的训练效果。
这些技术和工具的掌握对于深度学习模型的开发和优化至关重要。