惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Security Latest
Security Latest
量子位
博客园 - 三生石上(FineUI控件)
小众软件
小众软件
S
SegmentFault 最新的问题
The GitHub Blog
The GitHub Blog
AWS News Blog
AWS News Blog
T
Threat Research - Cisco Blogs
博客园 - Franky
Vercel News
Vercel News
H
Help Net Security
Martin Fowler
Martin Fowler
Security Archives - TechRepublic
Security Archives - TechRepublic
L
LINUX DO - 热门话题
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
L
Lohrmann on Cybersecurity
Cyberwarzone
Cyberwarzone
W
WeLiveSecurity
V2EX - 技术
V2EX - 技术
C
CERT Recently Published Vulnerability Notes
S
Secure Thoughts
C
Cyber Attacks, Cyber Crime and Cyber Security
B
Blog RSS Feed
H
Hacker News: Front Page
P
Proofpoint News Feed
博客园 - 聂微东
N
News and Events Feed by Topic
C
Cybersecurity and Infrastructure Security Agency CISA
D
Docker
博客园_首页
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
人人都是产品经理
人人都是产品经理
The Hacker News
The Hacker News
S
Security @ Cisco Blogs
博客园 - 【当耐特】
F
Fortinet All Blogs
The Register - Security
The Register - Security
A
About on SuperTechFans
D
Darknet – Hacking Tools, Hacker News & Cyber Security
S
Schneier on Security
NISL@THU
NISL@THU
Attack and Defense Labs
Attack and Defense Labs
Help Net Security
Help Net Security
Cisco Talos Blog
Cisco Talos Blog
月光博客
月光博客
IT之家
IT之家
有赞技术团队
有赞技术团队
Know Your Adversary
Know Your Adversary
Hugging Face - Blog
Hugging Face - Blog

Shine & Website

从圆肩到挺拔:我的训练计划 V2|肩胛稳定优先 2026 最新土耳其(外区)Apple ID 注册教程:低价订阅 ChatGPT Plus 完整指南(附开启跨区 Apple 家庭共享) 我们都还在路上:在不确定中攒出自己的选择权 Claude Desktop 接入第三方模型 API:基于 ccswitch 的配置与踩坑 从圆肩到挺拔:我的训练计划 V1|我的第一份认真训练计划 一生难忘,仅此一次:傅氏傅厝井朵桥祖厝重建竣工暨祔桃庆典 At Datawahle 我在Datawahle的日常 使用 Waline 实现 iCloud 和 Gmail 邮件通知的完整配置教程 为 Astro 博客打造完美的 Waline 评论系统:从集成到深度定制的完整实践 vscode优化体验(推荐设置 & 推荐插件) YOLO V7及多线程优化和边缘端设备RK3588-RK3588S部署 YOLO V11及多线程优化和边缘端设备RK3588-RK3588S部署 用于备份和恢复 Zotero 配置的插件-蒲公英 Tara Obsidian利用Syncthing全平台同步终极方案 同步ios和PC端 新机Linux(Ubuntu)到手一般都会做如下配置 04讲 - 炼丹流程 - PyTorch深度学习快速入门教程 03讲 - 神经网络 - PyTorch深度学习快速入门教程 01讲 - 配置 - PyTorch深度学习快速入门教程 其他设备通过局域网内主机的代理VPN科学上网(以Jetson设备为例) Jetson系统烧入过程(以Orin - Nano为例) Jetson Orin Nano开发指南记录 以RKNN系列模型为例,训练一个yolov7的目标检测模型 常用软件配置分享 - 持续更新 瓦肯举手礼 初识MCP技术 Qwen2.5 - VL的vllm部署方案(图像分析) 部署大模型并用Chatbox连接到远程Ollama服务 关于biome代码审查 配合Cloudflare和Piclist搭建一个属于你的免费图床 代码如诗,文章如歌
02讲 - 数据 - PyTorch深度学习快速入门教程
2025-07-14 · via Shine & Website

