基于深度学习PaddlePaddle可视化工具VisualDL

引言:

当使用PaddlePaddle训练大量深层的 神经网络时,开发者希望跟踪整个神经训练过程的信息,例如loss的变化趋势,迭代过程中 参数的变化、分布及背后的原因、模型的网络结构等。PaddlePaddle推出的可视化工具VisualDL,只需要以下两个简单步骤,即可更好的调试和优化 神经网络的训练过程:

  • 调用Paddle Fluid的模型接口save_inference_model进行模型保存

  • 使用VisualDL提供的命令行工具加载模型,在浏览器中访问

具体应用方式,请听小编为你详细解读:

工具简介

VisualDL由 百度PaddlePaddle团队研发,是一个面向 深度学习任务设计的可视化工具,与PaddlePaddle一样,VisualDL原生支持Python的使用, 只需要在模型中增加少量的代码,对VisualDL接口进行调用,便可以为训练过程提供丰富的可视化支持。除了PythonSDK之外,VisualDL底层采用C++编写,其暴露的C++ SDK也可以集成到其他框架中使用, 实现原生的性能和定制效果。用户也可以通过对C++SDK进行封装,提供其他脚本语言的SDK。

组件功能

VisualDL 目前支持以下可视化组件:

  • scalar

  • histogram

  • image

  • audio

  • text

  • graph

  • high dimensional

scalars

用于记录和展示过程中的指标趋势,如 准确率或者训练损失,以便观察损失是否正常 收敛,又或者用于不同超 参数下模型的性能对比等 

histogram

用于可视化任何tensor中数值的变化趋势,例如,可以用于记录 参数在训练过程中的分布变化趋势,分析 参数是否正常训练,有无异常值,分布是否符合预期等 

image

可用于查看输入或生成的图片样本,辅助开发者定位问题

audio

可用于播放输入或生成的音频样本,辅助开发者定位问题 

text

用于可视化输入或者模型处理完成的文本样本,辅助开发者定位问题 

graph

用于可视化模型的网络结构。可帮助分析模型结构是否符合预期 

目前VisualDL支持ONNX和Paddle program两种格式的模型文件。对于使用Pytorch/ MXNet等框架的用户,可以将模型结构转为ONNX格式后使用VisualDL展示。而对于PaddlePaddle模型文件的展示,VisualDL则支持直接展示。用户只需要进行以下两步操作,即可查看搭建的paddle网络结构是否正确 :

1. 在paddle代码中,调用fluid.io.save_inference_model()接口保存模型
2. 在命令行界面,使用visualdl --model_pb [paddle_model_dir] 加载paddle模型,接着就能在浏览器上查看模型结构图

high dimensional

用于将embedding数据 映射到二维/三维展示,从而使数据更加直观,便于开发者理解和分析。例如在文本领域,可以用于分析 深度学习与词或者句子的语义建模是否合理。

目前该组件支持PCA/T-SNE两种 降维方式 

快速体验

开发者如果想要快速体验一下此工具,可以使用下面的命令进行试用

# 安装VisualDL,建议使用anaconda或者virtualenv等环境下

pip install --upgrade visualdl

# vdl_create_scratch_log将会自动生成一份测试的log

vdl_create_scratch_log

# 在localhost:8080上启动一个visualdl服务,该服务加载scratch_log目录中的日志进行展示 

visualdl --logdir=scratch_log --model_pb scratch_log/mnist_model.onnx --port=8080

# 访问 http://127.0.0.1:8080

工具安装

VisualDL支持windows/linux/mac等主流平台的安装使用,用户可以通过pip直接进行安装

  pip install visualdl

工具使用

VisualDL的使用流程归纳为以下两步: 

1. 在模型文件中,调用VisualDL SDK提供的接口,记录日志
2. 使用VisualDL提供的命令行工具,加载日志,在浏览器中查看

