文章目录

  • 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

一个小技巧,这样子可以看到使用说明

【深度学习02】TensorBoard 基础与 torchvision 图像变换工具详解(附代码演示)_#pytorch


创建实例,将该对象对应的内容放到logs文件夹下

writer = SummaryWriter("logs")

我们会用到两个方法:

writer.add_image()
writer.add_scalar()

add_scalar()的使用方法

老样子,可以按Ctrl键并将鼠标移动其上看它的使用方法

【深度学习02】TensorBoard 基础与 torchvision 图像变换工具详解(附代码演示)_#人工智能_02


Tag是 TensorBoard 中看到的图表名称 第二个参数是y值,第三个参数是x值

如何打开事件文件

【深度学习02】TensorBoard 基础与 torchvision 图像变换工具详解(附代码演示)_#笔记_03


也可以指定端口防止与别人端口冲突

【深度学习02】TensorBoard 基础与 torchvision 图像变换工具详解(附代码演示)_#pytorch_04


演示

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

【深度学习02】TensorBoard 基础与 torchvision 图像变换工具详解(附代码演示)_#人工智能_05


【深度学习02】TensorBoard 基础与 torchvision 图像变换工具详解(附代码演示)_#python_06


如果你尝试了其它函数,它会在原图上添加,例如下面这张图,此时如果你只想要当前函数的图像,只需要在log文件夹里将所有的文件都删除重新运行即可

【深度学习02】TensorBoard 基础与 torchvision 图像变换工具详解(附代码演示)_#python_07

add_image()的使用方法

练手数据集 密码: 5suq

将它放到总文件夹中重命名为dataset(和上一篇的蜜蜂蚂蚁训练集是同一个 如果上次做过此操作则忽略此步骤)

依旧Ctrl+鼠标点击查看官方说明

【深度学习02】TensorBoard 基础与 torchvision 图像变换工具详解(附代码演示)_#pytorch_08


可知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 writer

writer = 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()

【深度学习02】TensorBoard 基础与 torchvision 图像变换工具详解(附代码演示)_#python_09

torchvision中的transforms

transforms结构及用法

【深度学习02】TensorBoard 基础与 torchvision 图像变换工具详解(附代码演示)_#笔记_10

torchvision.transforms 常用图像变换工具

1. Compose

功能:组合多个变换步骤,形成预处理流水线。

使用示例

from torchvision import transforms

transform = 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 transforms

to_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

【深度学习02】TensorBoard 基础与 torchvision 图像变换工具详解(附代码演示)_#深度学习_11


【深度学习02】TensorBoard 基础与 torchvision 图像变换工具详解(附代码演示)_#python_12


【深度学习02】TensorBoard 基础与 torchvision 图像变换工具详解(附代码演示)_#pytorch_13


我们实战CIFAR数据集

import torchvision

train_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",索引为 i
    writer.add_image("test_set", img, i)
运行与查看
  1. 运行上述代码后,会在当前目录下生成一个名为 p10 的文件夹,里面包含了用于 TensorBoard 可视化的数据。
  2. 打开终端,激活对应的 Python 环境(如果使用了虚拟环境),然后执行以下命令启动 TensorBoard:
tensorboard --logdir=p10
  1. 最后,在浏览器中输入终端显示的地址(通常是 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()),指定数据保存根目录为 ./datasettrain=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,标签包含当前轮次epoch
        writer.add_images("Epoch: {}".format(epoch), imgs, step)
        step = step + 1
# 关闭SummaryWriter
writer.close()

运行与查看

  1. 运行上述代码后,会在当前目录下生成一个名为 dataloader 的文件夹,里面包含了用于 TensorBoard 可视化的数据。
  2. 打开终端,激活对应的 Python 环境(如果使用了虚拟环境),然后执行以下命令启动 TensorBoard:
tensorboard --logdir=dataloader
  1. 最后,在浏览器中输入终端显示的地址(通常是 http://localhost:6006/),即可在 TensorBoard 中查看 CIFAR10 数据集通过 DataLoader 加载后的图像批次可视化结果。通过对比不同 epoch 的图像排列,还可以直观看到 shuffle=True 参数的效果。