PyTorch中加载和处理数据的相关内容。首先,介绍了Dataset和DataLoader,前者定义了如何获取数据,后者用于加载数据和提供给网络。通过MyData类演示了如何自定义Dataset。接着,讲解了使用TensorBoard进行可视化,包括安装和使用SummaryWriter添加图片和标量数据。然后,介绍了Transforms用于图像变换,包括ToTensor、Normalize、Resize、Compose和RandomCrop等操作,并强调了关注输入输出类型。最后,介绍了DataLoader,演示了如何批量加载数据,并通过TensorBoard查看数据。

July 14, 2025  •  4 min read


第 02 讲 数据📝

1.1 加载数据

1.1.1 Dataset

PyTorch 有关加载数据的,主要涉及 DatasetDataLoader

前者主要告诉后者如何 获取数据 ,后者主要用于 加载数据和为网络提供数据

Dataset

需要继承抽象父类 \`Dataset\`

需要重写两个方法

\`__getitem__\`

\`__len__\`

read_data.py

from torch.utils.data import Dataset

from PIL import Image

import os

# 自己封装的 MyData类

class MyData(Dataset):

def __init__(self, root_dir, label_dir):

self.root_dir = root_dir

self.label_dir = label_dir

self.path = os.path.join(self.root_dir, self.label_dir)

self.img_path = os.listdir(self.path)

def __getitem__(self, idx):

img_name = self.img_path[idx]

img_item_path = os.path.join(self.root_dir, self.label_dir, img_name)

img = Image.open(img_item_path)

label = self.label_dir

return img, label

def __len__(self):

return len(self.img_path)

root_dir = "dataset/train"

ants_label_dir = "ants"

bees_label_dir = "bees"

ants_dataset = MyData(root_dir, ants_label_dir)

bees_dataset = MyData(root_dir, bees_label_dir)

# 第1种方式

print(ants_dataset[0])

# 第2种方式(根据上面返回的提示而修改)

img, label = ants_dataset[0]

img.show()

# 测试两个数据集的拼接 未改变顺序,ants在前 bees在后

train_dataset = ants_dataset + bees_dataset

print(len(ants_dataset))

print(len(bees_dataset))

print(len(train_dataset))

img, label = train_dataset[123]

img.show()

img, label = train_dataset[124]

img.show()

1.1.2 TensorBoard

我们不知道一个神经网络执行具体细节是什么,要人工调试十分困难

TensorBoard 可以将程序的执行步骤都显示出来,对训练的参数(如损失值)统计并以图展现

# 在「pytorch」环境中安装(记得关闭梯子)

pip install tensorboard

SummaryWriter类

创建一个事件文件,在给定的目录中添加摘要和事件

参数1 存放日志的文件夹名

本节视频只用到两个方法

1. add_image()

在事件文件中添加图片

2. add_scalar()

在TensorBoard中添加标量数据

该方法可以用来添加训练过程中的损失值、准确率等指标,以便于在TensorBoard中进行可视化和比较

test_tb.py

from torch.utils.tensorboard import SummaryWriter

writer = SummaryWriter("logs") ##存储到logs的文件夹

# y = 2x

# 同一个图像标题下,重复修改y值会导致,新图会包含之前的旧图(是个bug,可以通过删除logs文件再创建)

for i in range(100):

writer.add_scalar("y = 2x", 2*i, i) # 2*i y轴 i x轴

writer.close()

查看日志的命令

# logdir=事件文件所在的 文件夹名

tensorboard --logdir=logs

# 可以修改端口(原端口6006)

tensorboard --logdir=logs --port=6007

tensorboard.py

from torch.utils.tensorboard import SummaryWriter

from PIL import Image

import numpy as np

writer = SummaryWriter("logs")

# 第1步

# image_path = "data/train/ants_image/0013035.jpg"

# 第2步

image_path = "data/train/bees_image/16838648_415acd9e3f.jpg"

img_PIL = Image.open(image_path) ##获取的图像为PIL型

img_array = np.array(img_PIL) ##从numpy转换图片类型格式,转为numpy.ndarray型

print(type(img_array))

print(img_array.shape) ##查看格式为 "HWC"

# 从PIL到Numpy,需要在add_image()中指定图像的每一维

writer.add_image("test", img_array, global_step=1, dataformats="HWC")

##`global_step=1`就是告诉TensorBoard:“这张图是训练到第1步时的样子”。通过调整这个值,你能在TensorBoard中滑动查看训练过程中图像的演变。

##这里的dataformats="HWC"是格式,H代表高度,W代表宽度,C代表通道

writer.close()

1.2 转换数据

1.2.1 Transforms(一个工具箱)

Transforms 主要是用于图像变换的操作,可以对图像进行裁剪、标准化等

其包括很多常用的图像处理方法,比如 transforms.ToTensor()

Note

为什么用 Tensor 数据类型? Tensor 类型中的很多属性我们都需要在神经网络中用到,如反向传播、梯度等

test_tf.py

from PIL import Image

from torch.utils.tensorboard import SummaryWriter

from torchvision import transforms

img_path = "data/train/ants_image/0013035.jpg"

img = Image.open(img_path)

print(img)

# 使用transforms

> ToTensor() 可传入\`PIL Image\` 和 \`numpy.ndarray\` 两种图片格式

>

> PIL Image:即用PIL的Image工具打开图像的格式

>

> numpy.ndarray:即用OpenCV打开图像的格式(所以一般用这种方式打开,不用再转换图像了)

tensor_trans = transforms.ToTensor() ##创建tensor_trans工具

tensor_img = tensor_trans(img) ##使用tensor_trans工具将img转为Tensor型img

print(tensor_img)

# 创建tensorboard日志 可以使用tensorboard直观展示

writer = SummaryWriter("logs")

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

writer.close()

补充: 使用 opencv 读取图片

import cv2

cv_img = cv2.imread(img_path)

print(cv_img) ## 使用opencv读取图片,可以直接得到numpy.ndarray类型img

Note

多关注 「输入、输出」 类型,不会的多看 「官方文档」 关注方法需要的 「参数」 ,不知道返回值的时候 「Print」打印查看

call.py 展示 Python 中 call 的用法

# __call__ 让对象可以直接当函数使用

# 测试

class Person:

def __call__(self, name):

print(" Hello "+name)

def hello(self, name):

print("Hello "+name)

person = Person()

#以下两种调用方式

person("zhangsan")## 调用的__call__

person.hello("lisi")## 调用的hello对象名

useful_tf.py 展示 transforms 的一些功能

from PIL import Image

from torch.utils.tensorboard import SummaryWriter

from torchvision import transforms

writer = SummaryWriter("logs")

img = Image.open("images/0013035.jpg")

print(img) # 打印后得知,图像为RGB三通道

# 01 transforms.ToTensor()

trans_totensor = transforms.ToTensor()

img_tensor = trans_totensor(img)

print(img_tensor[0][0][0]) ## 打印张量中第一个通道、第一行、第一列的像素值,这通常是一个介于0到1之间的浮点数

writer.add_image("ToTensor", img_tensor, 0) ## 0:全局步数(global step),用于训练过程中跟踪不同步骤的图像

# 02 transforms.Normalize()

# 是一种归一化,目的是将数据调整到特定的范围内,使其更适合模型训练或分析

# 公式 output[channel] = (input[channel] - mean[channel]) / std[channel]

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

## mean平均值;std标准差

## 创建了一个标准化转换器,对RGB三个通道执行:减去均值0.5 ; 除以标准差0.5

## 公式为:normalized = (input - mean) / std

img_norm = trans_norm(img_tensor) ## 输入01得到的Tensor型img

print(img_norm[0][0][0])

writer.add_image("Normalize", img_norm, 0)

# 03 Resize 用于调整图像尺寸

# 图像为PIL,经过Resize后,仍为PIL.设计初衷就是处理PIL图像,并保持相同的数据类型输出

# transforms.Resize()可以接受两种参数形式:1. 单个整数:将图像的短边缩放到该尺寸,长边按比例缩放 2. 元组(h,w):将图像精确缩放到指定尺寸

trans_resize = transforms.Resize((512, 512))

img_resize = trans_resize(img)

# 将PIL转为Tensor

img_resize = trans_totensor(img_resize)

writer.add_image("Resize", img_resize, 0)

# 04 Compose 可以将几个转换组合在一起,先resize,再tensor

# Compose中的操作顺序必须合理

trans_resize_2 = transforms.Resize(512)

trans_compose = transforms.Compose([trans_resize_2, trans_totensor]) ##相当于合并两个过程

img_resize_2 = trans_compose(img)

writer.add_image("Resize", img_resize_2, 0)

# 05 RandomCrop 随机裁剪

trans_random = transforms.RandomCrop(512)

trans_compose_2 = transforms.Compose([trans_random, trans_totensor])

for i in range(10): ##随机裁剪十个

img_crop = trans_compose_2(img)

writer.add_image("RandomCrop", img_crop, i)

writer.close()

dataset_tf.py 展示 transform 与数据集使用

import torchvision

from torch.utils.tensorboard import SummaryWriter

dataset_transforms = torchvision.transforms.Compose

([

torchvision.transforms.ToTensor()

## 这里可以进行其他操作(比如resize等等)

])

train_set = torchvision.datasets.CIFAR10(root='./dataset',

train=True,

transform=dataset_transforms,

download=True)

test_set = torchvision.datasets.CIFAR10(root='./dataset',

train=False,

transform=dataset_transforms,

download=True)

# 01 查看一下数据信息

print(test_set[0])

## 输出 (<PIL.Image.Image image mode=RGB size=32x32 at 0x23653E11F60>, 3)

img, target = test_set[0]

print(img)

print(target) ## 标签也就是label

print(test_set.classes)

print(test_set.classes[target]) # 输出cat(对应3)

img.show()

# 02 通过tensorboard查看

writer = SummaryWriter("logs")

for i in range(10):

img, target = train_set[i]

writer.add_image("test_set", img, i)

writer.close()

查看 logs 日志

tensorboard --logdir="logs"

1.2.2 DataLoader

batch_size 取四个数据打包成 imgs.targets,相当于融合在一起

取四个数据打包

dataloader.py

import torchvision

from torch.utils.data import DataLoader

from torch.utils.tensorboard import SummaryWriter

# 准备测试集

test_data = torchvision.datasets.CIFAR10("./dataset",

train=False,

transform=torchvision.transforms.ToTensor(),

download=True)

# 加载测试集

test_loader = DataLoader(test_data,batch_size=64,shuffle=True,

num_workers=0,

drop_last=True)

## shuffle=True表示在每次遍历数据集(即每个 epoch)前,将数据顺序打乱

## num_workers=0 表示 使用主线程加载数据(加载将是同步进行的)

# 查看测试数据集中第一张图片

img, target = test_data[0]

print(img.shape)

print(target)

writer = SummaryWriter("dataloader")

for epoch in range(2): ## 遍历两轮

step = 0

for data in test_loader:

imgs, targets = data

# print(imgs.shape)

# print(targets)

writer.add_images("Epoch:{}".format(epoch),imgs,step)

step = step + 1

writer.close()

02讲 - 数据 - PyTorch深度学习快速入门教程

https://www.futseyi.com/blog/pytorch-quickstart-data/

Author
FuTseYi

Published at
July 14, 2025

Copyright
CC BY-NC-SA 4.0