我最常用的是使用TensorBoard观察loss以及准确度曲线,在此基础版本里只进行这两类曲线的编写说明。
from torch.utils.tensorboard import SummaryWriter #导入必须的包
#创建runs/test目录
#这会在当前目录下创建runs/test目录,所有的内容都会写入此目录中
writer = SummaryWriter("runs/test")
只需要以上简单的两句即可完成tensorboard的初始化工作。
writer.add_scalar('val/loss',total_loss, epoch)
writer.add_scalar('val/accuracy',val_accurate,epoch)
第一个参数中的val代表验证集中的损失函数值(loss)图片和精度(accuracy)图像,第二个参数可理解为y轴值,第三个参数可理解为x轴值。最后得到的结果如下。
上图中的val即writer.add_scalar
中第一个参数中的'/'
前半部分,这个点击之后可以折叠显示。这种写法会让loss和accuracy曲线在同一行显示
而如下的写法
writer.add_scalar('val/loss',total_loss, epoch)
writer.add_scalar('train/accuracy', accuracy, epoch)
则说明loss和accuracy隶属两个不同的类,它们将分开显示如下
要使它们在同一行显示只需add_scalar
第一个参数中的'/'
符号前的值相同即可。
要将两个值写到一个图里,只需要将它们组成一个字典数据即可。如下
writer.add_scalars('train/loss_accuracy', {'loss':error,'accuracy':accuracy}, epoch)
定位到定义的run目录的同级目录下,使用
tensorboard --logdir=runs
运行tensorboard程序,待出现下图所示后即说明运行成功
按照要求在浏览器中输入地址即可。亦可采用--port
参数指定端口号。
当在docker中运行时还需要加上
--host
变量,它的值为hostname
命令的运行结果
即在docker中的tensorboard完整的启动命令如下(6028为docker内部的端口映射到宿主机的8000端口,此时在宿主机上应该用8000端口查看)。tensorboard --logdir=runs --port=6028 --host=$(hostname)
当在docker里要输入中文的时候发现都是乱码,原来是字符集的问题,当docker运行成功之后,使用
docker exec -it 你的docker窗口名字 env LANG=C.UTF-8 /bin/bash
即可进入docker并支持中文。然后再执行上述启动tensorboard的命令即可。
上面最后一步有个大问题,就是输入
docker exec
的那串命令之后,中文的问题解决了,但是却无法在外部使用浏览器连接。目前暂时的解决方法是
- 进入宿主机后使用
sudo docker start name
开启docker.- 使用
sudo docker attach name
进入docker.- 使用
tmux
开启一个终端,并使用这个终端运行tensorboard
。注意,此时是不支持中文的。- 直接断点Xshell连接。然后重新连接宿主机,使用
docker exec -it 你的docker窗口名字 env LANG=C.UTF-8 /bin/bash
命令激活中文。- 进入docker之后再运行
tmux
命令,此时和上一个tmux
不是同一个窗口。注意,此时是支持中文的。- 麻烦的就是在两个tmux窗格之间进行切换,一个支持中文用来中文输入,一个不支持中文用来运行tensorboard。
- (写给自己的)在上述问题的解决过程中,如果
tensorboard
连接不上,则需要完全关掉docker,并关闭宿主机的ssh连接,再重新连接上进行操作。- 真麻烦!!!!
- 忽然发现又不行了!到底咋回事???
此功能需要用到XShell,打开要连接的XShell的配置项,按照如下要求配置。
即把远程的6006(即运行tensorboard时通过–port指定或默认的端口号)端口映射到本地的6006端口。当XShell连接成功之后即可通过
http://localhost:6006/
看到具体数据。