7.TensorBoard的使用(一)

TensorBoard简介

TensorBoard是Google开发的一个机器学习可视化工具。其主要用于记录机器学习过程,例如:

  • 记录损失变化、准确率变化
  • 记录图片变化、语音变化、文本变化等,例如在做GAN时,可以过一段时间记录一张生成的图片
  • 绘制模型

学 TensorBoard 目的:

  • 训练过程中loss是如何变化的
  • 模型在不同阶段的输出

会使用到的两个函数:

  • add_scalar() 的使用 (常用来绘制 train/val loss)
  • add_image() 的使用 (常用来观察训练结果)

1.SummaryWriter类

在pycharm里面创建一个名为test_tb的python文件,导入TensorBoard中的类 SummaryWriter :

from torch.utils.tensorboard import SummaryWriter

在这里插入图片描述

前面我们查看一个类如何使用是通过jupyter里运行help函数来完成的,PyCharm里可以使用另一种方法。

PyCharm查看一个类如何使用(功能):在PyCharm中,按住Ctrl键,把鼠标移到类SummaryWriter上,点击自动跳转。

image-20240506000554671

可以看到对SummaryWriter类的介绍,是一个直接向 log_dir 文件夹写入的事件文件,可以被 TensorBoard 进行解析

初始化函数:

def __init__(self, log_dir=None):

image-20240506001351412

image-20240506001827843

实例化SummaryWriter类

writer = SummaryWriter("logs")   # 创建一个实例,把对应的事件文件存储到logs文件夹下

用到的两个方法:

writer.add_image()  #添加image
writer.add_scalar() #添加数

writer.close()

image-20240508152213862

add_scalar() 方法的使用

同样的办法,按住Ctrl键,把鼠标移到add_scalar()方法上,点击自动跳转,可以查看add_scalar() 方法的使用

def add_scalar(
        self,
        tag,
        scalar_value,
        global_step=None,
        walltime=None,
        new_style=False,
        double_precision=False,
    ):

添加一个标量数据到 Summary 当中,需要参数

  • tag**:**Data指定方式,类似于图表的title
  • scalar_value**:**需要保存的数值(y轴)
  • global_step**:**训练到多少步(x轴)

add_scalar使用及其参数解释

绘图: writer.add_scalar(参数1,参数2,参数3)

  • 第一个参数:生成图像的名称
  • 第二个参数:X轴的值
  • 第三个参数:Y轴的值
image-20240508152612750
例:y=x
from torch.utils.tensorboard import SummaryWriter   #导入SummaryWriter类
 
#创建实例
writer=SummaryWriter("logs")   #把对应的事件文件存储到logs文件夹下
 
#两个方法
# writer.add_image()
# y=x
for i in range(100):
    writer.add_scalar("y=x",i,i)
 
writer.close()

运行失败,提示缺少TensorBoard模块,所以要先安装一下

image-20240508153029176

安装TensorBoard

在 Anaconda 命令行中激活 pytorch 环境,或直接在 PyCharm 的 Terminal 的 pytorch 环境中安装

对于Python 3.x,输入:

pip3 install tensorboard

对于Python 2.x,输入:

pip install tensorboard

如果你使用的是conda环境,可以使用以下命令来安装:

conda install -c conda-forge tensorboard

这里我使用前两种方法都报错了,所以又试了第三种方法,安装成功了

image-20240508153901873

重新运行python文件,又报错了,元类冲突,这个问题可能是由于TensorBoard与Python 3.6中的元类(metaclass)实现不兼容引起的,更新或降级特定的依赖关系可以解决元类冲突。我们需要Tensorflow 1.x版本,Tensorflow 1.15版本可用于64-bit Python 3.6的Windows

image-20240508154608915

先把之前下载的TensorBoard移除掉

conda remove tensorboard

image-20240508161245786

Anaconda默认使用的是官方镜像源,下载Tensorflow太慢了,更换镜像。Anaconda镜像配置 http://t.csdnimg.cn/rk2Ly

对于Tensorflow1.15 及更早版本,CPU 和 GPU 软件包是分开的:

pip install tensorflow==1.15      # CPU
pip install tensorflow-gpu==1.15  # GPU

这里选择第二个命令,重新安装:

image-20240508161512559

然后安装tensorboard

pip install tensorboard 

再次运行python文件,可以生成log文件夹,里面是TensorBoard的一些事件文件, 但是控制台提示TensorFlow调试过程中出现的问题,根据提示:缺少cudart64_100.dll文件, 警告就是没事,可以不管它,但我们还是处理一下。

image-20240508164312751

image-20240508164212245

先去网站下载cudart64_100.dll:https://www.dll-files.com/cudart64_100.dll.html

下载好了之后就要将这个文件放到CUDA的安装目录下,一般在这里:

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin

如果有的话,把下载的cudart64_101.dll文件直接放里面,重启一下就好了。
下面是没有这个目录时候的解决方法,很简单,直接把文件放到你运行程序的虚拟环境的根目录就可以了,
比如,我当前程序用的环境是pytorch,直接在Anaconda里面的env里面找到pytorch,把文件放进去,程序在加载的时候就可以找到了。
image-20240508165759176

重新运行python文件,可以看到提示,这条信息不是一个错误,而是一个通知,表明成功加载了动态链接库文件 cudart64_100.dll

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

打开事件文件

在 Terminal 里输入:

tensorboard --logdir=logs  # logdir=事件文件所在文件夹名

结果如下:

image-20240508170804681

点击链接:

image-20240508170818507

为了防止和别人冲突(一台服务器上有好几个人训练,默认打开的都是6006端口),也可以指定端口,命令如下:

tensorboard --logdir=logs --port=6007

image-20240508171229307

例:y=2x
image-20240508172257618

image-20240508172337968

运行test_tb.py,然后刷新一下浏览器

image-20240508172515662

可以看到x轴等于100的时候,y轴等于200

title 和 y 不一致的情况

让title为y=2x,Y轴实际是3x

image-20240508172944066

重新运行一下文件,刷新浏览器看看

image-20240508173652717

说明每向 writer 中写入新的事件,也记录了上一个事件

解决办法

把logs文件夹下的所有文件删掉,程序删掉,重新开始

或者重新写一个子文件,即创建新的 SummaryWriter(“新文件夹”)

删掉logs下的文件,重新运行代码,在 Terminal 里按 Ctrl+C ,再输入命令:

tensorboard --logdir=logs --port=6007

就可以出现名字为y=2x,但实际纵坐标是y=3x数值的图像

以上即是显示 train_loss 的一个方式

建新的 SummaryWriter(“新文件夹”)

删掉logs下的文件,重新运行代码,在 Terminal 里按 Ctrl+C ,再输入命令:

tensorboard --logdir=logs --port=6007

就可以出现名字为y=2x,但实际纵坐标是y=3x数值的图像

以上即是显示 train_loss 的一个方式

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