为了保证高效的性能,VisualDL 使用了C++实现了日志数据的记录和读取。除了C++ SDK之外,VisualDL同时提供了基于C++ SDK进行封装的Python SDK,用户也可以根据自己的需求,对C++ SDK进行封装,以支持其他语言的SDK。

下面给出Python SDK的使用示例

pythonSDK

下面我们结合PaddlePaddle和VisualDL,以mnist手写数字识别为例,给大家展示下用法:

1.  先导入必要的包

import paddle

import paddle.fluid as fluid 

from visualdl import LogWriter

2.  定义一个函数,用于构建 LeNet-5网络

# 构建一个LeNet-5网络

def lenet_5(img, label):

      conv1 = fluid.nets.simple_img_conv_pool(

          input=img,

filter_size=5,

          num_filters=20,

pool_size=2,

pool_stride=2,

act="relu")

conv1_bn = fluid.layers.batch_norm(input=conv1)

conv2 = fluid.nets.simple_img_conv_pool(

input=conv1_bn,

filter_size=5,

num_filters=50,

          pool_size=2,

pool_stride=2,

act="relu")

predition = fluid.layers.fc(input=conv2, size=10, act="softmax", param_attr = "fc_w") cost = fluid.layers.cross_entropy(input=predition, label=label)

avg_cost = fluid.layers.mean(cost)

acc = fluid.layers.accuracy(input=predition, label=label)

return avg_cost, acc

3.  定义img和label,构建网络

img = fluid.layers.data(name="img", shape=[1, 28, 28], dtype="float32")

label = fluid.layers.data(name="label", shape=[1], dtype="int64")

avg_cost, acc = lenet_5(img, label)

4.  获取mnist数据集

  train_reader = paddle.batch(paddle.dataset.mnist.train(), batch_size=64)

5.  选择优化器,添加反向图

optimizer = fluid.optimizer.Adam(learning_rate=0.001)

optimizer.minimize(avg_cost)

6.  设置运行环境

  place = fluid.CPUPlace()  feeder = fluid.DataFeeder(feed_list=[img, label], place=place)  exe = fluid.Executor(place)

7.  添加visualdl组件

log_writter = LogWriter("./vdl_log", sync_cycle=10)

with log_writter.mode("train") as logger:

# 分别用两个scalar来记录loss和accuracy的趋势

scalar_loss = logger.scalar(tag="loss")

scalar_accuracy = logger.scalar(tag="accuracy")

# 用histogram来记录fc层的参数分布变化趋势

histogram = logger.histogram(tag="histogram", num_buckets=50)

8.  初始化 参数

exe.run(fluid.default_startup_program())

step = 0

  epochs = 5

param_name = "fc_w"

9.  开始训练

for i in range(epochs):

for batch in train_reader():

cost, accuracy, param = exe.run(

feed=feeder.feed(batch),

fetch_list=[avg_cost.name, acc.name, param_name])

step += 1

# 将数据写入记录中

scalar_loss.add_record(step, cost)

scalar_accuracy.add_record(step, accuracy)

histogram.add_record(step, param.flatten())

print("epoch %d: step %d, acc is %.2f%% and loss is %.2f" % (i, step, accuracy * 100, cost))

  # 保存模型到model_save目录中,接着可以用visualdl --model_pb model_save来加载该模型      fluid.io.save_inference_model(dirname = "model_save", feeded_var_names = [img.name], target_vars = [avg_cost, acc], executor = exe)

10.训练完成后,执行下面的命令,通过命令行启动VisualDL服务

 visualdl --logdir "vdl_log" --model_pb "model_save"

11.在浏览器打开localhost:8040,选择METRICS查看accuracy和loss的变化趋势

12.切换GRAPHS,查看模型结构图

更多 参数

在执行完上述演示后,通过命令行启动VisualDL服务

visualdl --logdir "vdl_log" --model_pb "model_save"




board还支持以下 参数

--host 设定IP

--port 设定端口

-m / --model_pb 指定 ONNX 格式的模型文件或者paddle模型文件

