编者按:去年,FaceBook AI和Google AI分别发布了Pytorch1.0和TensorFlow2.0,这两大深度学习框架抉择问题又被抬出来了!之前Pytorch最被人诟病的就是可视化问题和部署问题,今天,我们来聊一聊Pytorch的训练可视化问题!
文章作者:Teddy Zhang
责任编辑:Teddy Zhang
文章发表于 微信公众号【运筹OR帷幄】: 【AI】精妙的Pytorch训练可视化工具tensorboardX
开源教程地址:
https://github.com/tensor-yu/PyTorch_Tutorial
Pytorch框架也有自己的可视化软件--Visdom,但是我用着不太习惯,感觉它的API也不太方便,参数设置过于复杂,而且可视化的功能性并不是太强,所以有人就写个库用来将Pytorch中的参数放到tensorboard上面进行可视化,十分方便!
tensorboadX
pip install tensorboardX
pip install tensorboard
pip install tensorflow
注意 :numpy的版本要对应,否则会报错,如果不匹配,那就进行更新或者新建虚拟环境了!作者的Pytorch1.0的环境都不能使用,所以就把tensorboard装到其他环境,不影响使用的~
在程序中设置可视化数据文件的路径,然后在其文件夹输入指令(. 表示本文件夹):
tensorboard --logdir=.
网络训练(Cifar10)
首先,我使用了非官方的代码对Cifar10进行训练,类似于ResNet, 由于Cifar10中的图片尺寸都很小,大约32x32,所以我们对传统的resnet进行了修改,其网络结构如下:
参考于官方的ResNet18并做如下修改:
● 由于像素太小,修改第一个卷积核步长为1,不进行下采样
● 修改通道,让通道变小些
● 删除layer4,不用再继续降采样了
然后进行模型训练,训练代码如下:
最后我们得到模型,精度为:0.78左右,没有一直进行训练,这无所谓!!
TensorBoardX可视化
参考了一开始的那个代码库,我把可视化的工作分成了如下几个:
卷积核的可视化feature map的可视化模型图的可视化标量变化情况的可视化权重的直方图的可视化(可以知道权重的数据分布)
那么,话不多说,我们来看看如何进行可视化的把,首先把tensorboardX导入并进行初始化:
第一个任务:标量可视化与权重直方图
这个权重直方图,非常的关键,特别是寻找模型训练loss出现的各种问题,由于我是在测试时画的图,所以只有一幅,但一般我们在训练阶段使用,用于寻找模型的问题~~
任务代码:
效果图:
第二个任务:feature map的可视化和卷积核的可视化
add_image(tag, img_tensor, global_step=None, walltime=None) 绘制图片
torchvision.utils.make_grid(tensor,nrow=8,padding=2, normalize=False, ra nge=None, scale_each=False, pad_value=0) 制作网格用于显示
我们把每个卷积层后的feature map来进行可视化,一共有4个卷积层,所以我们将 要绘制4个阶段的feature map,由于我们的模型已经训练好了,所以可视化出来的feature map可以很好地解释我们训练出来的模型到底是什么,每个卷积层提取的特征是什么?当然只能部分解释!!!
任务代码:
效果图:
(原图)
我们可以清晰的看到,在网络的底层,我们可以看到船的边缘特征,由于归一化了,所以色彩特征不太明显,当然也可以不进行归一化,但是layer3这种高层特征我们就能以解释了,它代表更多的是语义特征,很抽象!
卷积核的可视化与这个类似,其实质也就是权重可视化,代码如下:
效果图(conv层和layer 1层):
第三个任务:feature map的可视化和卷积核的可视化
这个不知道为什么,我使用Pytorch自带的网络模型就没有问题,但是自己定义的网络进行模型图显示就会出现一些莫名其妙的问题,有大佬知道的请告知原因啊!这里面我们使用ResNet18的结构来进行可视化,很简单,就一句话:
效果图:
总结
再次感谢首页大佬的开源教程,让我学到了很多,通过这些可视化的工作,我们就可以更好的去观测和调控这个模型的训练过程了!模型图可视化的问题,有人知道还请告知啊!