当前位置: 首页 > news >正文

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

运行与查看

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

相关文章:

  • k8s中Pod和Node的故事(1):过滤、打分、亲和性和拓扑分布
  • springboot自助甜品网站的设计与实现(代码+数据库+LW)
  • 网站建设业动态wordpress出现404
  • Vue3组件通信8大方式详解
  • LeetCode 刷题【100. 相同的树、101. 对称二叉树、102. 二叉树的层序遍历】
  • Go基础:Go语言应用的各种部署
  • 团购网站 seo电商网站怎么做
  • 无Dockerfile构建:云原生部署新姿势
  • 深入解析 IDM 插件开发挑战赛:技术要点与实践指南
  • 颜群JVM【03】类的初始化
  • 达梦数据库常用初始化参数与客户端工具使用
  • 命令行安装 MySQL 8.4.6
  • 数据库--数据库约束和表的设计
  • [Windows] 磁盘映像管理工具:WimTool v1.7.2025.1001
  • 公司自己做网站晋城企业网站建设价格
  • 【SpringCloud(1)】初识微服务架构:创建一个简单的微服务;java与Spring与微服务;初入RestTemplate
  • leetcode 79 单词搜索
  • 站长之家官网查询电子商务网站建设与实践上机指导
  • 二叉树实战笔记:结构、遍历、接口与 OJ 实战
  • 哈尔滨php网站开发公司设置网站默认首页
  • 华为OD机试C卷 - 分披萨 - 贪心 DFS - (Java C++ JavaScript Python)
  • 仿照STM32 HAL库设计思想使用FreeRTOS实现异步非阻塞式设备驱动
  • 铜川做网站电话网页设计规范
  • ssc-FinLLM 金融大模型 相关链接
  • 二叉排序树(建树、查找、删除)
  • Linux学习笔记--i2cget 命令
  • 网站建设的标签指的是响应式网页设计图片
  • 用 CodeBuddy CLI + Prompt,从零到可运行:前后端混合管理系统的高效实战
  • 电源——电荷泵详解
  • 榆林国贸网站建设网站的关键词挖掘方式