visualDL(一)scalar标量图

目录

1.visualDL简介 

 2.用Scalar图可视化损失和精度

2.1记录接口

2.2使用核心代码

3.在AI Studio中体验

3.1流程

3.2训练MNIST识别模型

3.2.1定义数据和模型等

3.2.2训练并记录日志

3.2.3可视化


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的使用规则为:

  1. 第一个/前的为父tag,并作为一栏图片的tag
  2. 第一个/后的为子tag,子tag的对应图片将显示在父tag下
  3. 可以使用多次/,但一栏图片的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

3.2.3可视化

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值