本文介绍用pyecharts构建类似visualDL的实时可视化工具,监控模型训练时的LOSS和ACC变化。先安装pyecharts,用paddle.vision的Cifar10数据集和mobilenet_v2模型,配置训练参数与优化器,定义折线图和仪表盘可视化函数,通过定期刷新本地HTML实现实时展示训练状态。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

使用pyecharts,在本地训练的时候,可以实时刷新训练中的LOSS和ACC变化,做一个自己的visualDL
概况
- Echarts 是一个由百度开源的数据可视化,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可。而 Python 是一门富有表达力的语言,很适合用于数据处理。当数据分析遇上数据可视化时,pyecharts 诞生了。
特性
- 简洁的 API 设计,使用如丝滑般流畅,支持链式调用
- 囊括了 30+ 种常见图表,应有尽有
- 支持主流 Notebook 环境,Jupyter Notebook 和 JupyterLab
- 可轻松集成至 Flask,Django 等主流 Web 框架
- 高度灵活的配置项,可轻松搭配出精美的图表
- 详细的文档和示例,帮助开发者更快的上手项目
- 多达 400+ 地图文件以及原生的百度地图,为地理数据可视化提供强有力的支持
参考:https://pyecharts.org/#/zh-cn/intro
# 安装pyecharts! pip install -q pyecharts
为了减小体积,新版的pyecharts已经不带地图包了,如果有地图服务需求的需要单独安装地图包
# 持久化安装地图包# ! mkdir /home/aistudio/maps# ! pip install echarts-countries-pypkg -t /home/aistudio/maps# ! pip install echarts-china-provinces-pypkg -t /home/aistudio/maps# ! pip install echarts-china-cities-pypkg -t /home/aistudio/maps# ! pip install echarts-china-counties-pypkg -t /home/aistudio/maps# ! pip install echarts-china-misc-pypkg -t /home/aistudio/maps# ! pip install echarts-cities-pypkg -t /home/aistudio/maps# import sys # sys.path.append('/home/aistudio/maps')主要使用paddle.vision里面的分类模型和数据
import numpy as npimport paddlefrom paddle.vision.datasets import Cifar10import paddle.vision.transforms as Tfrom paddle.io import DataLoaderfrom paddle.nn.functional import cross_entropyfrom paddle.metric import accuracyfrom paddle.vision.models import mobilenet_v2from paddle.optimizer import Adam
数据集的图像较小,在32G的GPU环境下,可以使用大的batch_size。这里我们训练10轮,每轮都评估一次
# 配置batch_size = 2048learning_rate = 2e-6epoch_num = 10eval_epoch = 1 # 多少轮评估一次
该数据集共有60000张彩色图像,这些图像是32*32,分为10个类,每类6000张图。这里面有50000张用于训练,构成了5个训练批,每一批10000张图;另外10000用于测试,单独构成一批。测试批的数据里,取自10类中的每一类,每一类随机取1000张。抽剩下的就随机排列组成了训练批。注意一个训练批中的各类图像并不一定数量相同,总的来看训练批,每一类都有5000张图
MobileNetV2 基于 MobileNetV1的基本概念构建,并使用在深度上可分离的卷积作为高效的构建块。此外,MobileNetV2 引入了两种新的架构特性:1)层之间的线性瓶颈层;2)瓶颈层之间的连接捷径
Adam是一种自适应优化器,结合AdaGrad和RMSProp两种优化算法的优点。对梯度的一阶矩估计(梯度的均值)和二阶矩估计(梯度的未中心化的方差)进行综合考虑,计算出更新步长
# 数据normalize = T.ToTensor() # 据大佬发现,totensor带有简单的normalize的功能train_data = Cifar10(mode='train', transform=normalize) eval_data = Cifar10(mode='test', transform=normalize) train_reader = DataLoader(train_data, batch_size=batch_size, shuffle=True, drop_last=True) eval_reader = DataLoader(eval_data, batch_size=batch_size, shuffle=True, drop_last=True)# 模型model = mobilenet_v2(pretrained=True, num_classes=10)# 优化器opt = Adam(learning_rate=learning_rate, parameters=model.parameters())
Cache file /home/aistudio/.cache/paddle/dataset/cifar/cifar-10-python.tar.gz not found, downloading https://dataset.bj.bcebos.com/cifar/cifar-10-python.tar.gz
Begin to download
Download finished
100%|██████████| 20795/20795 [00:00<00:00, 56851.54it/s]
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/dygraph/layers.py:1263: UserWarning: Skip loading for classifier.1.weight. classifier.1.weight receives a shape [1280, 1000], but the expected shape is [1280, 10].
warnings.warn(("Skip loading for {}. ".format(key) + str(err)))
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/dygraph/layers.py:1263: UserWarning: Skip loading for classifier.1.bias. classifier.1.bias receives a shape [1000], but the expected shape is [10].
warnings.warn(("Skip loading for {}. ".format(key) + str(err)))具体pyecharts的使用可以参考官方文档,这里使用了折线图表示训练时的LOSS和ACC,用仪表盘表示评估的ACC
from pyecharts import options as optsfrom pyecharts.charts import Line, Gauge # 折线图和仪表图
将画图封装为函数
# 训练Loss和Accdef show_train_laa(iters, loss, acc):
c = (
Line(init_opts=opts.InitOpts(width="512px", height="512px"))
.add_xaxis(xaxis_data=list(range(iters)))
.add_yaxis(
series_name="TRAIN_LOSS",
y_axis=list(loss),
label_opts=opts.LabelOpts(is_show=False),
yaxis_index=0,
color="#d14a61"
)
.add_yaxis(
series_name="TRAIN_ACC",
y_axis=list(acc),
label_opts=opts.LabelOpts(is_show=False),
yaxis_index=1,
color="#000000"
)
.extend_axis(
yaxis=opts.AxisOpts(
name="ACC",
type_="value",
position="right",
axisline_opts=opts.AxisLineOpts(
linestyle_opts=opts.LineStyleOpts(color="#d14a61")
),
)
)
.extend_axis(
yaxis=opts.AxisOpts(
name="LOSS",
type_="value",
position="left",
axisline_opts=opts.AxisLineOpts(
linestyle_opts=opts.LineStyleOpts(color="#000000")
),
)
)
.set_global_opts(
title_opts=opts.TitleOpts(title="TRAIN_STATE"),
tooltip_opts=opts.TooltipOpts(trigger="axis"),
xaxis_opts=opts.AxisOpts(type_="category", boundary_gap=False),
)
) return c# 评估Accdef show_eval_acc(eval_acc):
c = (
Gauge(init_opts=opts.InitOpts(width="512px", height="512px"))
.add("", [("", (100 * eval_acc))])
.set_global_opts(title_opts=opts.TitleOpts(title="EVAL_ACC"))
) return c使用虚构的数据进行测试显示,这里需要自己运行之后才能看到。还能交互哦~
iters = 9loss = [45, 14, 7.2, 5.4, 2.2, 1, 0.99, 0.95, 0.75] acc = [0.2, 0.41, 0.61, 0.66, 0.57, 0.68, 0.69, 0.71, 0.55] show_train_laa(iters, loss, acc).render_notebook() # 需要自己运行才能看到
<pyecharts.render.display.HTML at 0x7fb4c464e250>
eval_acc = 0.782show_eval_acc(eval_acc).render_notebook() # render_notebook可以在notebook环境显示
<pyecharts.render.display.HTML at 0x7fb4dcf69490>
在notebook环境好像不能实时刷新显示,于是只能在本地每次保存新的html,然后每隔一段时间刷新html,以达到实时显示的效果
# 刷新htmldef f5_html(html_path):
with open(html_path, 'a+') as f:
refesh = '<meta http-equiv="Refresh" content="3";/>' # 每3秒钟刷新一次
f.write(refesh)简单训练模型,没有调整训练参数,主要是为了查看训练过程
losses = []
acces = []for e in range(epoch_num): for i, (image, label) in enumerate(train_reader()):
out = model(image)
loss = cross_entropy(out, label)
avg_loss = paddle.mean(loss)
lab = paddle.reshape(label, (-1, 1)) # accuracy需要label是[*, 1]大小的
acc = accuracy(out, lab)
avg_loss.backward()
opt.minimize(avg_loss)
model.clear_gradients()
losses.append(float(loss.numpy()[0]))
acces.append(float(acc.numpy()[0]))
show_train_laa(len(losses), losses, acces).render('train.html') # 存入html
f5_html('train.html') # 刷新html
# print("[train] Epoch {} batch {}: loss = {} acc = {}".format(e, i, np.mean(loss.numpy()), acc.numpy()[0]))
if e % eval_epoch == 0 and i == ((50000 // batch_size) - 1):
eval_accs = [] for ee, (eimage, elabel) in enumerate(eval_reader()):
eout = model(eimage)
elab = paddle.reshape(elabel, (-1, 1))
eacc = accuracy(eout, elab).numpy()[0]
eval_accs.append(float(eacc)) # print("[Eval] batch {}: acc = {}".format(ee, eacc))
eval_acc = np.mean(eval_accs)
show_eval_acc(eval_acc).render('eval.html')
f5_html('eval.html')因为在notebook中不知道如何实时刷新数据,所以在本地3秒刷新一次html,实时显示训练过程(gif加速1000倍)
为了在1M一下,有点花,截图如下
以上就是使用pyecharts做自己的visualDL的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号