PyTorch深度学习入门记录4
TensorBoard的使用
TensorBoard的安装 ---> 在PyCharm终端输入(若终端显示PS而不是pytorch参考下面步骤修改) ---> pip install tensorboard
powershell.exe 改为 cmd.exe
from torch.utils.tensorboard import SummaryWriter
# SummaryWriter是 TensorBoard 的 PyTorch 接口,用于向 TensorBoard 写入数据writer = SummaryWriter("logs")
# 创建SummaryWriter对象,指定日志文件保存目录为 "logs"
# 运行后会在当前工作目录下创建 "logs" 文件夹,用于存储 TensorBoard 所需的日志文件for i in range(100):writer.add_scalar("y=x", i, i)
# 调用add_scalar方法记录标量数据(只包含单一数值的简单数据,比如178cm,30kg等)
# 第一个参数 "y=x" 是曲线的标签名称,将显示在 TensorBoard 中
# 第二个参数i是要记录的标量值(y 轴数据)
# 第三个参数i是全局步数(x 轴数据)
# 这行代码的效果是记录一条 y=x 的直线数据writer.close()
搭配代码使用的的一些终端指令
tensorboard --logdir=logs:终端中启动 TensorBoard 的命令,用于可视化用SummaryWriter
记录的日志数据
tensorboard --logdir=logs --port=6007:修改可视化的端口,避免和其他人冲突
练习数据集链接
图像的格式转换与导入
from torch.utils.tensorboard import SummaryWriter
# SummaryWriter是 TensorBoard 的 PyTorch 接口,用于向 TensorBoard 写入数据
import numpy as np
from PIL import Imagewriter = SummaryWriter("logs")
# 创建SummaryWriter对象,指定日志文件保存目录为 "logs"
# 运行后会在当前工作目录下创建 "logs" 文件夹,用于存储 TensorBoard 所需的日志文件
image_path = "data/train/ants_image/0013035.jpg"
img_PIL = Image.open(image_path)
img_array = np.array(img_PIL)
print(img_array)
print(img_array.shape) # HWC格式 高 宽 通道数writer.add_image("test", img_array, 1, dataformats='HWC') # 添加图像数据 默认格式为CHWfor i in range(100):writer.add_scalar("y=3x", 3*i, i)
# 调用add_scalar方法记录标量数据(只包含单一数值的简单数据,比如178cm,30kg等)
# 第一个参数 "y=x" 是曲线的标签名称,将显示在 TensorBoard 中
# 第二个参数i是要记录的标量值(y 轴数据)
# 第三个参数i是全局步数(x 轴数据)
# 这行代码的效果是记录一条 y=x 的直线数据writer.close()
Transforms的使用
将PIL图像转换为PyTorch张量(Tensor)
# 从torchvision库中导入transforms模块,该模块提供了各种图像预处理工具
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
# 从PIL库中导入Image类,用于处理图像文件的读取和基本操作
from PIL import Image# 定义图像文件的路径,指向训练数据集中的一张蚂蚁图片
img_path = "dataset/train/ants/0013035.jpg"
# 使用PIL的Image.open()方法打开指定路径的图像文件,返回PIL图像对象
img = Image.open(img_path)writer = SummaryWriter("logs")
# 创建ToTensor类的实例,该实例用于将PIL图像或NumPy数组转换为PyTorch张量
tensor_trans = transforms.ToTensor()
# 使用创建的tensor_trans转换器,将PIL图像对象img转换为PyTorch张量
# 转换过程会自动完成:
# 1. 像素值从[0, 255]范围归一化到[0.0, 1.0]
# 2. 数据格式从HWC(高度, 宽度, 通道)转换为CHW(通道, 高度, 宽度)
tensor_img = tensor_trans(img)writer.add_image("Tensor_img", tensor_img)writer.close()# 打印转换后的张量数据,显示其形状和像素值信息
# print(tensor_img)
# 导入PIL库的Image类,用于图像的读取和基本处理
from PIL import Image
# 导入SummaryWriter类,用于将数据写入TensorBoard进行可视化
from torch.utils.tensorboard import SummaryWriter
# 导入transforms模块,提供各种图像预处理工具
from torchvision import transforms# 创建SummaryWriter实例,指定日志文件保存到"logs"目录
writer = SummaryWriter("logs")
# 使用PIL打开指定路径的蜜蜂图像,返回PIL图像对象
img = Image.open("dataset/train/bees/16838648_415acd9e3f.jpg")# 1. 演示ToTensor转换:将PIL图像转为PyTorch张量
# 创建ToTensor转换器实例
trans_totensor = transforms.ToTensor()
# 将PIL图像转换为张量(自动完成像素值归一化到[0,1]和格式转换HWC→CHW)
img_tensor = trans_totensor(img)
# 将转换后的张量图像写入TensorBoard,标签为"ToTensor"
writer.add_image("ToTensor", img_tensor)# 2. 演示Normalize(标准化)操作
# 创建Normalize转换器实例,参数为各通道的均值和标准差
# 标准化公式:output = (input - mean) / std
trans_norm = transforms.Normalize([0.1, 0.2, 0.2], [0.3, 0.4, 0.2])
# 对张量图像进行标准化处理(注意:Normalize仅接收张量作为输入)
img_norm = trans_norm(img_tensor)
# 将标准化后的图像写入TensorBoard,标签为"Normalize",全局步数为1
writer.add_image("Normalize", img_norm, 1)# 3. 演示Resize(调整图像尺寸)操作
# 打印原始PIL图像的尺寸(宽, 高)
print(img.size)
# 创建Resize转换器实例,指定目标尺寸为(512, 512)(高, 宽)
trans_resize = transforms.Resize((512, 512))
# 对PIL图像进行尺寸调整,返回调整后的PIL图像
img_resize = trans_resize(img)
# 将调整尺寸后的PIL图像转换为张量
img_resize = trans_totensor(img_resize)
# 将调整尺寸后的张量图像写入TensorBoard,标签为"Resize",全局步数为0
writer.add_image("Resize", img_resize, 0)
# 打印调整尺寸后的张量信息(包含形状和像素值)
print(img_resize)# 4. 演示Compose(组合多个转换操作)
# 创建Resize转换器实例,指定目标短边长度为512(长边按比例缩放)
trans_resize_2 = transforms.Resize(512)
# 使用Compose组合转换操作:先调整尺寸,再转为张量
trans_compose = transforms.Compose([trans_resize_2, trans_totensor])
# 对原始PIL图像依次应用组合的转换操作
img_resize_2 = trans_compose(img)
# 将处理后的图像写入TensorBoard,标签为"Resize",全局步数为1(与之前的Resize区分)
writer.add_image("Resize", img_resize_2, 1)# 5. 演示RandomCrop(随机裁剪)操作(数据增强常用)
# 创建RandomCrop转换器实例,指定裁剪尺寸为(500, 1000)(高, 宽)
# 每次调用会从原始图像中随机裁剪出指定尺寸的区域
trans_random = transforms.RandomCrop((500, 1000))
# 组合转换操作:先随机裁剪,再转为张量
trans_compose_2 = transforms.Compose([trans_random, trans_totensor])
# 循环10次,生成10张不同的随机裁剪图像
for i in range(10):img_crop = trans_compose_2(img)# 将每次裁剪的图像写入TensorBoard,标签为"RandomCrop",步数从0到9writer.add_image("RandomCrop", img_crop, i)# 关闭SummaryWriter,确保所有数据都被写入日志文件
writer.close()
标准化展示 --- 正常展示