学习笔记_Transforms

Transforms的使用

用ToTensor记录图像数据到TensorBoard

在深度学习中,可视化是理解模型行为的关键。TensorBoard为PyTorch提供了一个可视化界面,其中包括了记录和查看图像数据的功能。下面是对提供的代码段的详细解析,展示了如何将转换后的图像数据记录到TensorBoard中。

导入必要的库

from PIL import Image
from torchvision import transforms
from torch.utils.tensorboard import SummaryWriter
解析
  • PIL.Image:Pillow库提供了图像打开、操作和保存的功能。这里用于打开图像文件。
  • torchvision.transformstorchvision的子模块,提供了常用的图像预处理功能,如转换图像到张量等。
  • torch.utils.tensorboard.SummaryWriter:PyTorch中TensorBoard的接口,用于记录训练过程中的各种数据,包括图像。

读取图像

img_path = "data/train/ants_image/20935278_9190345f6b.jpg"
img = Image.open(img_path)
解析
  • 指定图像文件的相对路径img_path
  • img是使用PIL库的Image.open函数加载的图像对象,它封装了图像文件的内容。这个对象包含了图像的数据(如像素值)和元数据(如尺寸和格式)。通过这个对象,可以对图像进行多种操作,比如裁剪、旋转、调整大小等。简而言之,img包含了图像的所有数据,使其可以被进一步处理和分析。

初始化SummaryWriter

writer = SummaryWriter("logs")
解析
  • 创建SummaryWriter实例,指定日志文件保存的目录"logs"。TensorBoard将会读取这个目录下的数据来进行可视化。通过打开“logs”,可以看到我们生成的图片文件。

图像转换为张量

tensor_0 = transforms.ToTensor()
tensor_img = tensor_0(img)
解析

在这段代码中,transforms.ToTensor()的作用是将PIL Image或者一个numpy.ndarray转换成torch.Tensor。这个转换不仅改变了数据的格式,使其适合进行深度学习模型的训练,还执行了一些额外的操作:

  1. 缩放像素值:将所有的像素值从[0, 255]的范围内缩放到[0.0, 1.0]的范围内。这是因为原始图像的像素值通常是整数形式,范围在0到255之间,而深度学习模型通常预期输入数据的范围在0到1之间,或是标准化后的范围内。
  2. 调整数据维度:对于一个PIL图像,数据是以(H, W, C)的形式存储的,其中H是高度,W是宽度,C是通道数(例如,对于RGB图像,C=3)。ToTensor转换会改变这些维度为(C, H, W),这是PyTorch处理图像数据的标准格式。

记录图像到TensorBoard

writer.add_image("Tensor_img", tensor_img)
解析
  • add_image方法用于将图像(这里是张量形式的图像tensor_img)记录到TensorBoard。"Tensor_img"是在TensorBoard中显示的图像的标签。
  • 这个方法自动处理张量的形式,使其可在TensorBoard中正确显示。

结束并保存日志

writer.close()
解析
  • 调用writer.close()确保所有事件已被写入日志文件,并且资源被正确释放。这一步骤在完成所有记录操作后是必要的,以确保数据的完整性和准确性。

完整代码

from PIL import Image
from torchvision import transforms
from torch.utils.tensorboard import SummaryWriter

img_path = "data/train/ants_image/20935278_9190345f6b.jpg"
#相对路径哦
img = Image.open(img_path)

writer = SummaryWriter("logs")

tensor_0 = transforms.ToTensor()
tensor_img = tensor_0(img)

writer.add_image("Tensor_img",tensor_img)
writer.close()

用Normalize记录图像数据到TensorBoard

标准化的作用

标准化是深度学习数据预处理的重要环节,尤其在图像处理领域。它的主要目的是将输入数据(例如图像像素值)转换为更加适合神经网络处理的形式。具体来说,标准化过程通常涉及以下两个步骤:

  1. 中心化(Zero-centering):通过从每个像素值中减去平均值,使得数据的均值为0。这一步骤有助于模型更好地理解数据中的特征,因为所有的输入都将相对于一个共同的基准进行比较。

  2. 缩放(Scaling):通过将数据除以其标准差,将数据的分布调整到一个特定的范围(通常是[-1, 1]或[0, 1])。这样可以确保模型在训练过程中不会因为某些特征的值过大而导致训练不稳定。

这两步合起来就是我们所说的标准化,它有助于加快训练速度,提高模型的收敛速度和性能。

代码解释

trans_norm = transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
img_norm = trans_norm(tensor_img)

这段代码是使用PyTorch的transforms模块中的Normalize函数进行图像标准化的示例。具体来说:

  • transforms.Normalize(mean, std):这个函数接受两个参数,meanstd,分别代表要应用于输入数据的均值和标准差。这些值用于按通道(channel-wise)对数据进行标准化。

  • [0.5, 0.5, 0.5]:这是传递给mean参数的列表,表示每个颜色通道(红、绿、蓝)的平均值都被设置为0.5。由于图像数据通常在[0, 1]范围内(假设已经通过transforms.ToTensor()转换),这相当于将数据中心化到[-0.5, 0.5]范围。

  • 第二个[0.5, 0.5, 0.5]:这是传递给std参数的列表,表示每个颜色通道的标准差都被设置为0.5。这一步骤将数据的范围缩放到[-1, 1],因为经过中心化后的数据除以0.5会得到这个范围。

  • img_norm = trans_norm(tensor_img):这行代码将上述标准化过程应用于一个名为tensor_img的图像张量。结果是一个标准化后的图像张量img_norm,它可以直接用于模型训练。

更详细的解释

标准化的计算公式相对简单且直接。当使用transforms.Normalize(mean, std)进行标准化时,对于每个通道,公式如下:

normalized_value = value − mean std \text{normalized\_value} = \frac{\text{value} - \text{mean}}{\text{std}} normalized_value=stdvaluemean

这里:

  • value是图像数据中的原始像素值。
  • mean是预先计算的该通道所有像素值的平均值。
  • std是预先计算的该通道所有像素值的标准偏差。

因此,对于刚才的代码:

trans_norm = transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])

给定一个图像张量tensor_img,其中包含的每个通道的每个像素值value会按照以下方式被转换:

normalized_value = value − 0.5 0.5 \text{normalized\_value} = \frac{\text{value} - 0.5}{0.5} normalized_value=0.5value0.5

这实际上是将每个通道的像素值重新缩放到[-1, 1]范围。具体来说:

  • 如果原始value是1(通常代表该像素在该通道的最大强度),则转换后的值为(1 - 0.5) / 0.5 = 1
  • 如果原始value是0(通常代表该像素在该通道的最小强度),则转换后的值为(0 - 0.5) / 0.5 = -1
  • 21
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值