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

使用pyecharts做自己的visualDL
使用pyecharts,在本地训练的时候,可以实时刷新训练中的LOSS和ACC变化,做一个自己的visualDL
1. pyecharts引入
概况
Echarts 是一个由百度开源的数据可视化,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可。而 Python 是一门富有表达力的语言,很适合用于数据处理。当数据分析遇上数据可视化时,pyecharts 诞生了。
特性
简洁的 API 设计,使用如丝滑般流畅,支持链式调用囊括了 30+ 种常见图表,应有尽有支持主流 Notebook 环境,Jupyter Notebook 和 JupyterLab可轻松集成至 Flask,Django 等主流 Web 框架高度灵活的配置项,可轻松搭配出精美的图表详细的文档和示例,帮助开发者更快的上手项目多达 400+ 地图文件以及原生的百度地图,为地理数据可视化提供强有力的支持
参考:https://pyecharts.org/#/zh-cn/intro
In [1]
# 安装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')
2. 模型训练准备
主要使用paddle.vision里面的分类模型和数据
In [2]
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
2.1 配置训练参数
数据集的图像较小,在32G的GPU环境下,可以使用大的batch_size。这里我们训练10轮,每轮都评估一次
In [3]
# 配置batch_size = 2048learning_rate = 2e-6epoch_num = 10eval_epoch = 1 # 多少轮评估一次
2.2 准备数据、模型以及优化器
数据集为paddle.vision.datasets带的cifar10数据集
该数据集共有60000张彩色图像,这些图像是32*32,分为10个类,每类6000张图。这里面有50000张用于训练,构成了5个训练批,每一批10000张图;另外10000用于测试,单独构成一批。测试批的数据里,取自10类中的每一类,每一类随机取1000张。抽剩下的就随机排列组成了训练批。注意一个训练批中的各类图像并不一定数量相同,总的来看训练批,每一类都有5000张图
模型使用paddle.vision.models带的mobilenet_v2模型
MobileNetV2 基于 MobileNetV1的基本概念构建,并使用在深度上可分离的卷积作为高效的构建块。此外,MobileNetV2 引入了两种新的架构特性:1)层之间的线性瓶颈层;2)瓶颈层之间的连接捷径
优化器使用Adam优化器
Adam是一种自适应优化器,结合AdaGrad和RMSProp两种优化算法的优点。对梯度的一阶矩估计(梯度的均值)和二阶矩估计(梯度的未中心化的方差)进行综合考虑,计算出更新步长
In [4]
# 数据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 downloadDownload finished100%|██████████| 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)))
3. 可视化准备
具体pyecharts的使用可以参考官方文档,这里使用了折线图表示训练时的LOSS和ACC,用仪表盘表示评估的ACC
In [5]
from pyecharts import options as optsfrom pyecharts.charts import Line, Gauge # 折线图和仪表图
3.1 可视化函数定义
将画图封装为函数
In [6]
# 训练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
3.2 效果测试
使用虚构的数据进行测试显示,这里需要自己运行之后才能看到。还能交互哦~
In [7]
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() # 需要自己运行才能看到
In [8]
eval_acc = 0.782show_eval_acc(eval_acc).render_notebook() # render_notebook可以在notebook环境显示
3.3 刷新html
在notebook环境好像不能实时刷新显示,于是只能在本地每次保存新的html,然后每隔一段时间刷新html,以达到实时显示的效果
In [9]
# 刷新htmldef f5_html(html_path): with open(html_path, 'a+') as f: refesh = '' # 每3秒钟刷新一次 f.write(refesh)
4. 模型训练
简单训练模型,没有调整训练参数,主要是为了查看训练过程
In [ ]
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')
5. 本地结果
因为在notebook中不知道如何实时刷新数据,所以在本地3秒刷新一次html,实时显示训练过程(gif加速1000倍)
为了在1M一下,有点花,截图如下
以上就是使用pyecharts做自己的visualDL的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/42083.html
微信扫一扫
支付宝扫一扫