【深度学习02】TensorBoard 基础与 torchvision 图像变换工具详解(附代码演示)
文章目录
- Tensorboard的使用
- 安装Tensorboard
- SummaryWriter的使用
- add_scalar()的使用方法
- 如何打开事件文件
- add_image()的使用方法
- 利用Opencv读取图片,获得numpy型图片数据
- 利用numpy.array(),对PIL图片进行转换
- torchvision中的transforms
- transforms结构及用法
- torchvision.transforms 常用图像变换工具
- 1. `Compose`
- 2. `ToTensor`
- 3. `ToPILImage`
- 4. `Normalize`
- 5. `Resize`
- 6. `CenterCrop`
- 7. `RandomCrop`
- 8. `RandomHorizontalFlip` / `RandomVerticalFlip`
- 9. `RandomResizedCrop`
- 10. `Grayscale`
- 11. `RandomRotation`
- 12. `Pad`
- torchvision中的数据集使用
- 代码功能讲解
- 源代码
- 运行与查看
- dataloader的使用
- 代码功能讲解
- `DataLoader` 核心参数详解
- `dataset`
- `batch_size`
- `shuffle`
- `num_workers`
- `drop_last`
- 源代码
- 运行与查看
视频链接
【PyTorch深度学习快速入门教程(绝对通俗易懂!)【小土堆】】p7-p14
Tensorboard的使用
安装Tensorboard
在pycharm的terminal里面输入
pip install tensorboard
SummaryWriter的使用
在pycharm创建项目(上篇笔记有讲)
导入
from torch.utils.tensorboard import SummaryWriter
一个小技巧,这样子可以看到使用说明
创建实例,将该对象对应的内容放到logs文件夹下
writer = SummaryWriter("logs")
我们会用到两个方法:
writer.add_image()
writer.add_scalar()
add_scalar()的使用方法
老样子,可以按Ctrl键并将鼠标移动其上看它的使用方法
Tag是 TensorBoard 中看到的图表名称 第二个参数是y值,第三个参数是x值
如何打开事件文件
也可以指定端口防止与别人端口冲突
演示
from torch.utils.tensorboard import SummaryWriter
import os # 导入 os 模块来处理路径# 定义日志存储的根目录
# 根据您的文件路径,应该是 E:\python_pytorch\logs
# os.path.join 会自动处理路径分隔符的兼容性问题
log_base_dir = r"E:\python_pytorch\logs" # 使用原始字符串 r"" 防止反斜杠的转义问题# 创建 SummaryWriter 实例,并指定日志目录
# 注意:SummaryWriter 会在这个目录下创建子目录,例如 'runs/当前时间戳'
writer = SummaryWriter(log_dir=log_base_dir)for i in range(100):# 'Tag' 是您在 TensorBoard 中看到的图表名称# 第二个参数是y值,第三个参数是x值 (global_step)writer.add_scalar('My_Simple_Tag', i * 2, i)writer.flush() # 确保所有待写入的数据都写入磁盘
writer.close() # 关闭 writer,释放资源
在终端Terminal输入
tensorboard --logdir=E:\python_pytorch\logs --port=6007
如果你尝试了其它函数,它会在原图上添加,例如下面这张图,此时如果你只想要当前函数的图像,只需要在log文件夹里将所有的文件都删除重新运行即可
add_image()的使用方法
练手数据集 密码: 5suq
将它放到总文件夹中重命名为dataset(和上一篇的蜜蜂蚂蚁训练集是同一个 如果上次做过此操作则忽略此步骤)
依旧Ctrl+鼠标点击查看官方说明
可知img_tensor中对格式有要求
利用Opencv读取图片,获得numpy型图片数据
安装opencv
在终端Terminal里面输入
pip install opencv-python
利用numpy.array(),对PIL图片进行转换
img_array =np.array(img_PIL)
完整代码如下:
import numpy as np
from PIL import Image
from tensorflow.python.ops.gen_nn_ops import data_format_dim_map
from torch.utils.tensorboard import SummaryWriter
from urllib3.filepost import writerwriter = SummaryWriter("logs")
image_path = "dataset/train/ants/0013035.jpg"
img_PIL = Image.open(image_path)
img_array = np.array(img_PIL)writer.add_image("test",img_array,1,dataformats='HWC')
#y=2x
for i in range(100):writer.add_scalar("y=2x",3*i,i)writer.close()
torchvision中的transforms
transforms结构及用法
torchvision.transforms 常用图像变换工具
1. Compose
功能:组合多个变换步骤,形成预处理流水线。
使用示例:
from torchvision import transformstransform = transforms.Compose([transforms.Resize((224, 224)), # 第一步:缩放transforms.RandomCrop(200), # 第二步:随机裁剪transforms.ToTensor(), # 第三步:转张量transforms.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]) # 第四步:标准化
])processed_img = transform(raw_img) # 应用整个流程
特点:
- 按列表顺序依次应用每个变换
- 输入需为可迭代的变换对象
- 前一个变换的输出需符合下一个变换的输入要求
2. ToTensor
- ToTensor 变换的作用:
将 PIL 图像(形状为 (H, W, C))转换为 PyTorch 张量(形状为 (C, H, W))
将像素值从 [0, 255] 范围归一化到 [0.0, 1.0] 的浮点数范围
这是连接原始图像数据与 PyTorch 模型的重要桥梁 - TensorBoard 可视化:
通过SummaryWriter可以方便地记录各种数据供后续可视化
写入图像后,我们可以通过在终端运行tensorboard --logdir=logs来查看结果
这有助于我们验证数据预处理步骤是否正确
# 导入所需库
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms# 创建SummaryWriter对象,指定日志保存目录
# 运行后会在当前目录下创建logs文件夹存储日志数据
writer = SummaryWriter("logs")# 读取图像文件
# 这里需要替换为你的图像实际路径
img = Image.open("images/pytorch.png")
# 打印图像信息,可查看图像格式、尺寸等基本属性
print(img)# 创建ToTensor变换实例
# ToTensor是将PIL图像或numpy数组转换为PyTorch张量的关键工具
trans_totensor = transforms.ToTensor()# 应用变换,将PIL图像转换为张量
# 转换后的数据格式会从(H, W, C)变为(C, H, W),并归一化到[0,1]范围
img_tensor = trans_totensor(img)# 将转换后的张量图像写入TensorBoard
# 第一个参数是图像标签,第二个参数是张量图像
writer.add_image("ToTensor", img_tensor)# 关闭SummaryWriter,确保所有数据都已写入
writer.close()
3. ToPILImage
功能:将 PyTorch 张量或 numpy 数组转换回 PIL 图像(ToTensor
的逆操作)。
核心功能:
- 转换形状:
(C, H, W)
→(H, W, C)
- 映射值范围:
[0.0, 1.0]
→[0, 255]
(整数)
使用示例:
from torchvision import transformsto_pil = transforms.ToPILImage()
pil_img = to_pil(tensor_img) # 转换为 PIL 图像
pil_img.save("output.jpg") # 保存图像
4. Normalize
功能:对张量图像进行标准化处理(按通道应用均值-标准差归一化)。
参数:
mean
:每个通道的均值(长度与通道数一致)std
:每个通道的标准差(同上)
计算方式:
output[channel] = (input[channel] - mean[channel]) / std[channel]
使用示例:
# 对 RGB 图像标准化(常用 ImageNet 数据集的均值和标准差)
normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]
)
normalized_img = normalize(tensor_img) # 输入必须是张量
5. Resize
功能:将图像缩放到指定大小。
参数:
size
:目标大小((h, w)
或单个整数)interpolation
:插值方法(默认双线性插值)
使用示例:
# 缩放为 224x224
resize = transforms.Resize((224, 224))
resized_img = resize(pil_img)# 按比例缩放(短边为 256,长边按比例调整)
resize = transforms.Resize(256)
6. CenterCrop
功能:从图像中心裁剪出指定大小的区域。
参数:
size
:裁剪后的尺寸((h, w)
或单个整数)
使用示例:
# 从中心裁剪 224x224 的区域
center_crop = transforms.CenterCrop(224)
cropped_img = center_crop(resized_img) # 常与 Resize 配合使用
7. RandomCrop
功能:随机从图像中裁剪出指定大小的区域(数据增强)。
参数:
size
:裁剪尺寸padding
(可选):裁剪前在图像边缘填充指定像素
使用示例:
# 随机裁剪 224x224 的区域,先填充 4 像素
random_crop = transforms.RandomCrop(224, padding=4)
cropped_img = random_crop(pil_img)
8. RandomHorizontalFlip
/ RandomVerticalFlip
功能:随机水平/垂直翻转图像(数据增强)。
参数:
p
:翻转概率(默认 0.5)
使用示例:
# 50% 概率水平翻转
flip = transforms.RandomHorizontalFlip(p=0.5)
flipped_img = flip(pil_img)
9. RandomResizedCrop
功能:先随机裁剪图像的一部分,再将裁剪区域缩放到指定大小(常用于训练集增强)。
参数:
size
:目标大小scale
:裁剪区域占原图像的比例范围(如(0.08, 1.0)
)
使用示例:
# 随机裁剪原图像的 8%-100% 区域,再缩放到 224x224
random_resized_crop = transforms.RandomResizedCrop(224, scale=(0.08, 1.0))
processed_img = random_resized_crop(pil_img)
10. Grayscale
功能:将彩色图像转换为灰度图。
参数:
num_output_channels
:输出通道数(1 或 3)
使用示例:
# 转换为单通道灰度图
gray = transforms.Grayscale(num_output_channels=1)
gray_img = gray(pil_img)
11. RandomRotation
功能:随机旋转图像一定角度(数据增强)。
参数:
degrees
:旋转角度范围(如(-30, 30)
)
使用示例:
# 随机旋转 ±15°
rotate = transforms.RandomRotation(degrees=(-15, 15))
rotated_img = rotate(pil_img)
12. Pad
功能:在图像边缘填充指定像素。
参数:
padding
:填充大小(单值或(left, top, right, bottom)
)
使用示例:
# 四周各填充 10 像素,填充值为 0(黑色)
pad = transforms.Pad(padding=10, fill=0)
padded_img = pad(pil_img)
torchvision中的数据集使用
torchvision中的数据集地址
torchvision
我们实战CIFAR数据集
import torchvisiontrain_set = torchvision.datasets.CIFAR10(root="./datasets",train =True,download = True)
test_set = torchvision.datasets.CIFAR10(root="./datasets",train=False,download=True)
root是文件存放的位置,download设置成true则会自动从官网下载数据集
代码功能讲解
这段代码主要完成了以下几个关键任务:
- 导入相关库:导入
torchvision
库用于处理计算机视觉相关任务,以及从torch.utils.tensorboard
导入SummaryWriter
用于将数据写入 TensorBoard 以便可视化。 - 数据预处理:通过
torchvision.transforms.Compose
组合数据转换操作,这里使用ToTensor
将 CIFAR10 数据集的图像转换为 PyTorch 中的张量(Tensor)格式,方便后续处理。 - 加载数据集:分别加载 CIFAR10 数据集的训练集(
train_set
)和测试集(test_set
),指定数据保存的根目录(root
)、是否为训练集(train
)、使用的转换操作(transform
)以及是否自动下载数据集(download
)。 - TensorBoard 可视化:创建
SummaryWriter
对象,指定写入的目录为"p10"
。然后通过循环遍历测试集的前 10 个样本,将每个样本的图像添加到 TensorBoard 中,以便在 TensorBoard 中查看这些图像。
源代码
import torchvision
from torch.utils.tensorboard import SummaryWriter# 定义数据转换操作,将图像转换为张量
dataset_transform = torchvision.transforms.Compose([torchvision.transforms.ToTensor()
])# 加载 CIFAR10 训练集,若本地没有则自动下载
train_set = torchvision.datasets.CIFAR10(root="./dataset", train=True, transform=dataset_transform, download=True)
# 加载 CIFAR10 测试集,若本地没有则自动下载
test_set = torchvision.datasets.CIFAR10(root="./dataset", train=False, transform=dataset_transform, download=True)# 创建 SummaryWriter 对象,用于向 TensorBoard 写入数据,指定写入目录为 "p10"
writer = SummaryWriter("p10")# 遍历测试集的前 10 个样本
for i in range(10):img, target = test_set[i]# 将图像添加到 TensorBoard 中,标签为 "test_set",索引为 iwriter.add_image("test_set", img, i)
运行与查看
- 运行上述代码后,会在当前目录下生成一个名为
p10
的文件夹,里面包含了用于 TensorBoard 可视化的数据。 - 打开终端,激活对应的 Python 环境(如果使用了虚拟环境),然后执行以下命令启动 TensorBoard:
tensorboard --logdir=p10
- 最后,在浏览器中输入终端显示的地址(通常是
http://localhost:6006/
),即可在 TensorBoard 中查看 CIFAR10 数据集前 10 个测试样本的图像。
dataloader的使用
dataloader
代码功能讲解
这段代码主要完成了以下工作:
- 导入相关库:导入
torchvision
用于处理计算机视觉任务,从torch.utils.data
导入DataLoader
用于数据加载,从torch.utils.tensorboard
导入SummaryWriter
用于数据可视化。 - 加载测试数据集:使用
torchvision.datasets.CIFAR10
加载 CIFAR10 测试集,将图像转换为张量格式(通过transform=torchvision.transforms.ToTensor()
),指定数据保存根目录为./dataset
,train=False
表示加载测试集。 - 创建 DataLoader:通过
DataLoader
对测试数据集进行包装,设置批次大小(batch_size=64
)、是否打乱数据(shuffle=True
)、工作进程数(num_workers=0
,表示在主进程加载数据)以及是否丢弃最后不足一个批次的数据(drop_last=True
)。 - 查看单张图片及标签:取出测试数据集中的第一张图片及其标签,打印图片的形状和标签值,以便了解数据的基本情况。
- TensorBoard 可视化:创建
SummaryWriter
对象,指定写入目录为dataloader
。然后进行两轮(range(2)
)遍历,在每一轮中,遍历DataLoader
加载的批次数据,将每个批次的图像添加到 TensorBoard 中,最后关闭SummaryWriter
。
DataLoader
核心参数详解
DataLoader
是 PyTorch 中数据加载的核心工具,其参数配置直接影响数据加载效率和模型训练效果。以下是关键参数的详细说明:
dataset
- 作用:指定要加载的数据集。
- 在代码中的情况:这里传入的是
test_data
,也就是通过torchvision.datasets.CIFAR10
加载的 CIFAR10 测试集。DataLoader
会从这个数据集中按批次读取数据。
batch_size
- 作用:设置每个批次(batch)的数据量大小。
- 在代码中的情况:代码里
batch_size=64
,意味着每次从test_data
中读取 64 个样本组成一个批次。在深度学习训练中,通常会使用批量数据来计算梯度,这样可以提高计算效率,同时也能使梯度估计更稳定。
shuffle
- 作用:控制是否在每个 epoch(轮次)开始时打乱数据集的顺序。
- 在代码中的情况:
shuffle=True
,表示在每个 epoch 中,DataLoader
会先将test_data
的数据顺序打乱,然后再进行批次划分。这有助于提高模型的泛化能力,避免模型学习到数据的顺序规律。
num_workers
- 作用:设置用于数据加载的子进程数量。
- 在代码中的情况:
num_workers=0
,表示数据加载在主进程中进行,不使用额外的子进程。如果设置为大于 0 的数,就会使用相应数量的子进程来并行加载数据,从而加快数据加载速度,尤其是在数据集较大时效果明显。
drop_last
- 作用:决定当数据集的大小不能被
batch_size
整除时,是否舍弃最后一个不完整的批次。 - 在代码中的情况:
drop_last=True
,假设test_data
的样本数除以 64 后有余数,那么最后一个不足 64 个样本的批次会被丢弃。这样可以保证每个批次的样本数量都是batch_size
,在一些对批次大小有严格要求的场景(如分布式训练)中很有用。
源代码
import torchvision
# 用于数据加载
from torch.utils.data import DataLoader
# 用于TensorBoard可视化
from torch.utils.tensorboard import SummaryWriter# 加载CIFAR10测试数据集,将图像转换为张量
test_data = torchvision.datasets.CIFAR10("./dataset", train=False, transform=torchvision.transforms.ToTensor())# 创建DataLoader,对测试数据集进行批量加载等操作
# batch_size=64:每个批次有64个样本
# shuffle=True:每个epoch打乱数据顺序
# num_workers=0:在主进程加载数据
# drop_last=True:丢弃最后不足一个批次的样本
test_loader = DataLoader(dataset=test_data, batch_size=64, shuffle=True, num_workers=0, drop_last=True)# 取出测试数据集中的第一张图片和对应的标签
img, target = test_data[0]
# 打印图片形状
print(img.shape)
# 打印标签
print(target)# 创建SummaryWriter对象,指定写入目录为dataloader
writer = SummaryWriter("dataloader")
# 进行2轮遍历
for epoch in range(2):step = 0# 遍历DataLoader加载的批次数据for data in test_loader:imgs, targets = data# 将每个批次的图像添加到TensorBoard,标签包含当前轮次epochwriter.add_images("Epoch: {}".format(epoch), imgs, step)step = step + 1
# 关闭SummaryWriter
writer.close()
运行与查看
- 运行上述代码后,会在当前目录下生成一个名为
dataloader
的文件夹,里面包含了用于 TensorBoard 可视化的数据。 - 打开终端,激活对应的 Python 环境(如果使用了虚拟环境),然后执行以下命令启动 TensorBoard:
tensorboard --logdir=dataloader
- 最后,在浏览器中输入终端显示的地址(通常是
http://localhost:6006/
),即可在 TensorBoard 中查看 CIFAR10 数据集通过DataLoader
加载后的图像批次可视化结果。通过对比不同 epoch 的图像排列,还可以直观看到shuffle=True
参数的效果。