使用TensorBoard进行数据记录与可视化
TensorBoard是一个强大的工具,用于可视化神经网络训练过程中的各种指标,帮助开发者监控模型训练,分析性能并做出相应的调整。
绘制函数
初始化TensorBoard
首先,我们需要引入必要的库并创建一个SummaryWriter
实例。这个实例将用于记录数据,数据会被保存在指定的目录下,这里是"logs"
目录,所以等全部代码完成并运行后,可以在logs这个文件中找到我们创建的图像对应的文件,如何打开这个文件呢?在后面有叙述。
from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter("logs")
记录标量数据
在训练过程中,我们经常需要跟踪诸如损失值、准确率等标量数据的变化。这可以通过SummaryWriter
的add_scalar
方法来实现。我们模拟了一个简单的场景,将函数y=2x
的值随着迭代次数的增加而记录下来。
for i in range(100):
writer.add_scalar('y=2x', 2*i, i)
'y=2x'
是标签名,表示我们正在记录的数据类型或实验名称。2*i
表示每次迭代计算的值,模拟为损失值或其他标量指标,也就是图中的y。i
是迭代次数,作为每个点在图表上的x轴位置。
关闭SummaryWriter
完成所有记录任务后,调用writer.close()
确保所有数据都被正确地写入磁盘,并且释放了SummaryWriter
占用的资源。这一步骤是非常重要的,特别是在记录大量数据或进行长时间运行的训练时。
writer.close()
使用TensorBoard查看数据
一旦数据被记录并保存,我们可以使用TensorBoard来可视化这些数据。在终端中,运行以下命令来启动TensorBoard,并指定日志文件的位置:
tensorboard --logdir=logs
完整代码:
from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter("logs")
for i in range(100):
writer.add_scalar('y=2x',2*i,i)
#关于这些参数代表的什么,可以通过文章末尾的链接查看官方文档,里面会有写。
writer.close()
读取图片
读取和处理图像数据
接下来,读取一个图像文件,将其转换为适合记录到TensorBoard的格式。这个过程分为两步:
-
读取图像:使用Pillow库(PIL)读取图像文件。这里,
Image.open(image_path)
返回一个PILImage
对象,它提供了丰富的图像处理功能,下面这段代码就是先获取一个图片的地址,然后通过这个地址访问图片,得到图片的数据。image_path = "data/train/ants_image/0013035.jpg" #注意,要记录对应图片的相对地址 img_PIL = Image.open(image_path)
-
转换为NumPy数组:将PIL
Image
对象转换成NumPy数组。这是因为TensorBoard期望图像数据以NumPy数组的形式提供。转换后的数组img_array
保留了图像的像素数据,但以NumPy数组的形式表示,便于进行数值操作和分析,简单点说,就是后面的add.image函数需要numpy类型的数据img_array = np.array(img_PIL)
记录图像到TensorBoard
最后,使用writer.add_image
方法将图像数据记录到TensorBoard。这个方法允许指定图像的标签、图像数据本身、记录的步骤(epoch或迭代次数),以及数据的格式。
- “test”:图像的标签,在TensorBoard中用于识别图像。
- img_array:图像数据,以NumPy数组的形式提供。
- 1:图像记录的步骤。这个值用于在TensorBoard中跟踪图像随训练过程的变化,如果不懂这个的作用,可以试着再添加一个图片,并且将新图片的step设成2,看看效果。
- dataformats=‘HWC’:指明图像数据的格式。这里
HWC
代表图像的高度(Height)、宽度(Width)和颜色通道数(Channels),这是TensorBoard解析图像数据的标准格式。
writer.add_image("test", img_array, 1, dataformats='HWC')
但不知道为什么,只有添加下面这段代码后才能出现图像,等未来再完善这篇文章吧
for i in range(100):
writer.add_scalar("y=x",3*i,i)
writer.close()
完整代码:
from torch.utils.tensorboard import SummaryWriter
from PIL import Image
import numpy as np
writer = SummaryWriter("logs")
image_path = "data/train/ants_image/0013035.jpg"
img_PIL = Image.open(image_path)
img_array = np.array(img_PIL)
writer.add_image("test",img_array,1,dataformats='HWC')
for i in range(100):
writer.add_scalar("y=x",3*i,i)
writer.close()
总结和实战
from torch.utils.tensorboard import SummaryWriter
import numpy as np
from PIL import Image
writer = SummaryWriter("logs")
img_path = "data/train/ants_image/20935278_9190345f6b.jpg"
img_PIL = Image.open(img_path)
img_0 = np.array(img_PIL)
writer.add_image("test",img_0,1,dataformats='HWC')
img_PPIL = Image.open("data/train/ants_image/49375974_e28ba6f17e.jpg")
img_1 = np.array(img_PPIL)
writer.add_image("test",img_1,2,dataformats='HWC')
for i in range(100):
writer.add_scalar("loss/wad",2*i,i)
writer.close()
官方文档:https://pytorch.org/docs/stable/tensorboard.html#module-torch.utils.tensorboard
https://pillow.readthedocs.io/en/stable/reference/Image.html