一、认识Tensorboard
TensorBoard 是一个由 TensorFlow 提供的可视化工具,它可以帮助用户理解、调试和优化机器学习模型。TensorBoard 能够展示模型的训练过程,包括但不限于以下几个方面:
-
标量值(Scalars):展示训练和验证过程中的损失值、准确率等指标随时间的变化。
-
图像(Images):可视化网络层的激活图、输入数据的样本等。
-
直方图(Histograms):展示网络参数(如权重和偏置)的分布情况。
-
嵌入(Embeddings):将高维数据降维到二维或三维空间,以便可视化。
-
图(Graphs):展示模型的计算图,包括网络结构和操作。
TensorBoard 是一个由 TensorFlow 提供的开源工具套件,用于在训练机器学习模型期间进行数据可视化。TensorBoard 通过读取 TensorFlow 的事件文件来运行,这些文件包含了在 TensorFlow 运行中涉及到的主要数据。用户可以通过创建 TensorFlow 图和选择汇总点来生成汇总数据,然后使用 tf.train.SummaryWriter 将数据写入磁盘。启动 TensorBoard 后,可以通过浏览器访问 localhost:6006 查看可视化结果。
二、认识 add_scalar()
add_scalar 方法是 TensorBoard 的 SummaryWriter 类的一个方法,用于记录标量数据。这些数据通常用于追踪模型训练过程中的指标,如损失值、准确率等。下面是 add_scalar 方法的一些关键参数和它们的用途:
tag: 这是一个字符串,用于标识记录的数据。就是名称。在 TensorBoard 中,相同的 tag 会被归类到一起,以便进行比较和分析。
scalar_value: 这是要记录的实际标量值。它可以是任何数值,通常表示某个度量指标。如上图显示的纵坐标。
global_step: 这是一个可选参数,表示当前的全局步数或迭代次数。它用于在 TensorBoard 中绘制数据时,将数据点与训练过程中的特定步骤相关联。通常,这个值会在每次训练迭代后增加。如上图显示的横坐标。
对代码行进行注释的方法是: Ctrl + /
示例代码:
from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter("logs")
for i in range(100):
# y = x就是tag,两个i分别是scalar_value和global_step
writer.add_scalar("y = x", i, i)
writer.close()
代码注释:
# 从torch.utils.tensorboard模块导入SummaryWriter类
from torch.utils.tensorboard import SummaryWriter
# 创建一个SummaryWriter对象,它负责将数据写入TensorBoard日志文件
# "logs"是日志文件的保存目录
writer = SummaryWriter("logs")
# 这里是一个示例调用,用于添加图像数据到TensorBoard
# 由于没有具体的图像数据,这里只是显示了函数的调用方式
# writer.add_image(tag, global_step=None, walltime=None, data=None)
# 开始一个循环,用于模拟训练过程,这里循环100次
for i in range(100):
# 使用add_scalar方法向TensorBoard添加标量数据
# "y = x"是数据的标签,用于在TensorBoard中标识这些数据
# i是当前的全局步数(global_step),通常用于表示训练过程中的迭代次数
# i也是我们添加的标量数据的值,这里简单地使用i作为示例
writer.add_scalar("y = x", i, i)
# 完成数据记录后,关闭SummaryWriter对象
# 这是必须的,以确保所有数据都被正确地写入到日志文件中
writer.close()
在terminal终端中输入:logdir = 文件名
tensorboard --logdir = logs
回车生成:
点击连接即可生成在线表格图:
注意:如果出现多条不同线段(如下图),解决办法通常是把pycharm左边的logs文件夹中的所有文件给删除掉。
解决方法:把logs下的文件全部删除
三、add_image()的使用
代码:
from PIL import Image
img = Image.open(image_path)
print(type(img))
import numpy as np
img_array = np.array(img)
print(type(img_array))
对上面代码进行逐行分析:
def add_image(self, tag, img_tensor, global_step=None, walltime=None, dataformats="CHW"):
- tag表示图像的标题
- global_step表示训练步骤,通常是int形
- 其他数据一般不用管
- img_tensor是图像的数据类型,往往有以下的 torch.Tensor, numpy.ndarray, or string/blobname类型。
img_tensor (torch.Tensor, numpy.ndarray, or string/blobname): Image data
四、Image模块
from PIL import Image
Image模块功能有:【图像打开和保存】、【图像操作:包括图像的旋转、翻转、缩放、裁剪等】、【图像合成:可以将多个图像合成在一起,创建复杂的图像效果】、【文件格式支持:支持多种图像文件格式,如 JPEG、PNG、GIF、TIFF 等】【颜色转换:支持不同颜色模式之间的转换,如从 RGB 转换到 CMYK】
查看Image.open()打开图片的格式:
from PIL import Image
img = Image.open(image_path)
print(type(img))
输出结果:
发现该类型不满足img_tensor的图像数据类型。
该代码是将img的PIL形转换为numpy形,在赋值给img_array
import numpy as np
img_array = np.array(img)
print(type(img_array))
结果:
可以看到成功转换成numpy.ndarray形。
从PIL到numpy,需要在add_image()中指定shape中每一个数字/维表示的含义
最终代码:
from torch.utils.tensorboard import SummaryWriter
import numpy as np
from PIL import Image
writer = SummaryWriter("logs")
image_path = "Dataset/train/ants/0013035.jpg"
img_PIL = Image.open(image_path)
img_array = np.array(img_PIL)
print(type(img_array))
print(img_array.shape)
writer.add_image("test",img_array,1,dataformats='HWC')