首页 > 技术知识 > 正文

【深度学习】模型训练过程可视化思路(可视化工具TensorBoard)

文章目录 1 TensorBoard的工作原理 2 TensorFlow中生成log文件 3 启动TensorBoard,读取log文件 4 浏览器中启动TensorBoard 5 读取并导出Tensorboard中数据 6 图(GRAPH)数据可视化 7 补充 1 TensorBoard的工作原理

在TensorFlow的程序里将相关的events等以log的形式保存,在运行TensorBoard后自动加载log文件并以良好的图表呈现在web页面中。方便开发者查看训练过程和结果数据。

因此TensorBoard的使用过程分两步:

生成log 加载log、呈现数据

2 TensorFlow中生成log文件

例如利用tf api显示的保存log:

file_writer = tf.summary.FileWriter(./log_dir, sess.graph)

或者在keras中以callback的形式保存log:

model.fit_generator(datagen.flow(X_train, Y_train, batch_size=batch_size), epochs=epochs, validation_data=(X_val, Y_val), verbose=2, steps_per_epoch=X_train.shape[0] // batch_size, callbacks=[learning_rate_reduction, tf.keras.callbacks.TensorBoard(log_dir=./log_dir)]) 3 启动TensorBoard,读取log文件

需要注意,我的环境为Anaconda,因此需要再Anaconda Prompt中启动TensorBoard:

tensorboard –logdir=”C:\Users\loveunk\dl\tensorflow.keras.samples\log_dir\” 启动后会再terminal中提示你端口号:

TensorBoard 1.13.1 at http://localhost:6006 (Press CTRL+C to quit)

4 浏览器中启动TensorBoard

浏览器中打开如上的地址http://localhost:6006,直接呈现结果。 【深度学习】模型训练过程可视化思路(可视化工具TensorBoard)

5 读取并导出Tensorboard中数据

Tensorboard 方便而美丽,但是可远观不可亵玩有点不爽,还是数据落在自己手里比较踏实

可以方便地读取Tensorboard数据 上代码

from tensorboard.backend.event_processing import event_accumulator #加载日志数据 ea=event_accumulator.EventAccumulator(events.out.tfevents.1550994567.vvd-Inspiron-7557) ea.Reload() print(ea.scalars.Keys()) val_psnr=ea.scalars.Items(val_psnr) print(len(val_psnr)) print([(i.step,i.value) for i in val_psnr])

输出:

[val_loss, val_psnr, loss, psnr, lr] 29 [(0, 33.70820617675781), (1, 34.52505874633789), (2, 34.26629638671875), (3, 35.47195053100586), (4, 35.45940017700195), (5, 35.336708068847656), (6, 35.467647552490234), (7, 35.919857025146484), (8, 35.29727554321289), (9, 35.63655471801758), (10, 36.219871520996094), (11, 36.178646087646484), (12, 35.93777847290039), (13, 35.587406158447266), (14, 36.198944091796875), (15, 36.241966247558594), (16, 36.379913330078125), (17, 36.28306198120117), (18, 36.03053665161133), (19, 36.20806121826172), (20, 36.21710968017578), (21, 36.42262268066406), (22, 36.00306701660156), (23, 36.4374885559082), (24, 36.163787841796875), (25, 36.53673553466797), (26, 35.99557113647461), (27, 36.96220016479492), (28, 36.63676452636719)]

目前的问题是,使用keras的callback将日志数据(acc、loss、val_acc、val_loss)写入文件,然后使用Tensorboard在浏览器查看变化,现在打算读出相关数据,并自行绘图。 解决方案

from tensorboard.backend.event_processing import event_accumulator #加载日志数据 ea=event_accumulator.EventAccumulator(rE:\Code\lastExp\output\logs\pm_last\events.out.tfevents.1535713476.DESKTOP-KMHR70T) ea.Reload() print(ea.scalars.Keys()) val_acc=ea.scalars.Items(val_acc) print(len(val_acc)) print([(i.step,i.value) for i in val_acc]) import matplotlib.pyplot as plt fig=plt.figure(figsize=(6,4)) ax1=fig.add_subplot(111) val_acc=ea.scalars.Items(val_acc) ax1.plot([i.step for i in val_acc],[i.value for i in val_acc],label=val_acc) ax1.set_xlim(0) acc=ea.scalars.Items(acc) ax1.plot([i.step for i in acc],[i.value for i in acc],label=acc) ax1.set_xlabel(“step”) ax1.set_ylabel(“”) plt.legend(loc=lower right) plt.show()
<

输出如下:

[‘val_loss’, ‘val_acc’, ‘loss’, ‘acc’] 500 [(0, 0.34734734892845154), (1, 0.4454454481601715), (2, 0.42184367775917053), (3, 0.5355355143547058), …

【深度学习】模型训练过程可视化思路(可视化工具TensorBoard)1

6 图(GRAPH)数据可视化

这个可以用来可视化网络结构,不太涉及动态变化,所以甚至比标量可视化更加简单。直接用add_graph就可以完成,

需要注意的是,要定义输入的shape,类似于tf的placeholder。我们看一个官方栗子:

import torch import torchvision from torch.utils.tensorboard import SummaryWriter from torchvision import datasets, transforms # Writer will output to ./runs/ directory by default writer = SummaryWriter() transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))]) trainset = datasets.MNIST(mnist_train, train=True, download=True, transform=transform) trainloader = torch.utils.data.DataLoader(trainset, batch_size=64, shuffle=True) model = torchvision.models.resnet50(False) # Have ResNet model take in grayscale rather than RGB model.conv1 = torch.nn.Conv2d(1, 64, kernel_size=7, stride=2, padding=3, bias=False) images, labels = next(iter(trainloader)) grid = torchvision.utils.make_grid(images) writer.add_image(images, grid, 0) writer.add_graph(model, images) writer.close()

注意,上面的add_graph有2个输入参数,一个是模型,另一个就是类似于placeholder的东西,用来描述输入的shape。因为可视化网络结构的时候,后台会帮你计算出每一层feature map的尺寸,但这尺寸都与输入的shape有关。

7 补充

代码体中要做的事 首先导入tensorboard

from torch.utils.tensorboard import SummaryWriter

这里的SummaryWriter的作用就是,将数据以特定的格式存储到刚刚提到的那个文件夹中。

首先我们将其实例化

writer = SummaryWriter(./path/to/log) 这里传入的参数就是指向文件夹的路径,之后我们使用这个writer对象“拿出来”的任何数据都保存在这个路径之下。

这个对象包含多个方法,比如针对数值,我们可以调用

writer.add_scalar(tag, scalar_value, global_step=None, walltime=None) 这里的tag指定可视化时这个变量的名字,scalar_value是你要存的值,global_step可以理解为x轴坐标。

举一个简单的例子:

for epoch in range(100) mAP = eval(model) writer.add_scalar(mAP, mAP, epoch) 这样就会生成一个x轴跨度为100的折线图,y轴坐标代表着每一个epoch的mAP。这个折线图会保存在指定的路径下(但是现在还看不到)

同理,除了数值,我们可能还会想看到模型训练过程中的图像。

writer.add_image(tag, img_tensor, global_step=None, walltime=None, dataformats=CHW) writer.add_images(tag, img_tensor, global_step=None, walltime=None, dataformats=NCHW) 细节 1.变量归类 命名变量的时候可以使用形如

writer.add_scalar(loss/loss1, loss1, epoch) writer.add_scalar(loss/loss2, loss2, epoch) writer.add_scalar(loss/loss3, loss3, epoch) 的格式,这样3个loss就会被显示在同一个section。

2.同时显示多个折线图 假如使用了两种学习率去训练同一个网络,想要比较它们训练过程中的loss曲线,只需要将两个日志文件夹放到同一目录下,并在命令行运行

tensorboard –logdir=./path/to/the/root –port 8123

定位到目录层。 就到这啦~~! 【深度学习】模型训练过程可视化思路(可视化工具TensorBoard)2 注意箭头指向处都是可以个性化调节的。

猜你喜欢