【深度学习】模型训练过程可视化思路(可视化工具TensorBoard)
【深度学习】模型训练过程可视化思路(可视化工具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,直接呈现结果。
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(r'E:\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), …
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
定位到目录层。
就到这啦~~!
注意箭头指向处都是可以个性化调节的。
- 分享
- 举报
-
浏览量:5651次2021-07-15 10:44:33
-
浏览量:7525次2021-01-15 12:04:13
-
浏览量:449次2023-09-19 17:48:26
-
浏览量:1321次2023-02-01 09:16:22
-
浏览量:5223次2021-07-05 09:54:53
-
浏览量:3291次2021-11-22 17:37:10
-
浏览量:6437次2021-07-16 15:35:37
-
浏览量:6070次2021-07-16 15:43:25
-
浏览量:8127次2021-01-07 16:07:41
-
浏览量:3046次2023-03-20 17:33:53
-
浏览量:1359次2023-06-30 14:48:51
-
浏览量:5082次2021-10-29 17:45:44
-
浏览量:775次2023-06-08 10:35:09
-
浏览量:36299次2021-05-19 16:24:16
-
浏览量:1587次2022-11-02 16:48:03
-
浏览量:1082次2023-10-19 10:55:39
-
浏览量:3309次2021-11-05 15:24:40
-
浏览量:2979次2023-03-16 10:59:43
-
浏览量:697次2023-10-13 15:30:27
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
这把我C
感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明