最近在工作之余搞搞Paddle,自己也实践了几个小case准备在工作中学以致用,今天本想把Paddle C++预测部署部分搞一搞,无意之间看到了VisualDL这个好玩意,具体这家伙能干啥大家百度就好,能搜到这篇文章的想必也是确有所需。
本文意在总结一下今天下午自己走过的一些弯路,让想在baidu AI Studio上直接用VisualDL的人用最快速的方式上手VisualDL。
目录
VisualDL For AI Studio 快速入门
1.导入依赖包 && 创建一个记录器
2.Step记步器初始化
3.获取训练全部参数
4.保存训练日志数据
5.visualdl访问URL
我们废话少说,直接上干货,看代码
# 导入VisualDL 记录器依赖包 from visualdl import LogWriter # 创建记录器 用于记录我们训练时候的一些数据,比如Loss Acc等 并存放在根目录下/log 文件夹中 log_writer = LogWriter(dir='log/', sync_cycle=10) # 创建训练记录数据工具 with log_writer.mode('train') as writer: train_cost_writer = writer.scalar('cost') train_acc_writer = writer.scalar('accuracy') histogram = writer.histogram('histogram', num_buckets=50) # 创建测试记录数据工具 with log_writer.mode('test') as writer: test_cost_writer = writer.scalar('cost') test_acc_writer = writer.scalar('accuracy') # 将训练过程绘图表示 def event_handler_plot(ploter_title, step, cost): cost_ploter.append(ploter_title, step, cost) cost_ploter.plot()
这段代码具体含义已添加注释,根据需要自行阅读。代码添加到train训练之前。
# 定义日志的开始位置和获取参数名称 train_step = 0 test_step = 0
初始化VisualDL日志时的计步器。通常放到训练for循环之前。步骤3中已展示相关代码的编写位置。
这一步并不是必须要做,但如果想看训练参数,则需要如下设置:
params_name = fluid.default_startup_program().global_block().all_parameters()[0].name
代码通常放到 exe.run(fluid.default_startup_program()) 之后。
特别注意这里params_name变量的用法,我们可以按照以下这种方式使用(红色字体为params_name 相关的使用,蓝色字体是为了使用VisualDL增加的代码部分):
.......
optimizer.minimize(avg_cost)
exe = fluid.Executor(place)main_program = fluid.default_main_program()
exe.run(fluid.default_startup_program())
load_params(exe, main_program)
#VisualDL
# 定义日志的开始位置和获取参数名称
train_step = 0
test_step = 0
params_name = fluid.default_startup_program().global_block().all_parameters()[0].name
train_fetch_list = [avg_cost.name, acc_top1.name, params_name]
# 训练循环主体
stop_strategy = train_parameters['early_stop']
successive_limit = stop_strategy['successive_limit']
sample_freq = stop_strategy['sample_frequency']
good_acc1 = stop_strategy['good_acc1']
successive_count = 0
stop_train = False
total_batch_count = 0
stepDisp=0
for pass_id in range(train_parameters["num_epochs"]):
list_acc_epoch = []
# logger.info("current pass: %d, start read image", pass_id)
batch_id = 0
for step_id, data in enumerate(batch_reader()):
t1 = time.time()
loss, acc1, pred_ot = exe.run(main_program,
feed=feeder.feed(data),
fetch_list=train_fetch_list)
# fetch_list=train_fetch_list
t2 = time.time()
# # 保存训练的日志数据
train_step += 1
train_cost_writer.add_record(train_step, loss)
train_acc_writer.add_record(train_step, acc1)
histogram.add_record(train_step, pred_ot.flatten())
...........
# # 保存训练的日志数据 train_step += 1 train_cost_writer.add_record(train_step, loss) train_acc_writer.add_record(train_step, acc1) histogram.add_record(train_step, pred_ot.flatten())
这四行的含义分别是:
1. VisualDL Step记步器每满足一次记录条件即+1。
2.在这一步中记录训练的Loss值。
3.在这一步中记录训练的Acc值。
4.在这一步中记录所有训练参数。
代码通常放到训练主体for循环内,步骤3已展示相关代码的编写位置。
PS.自己根据需要选择要不要记录Test时候的各项数据,与train时同理。我这里没有记录。
此时其实所有代码工作已完成。
对于一个初学者,这一步是我今天下午卡壳的地方,因为整个流程是参照夜大神的文章执行,他的最后一步是需要在训练结束后执行:
visualdl --logdir=log/ --port=8080
我自己傻傻地在AI Studio环境中的notebook里执行了半天,一直报错,最后恍然大悟,才明白过来这句应该是在终端运行,其实很简单,我们只需要在自己AI Studio相应的那个项目中修改一下网址即可。
只需要将自己项目路径中红框部分替换成 visualdl 即可。
终于,想要的东西能打开啦,而且手机上打开这个网址也可以实时监测训练状态。这玩意可玩性其实还挺高,能看到卷积图。有兴趣的同学深挖吧,下面链接中有本地如何安装VisualDL的教程和使用方法。
最后感谢夜雨飘零,附上他博客链接以及所有参考文档链接
https://blog.csdn.net/qq_33200967/article/details/86532831
https://ai.baidu.com/docs#/AIStudio_Project_Unit/top
http://visualdl.paddlepaddle.org/documentation/visualdl/zh/develop/getting_started/demo/paddle/TUTORIAL_CN.html