目录
1.visualDL简介
VisualDL是一个面向深度学习任务设计的可视化工具。VisualDL 利用了丰富的图表来展示数据,用户可以更直观、清晰地查看数据的特征与变化趋势,有助于分析数据、及时发现错误,进而改进神经网络模型的设计。
目前,VisualDL 支持 scalar, image, audio, graph, histogram, pr curve, high dimensional 七个组件。
- Scalar 折线图 动态展示损失函数值、准确率等标量数据
- Image 图片可视化 显示图片,可显示输入图片和处理后的结果,便于查看中间过程的变化
- Audio 音频可视化 播放训练过程中的音频数据,监控语音识别与合成等任务的训练过程
- Graph 网络结构 展示网络结构、节点属性及数据流向,辅助学习、优化网络结构
- Histogram 直方图 展示训练过程中权重、梯度等张量的分布
- PR Curve 折线图 权衡精度与召回率之间的平衡关系
- High Dimensional 数据降维 将高维数据映射到 2D/3D 空间来可视化嵌入,便于观察不同数据的相关性
2.用Scalar图可视化损失和精度
Scalar 组件的输入数据类型为标量,该组件的作用是将训练参数以折线图形式呈现。将损失函数值、准确率等标量数据作为参数传入 scalar 组件,即可画出折线图,便于观察变化趋势。
2.1记录接口
add_scalar(tag, value, step, walltime=None)
参数 格式 含义
tag string 记录指标的标志,如train/loss,不能含有%
value float 要记录的数据值
step int 记录的步数
walltime int 记录数据的时间戳,默认为当前时间戳
*注意tag的使用规则为:
- 第一个
/
前的为父tag,并作为一栏图片的tag - 第一个
/
后的为子tag,子tag的对应图片将显示在父tag下 - 可以使用多次
/
,但一栏图片的tag依旧为第一个/
前的tag
2.2使用核心代码
Step1 训练代码中增加 Loggers 来记录不同种类的数据.
Step2 训练过程中插入数据打点语句,将结果储存至日志文件中
方式一:
from visualdl import LogWriter
if __name__ == '__main__':
value = [i/1000.0 for i in range(1000)]
# 初始化一个记录器
with LogWriter(logdir="./log/scalar_test/train") as writer:
for step in range(1000):
# 向记录器添加一个tag为`acc`的数据
writer.add_scalar(tag="acc", step=step, value=value[step])
# 向记录器添加一个tag为`loss`的数据
writer.add_scalar(tag="loss", step=step, value=1/(value[step] + 1))
方式二:
# 如果不想使用上下文管理器`with`,可拆解为以下几步完成:
"""
writer = LogWriter(logdir="./log/scalar_test/train")
writer.add_scalar(tag="acc", step=1, value=0.5678)
writer.add_scalar(tag="acc", step=2, value=0.6878)
writer.add_scalar(tag="acc", step=3, value=0.9878)
writer.close()
"""
2.3启动服务
在命令行执行 visualdl --logdir ./log --port 8080,
接着在浏览器打开http://127.0.0.1:8080
,即可查看以下折线图。
支持在Python脚本中启动VisualDL面板,接口如下:
visualdl.server.app.run(logdir,
model="path/to/model",
host="127.0.0.1",
port=8080,
cache_timeout=20,
language=None,
public_path=None,
api_only=False,
open_browser=False)
如:
from visualdl.server import app app.run(logdir="./log")
3.在AI Studio中体验
3.1流程
Step1 训练代码中增加 Loggers 来记录不同种类的数据. 注意我们的logdir = "./log"
, 即需要把log目录放到/home/aistudio/log
.
Step2 训练过程中插入数据打点语句,将结果储存至日志文件中
Step3 切换到「可视化」页签,指定日志文件与模型文件(不指定日志文件无法启动VisualDL)
3.2训练MNIST识别模型
3.2.1定义数据和模型等
from visualdl import LogWriter
import paddle
from paddle.vision.transforms import ToTensor
from paddle.io import DataLoader
batch_size = 20
num_epoch = 10
#数据加载
train_data = paddle.vision.datasets.MNIST(mode='train', transform=ToTensor())
test_data = paddle.vision.datasets.MNIST(mode='test', transform=ToTensor())
train_loader = DataLoader(train_data, batch_size=batch_size, shuffle=True)
test_loader = DataLoader(test_data, batch_size=batch_size, shuffle=True)
#模型、优化器和损失精度的定义
model = paddle.vision.models.LeNet()
opt = paddle.optimizer.SGD(learning_rate=1e-3, parameters=model.parameters())
loss = paddle.nn.CrossEntropyLoss()
acc_fn = paddle.metric.accuracy
num_batch_train = int(len(train_data)/batch_size) + 1
num_batch_test = int(len(test_data)/batch_size) + 1
3.2.2训练并记录日志
with LogWriter(logdir='./log/scalar_test/train') as writer:
for epoch in range(num_epoch):
model.train()
for id, data in enumerate(train_loader):
image = data[0]
label = data[1]
prediction = model(image)
l = loss(prediction, label)
acc = acc_fn(prediction, label)
opt.clear_grad()
l.backward()
opt.step()
writer.add_scalar(tag='train/loss', step=epoch*num_batch_train+id, value=l)
writer.add_scalar(tag='train/acc', step=epoch*num_batch_train+id, value=acc)
model.eval()
for id, data in enumerate(test_loader):
image = data[0]
label = data[1]
prediction = model(image)
l = loss(prediction, label)
acc = acc_fn(prediction, label)
writer.add_scalar(tag='test/loss', step=epoch*num_batch_test+id, value=l)
writer.add_scalar(tag='test/acc', step=epoch*num_batch_test+id, value=acc)
可以看到 writer.add_scalar()函数中的tag分为两个主tag,分别是train和test,每个主标签下又设置了两个子标签loss和acc。由于是双重循环,记录步骤step参数要做到不重叠,因此每一轮的id要加上轮数epoch*总数num_batch。