-L / --language 指定界面使用的语言,目前支持en和zh两种,默认为en

举个例子,使用下述命令,将在192.168.0.2:8888上启动一个VisualDL的服务,前端页面以中文展示(注意,这里的192.168.0.2只是示例,实际使用过程要换为实际ip)  

visualdl --logdir "vdl_log" --model_pb "model_save" --host 192.168.0.2 --port 8888 --language zh




详细的选项内容,可以通过以下命令查看

visualdl -h

如果想在线体验, 可以在Baidu AI Studio上遵照示例工程的步骤, 运行并观察效果:

http://aistudio.baidu.com/aistudio/#/projectDetail/35249

进入后fork这个项目, 点击运行项目即可. 无需准备任何代码或环境配置.

总结:

VisualDL作为 深度学习的可视化工具,具有功能全面、易集成、易使用等优势,引用一位用户的评价:“像玩具一样易用,像工具一样有用”。随着版本的开发,我们会不断优化已有的功能,同时会加入更多与PaddlePaddle深度结合的功能,敬请期待~

更多了解,请登录:

https://github.com/PaddlePaddle/VisualDL

PaddlePaddle
PaddlePaddle

PaddlePaddle是百度独立研发的深度学习平台,易用,高效,灵活可伸缩,可支持海量图像识别分类、机器翻译和自动驾驶等多个领域业务需求,现已全面开源。

工程深度学习PaddlePaddleVisualDL
2
相关数据
深度学习技术

深度学习(deep learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。 深度学习是机器学习中一种基于对数据进行表征学习的算法,至今已有数种深度学习框架,如卷积神经网络和深度置信网络和递归神经网络等已被应用在计算机视觉、语音识别、自然语言处理、音频识别与生物信息学等领域并获取了极好的效果。

参数技术

在数学和统计学裡,参数(英语:parameter)是使用通用变量来建立函数和变量之间关系(当这种关系很难用方程来阐述时)的一个数量。

收敛技术

在数学,计算机科学和逻辑学中,收敛指的是不同的变换序列在有限的时间内达到一个结论(变换终止),并且得出的结论是独立于达到它的路径(他们是融合的)。 通俗来说,收敛通常是指在训练期间达到的一种状态,即经过一定次数的迭代之后,训练损失和验证损失在每次迭代中的变化都非常小或根本没有变化。也就是说,如果采用当前数据进行额外的训练将无法改进模型,模型即达到收敛状态。在深度学习中,损失值有时会在最终下降之前的多次迭代中保持不变或几乎保持不变,暂时形成收敛的假象。

超参数技术

在机器学习中,超参数是在学习过程开始之前设置其值的参数。 相反,其他参数的值是通过训练得出的。 不同的模型训练算法需要不同的超参数,一些简单的算法(如普通最小二乘回归)不需要。 给定这些超参数,训练算法从数据中学习参数。相同种类的机器学习模型可能需要不同的超参数来适应不同的数据模式,并且必须对其进行调整以便模型能够最优地解决机器学习问题。 在实际应用中一般需要对超参数进行优化,以找到一个超参数元组(tuple),由这些超参数元组形成一个最优化模型,该模型可以将在给定的独立数据上预定义的损失函数最小化。

LeNet技术

LeNet 诞生于 1994 年,是最早的卷积神经网络之一,并且推动了深度学习领域的发展。自从 1988 年开始,在许多次成功的迭代后,这项由 Yann LeCun 完成的开拓性成果被命名为 LeNet5。LeNet5 的架构基于这样的观点:(尤其是)图像的特征分布在整张图像上,以及带有可学习参数的卷积是一种用少量参数在多个位置上提取相似特征的有效方式。在那时候,没有 GPU 帮助训练,甚至 CPU 的速度也很慢。因此,能够保存参数以及计算过程是一个关键进展。这和将每个像素用作一个大型多层神经网络的单独输入相反。LeNet5 阐述了那些像素不应该被使用在第一层,因为图像具有很强的空间相关性,而使用图像中独立的像素作为不同的输入特征则利用不到这些相关性。

神经网络技术

(人工)神经网络是一种起源于 20 世纪 50 年代的监督式机器学习模型,那时候研究者构想了「感知器(perceptron)」的想法。这一领域的研究者通常被称为「联结主义者(Connectionist)」,因为这种模型模拟了人脑的功能。神经网络模型通常是通过反向传播算法应用梯度下降训练的。目前神经网络有两大主要类型,它们都是前馈神经网络:卷积神经网络(CNN)和循环神经网络(RNN),其中 RNN 又包含长短期记忆(LSTM)、门控循环单元(GRU)等等。深度学习是一种主要应用于神经网络帮助其取得更好结果的技术。尽管神经网络主要用于监督学习,但也有一些为无监督学习设计的变体,比如自动编码器和生成对抗网络(GAN)。

准确率技术

分类模型的正确预测所占的比例。在多类别分类中,准确率的定义为:正确的预测数/样本总数。 在二元分类中,准确率的定义为:(真正例数+真负例数)/样本总数

映射技术

映射指的是具有某种特殊结构的函数,或泛指类函数思想的范畴论中的态射。 逻辑和图论中也有一些不太常规的用法。其数学定义为:两个非空集合A与B间存在着对应关系f,而且对于A中的每一个元素x,B中总有有唯一的一个元素y与它对应,就这种对应为从A到B的映射,记作f:A→B。其中,y称为元素x在映射f下的象,记作:y=f(x)。x称为y关于映射f的原象*。*集合A中所有元素的象的集合称为映射f的值域,记作f(A)。同样的,在机器学习中,映射就是输入与输出之间的对应关系。

降维技术

降维算法是将 p+1 个系数的问题简化为 M+1 个系数的问题,其中 M<p。算法执行包括计算变量的 M 个不同线性组合或投射(projection)。然后这 M 个投射作为预测器通过最小二乘法拟合一个线性回归模型。两个主要的方法是主成分回归(principal component regression)和偏最小二乘法(partial least squares)。

MXNet技术

MXNet是开源的,用来训练部署深层神经网络的深度学习框架。它是可扩展的,允许快速模型训练,并灵活支持多种语言(C ++,Python,Julia,Matlab,JavaScript, Go,R,Scala,Perl,Wolfram语言)

优化器技术

优化器基类提供了计算梯度loss的方法,并可以将梯度应用于变量。优化器里包含了实现了经典的优化算法,如梯度下降和Adagrad。 优化器是提供了一个可以使用各种优化算法的接口,可以让用户直接调用一些经典的优化算法,如梯度下降法等等。优化器(optimizers)类的基类。这个类定义了在训练模型的时候添加一个操作的API。用户基本上不会直接使用这个类,但是你会用到他的子类比如GradientDescentOptimizer, AdagradOptimizer, MomentumOptimizer(tensorflow下的优化器包)等等这些算法。

百度机构

百度(纳斯达克:BIDU),全球最大的中文搜索引擎、最大的中文网站。1999年底,身在美国硅谷的李彦宏看到了中国互联网及中文搜索引擎服务的巨大发展潜力,抱着技术改变世界的梦想,他毅然辞掉硅谷的高薪工作,携搜索引擎专利技术,于 2000年1月1日在中关村创建了百度公司。 “百度”二字,来自于八百年前南宋词人辛弃疾的一句词:众里寻他千百度。这句话描述了词人对理想的执着追求。 百度拥有数万名研发工程师,这是中国乃至全球最为优秀的技术团队。这支队伍掌握着世界上最为先进的搜索引擎技术,使百度成为中国掌握世界尖端科学核心技术的中国高科技企业,也使中国成为美国、俄罗斯、和韩国之外,全球仅有的4个拥有搜索引擎核心技术的国家之一。

推荐文章
暂无评论
暂无评论~