Pytorch中如何加载数据、Tensorboard、Transforms的使用

一、Pytorch中如何加载数据

在Pytorch中涉及到如何读取数据,主要是两个类一个类是Dataset、Dataloader

Dataset 提供一种方式获取数据,及其对应的label。主要包含以下两个功能:

如何获取每一个数据以及label

告诉我们总共有多少的数据

Dataloader,可以对数据进行打包,为后面的网络提供不同的数据形式。

二、Tensorboard的使用,用来观察训练结果

复制代码
from torch.utils.tensorboard import SummaryWriter

writer = SummaryWriter("log")

# writer.add_image()

for i in range(100):
    writer.add_scalar("y=x", i, i)

writer.close()

在Terminal中先切换到conda activate pytorch

使用命令 tensorboard --logdir=logs

TensorBoard的使用

1、使用add_image()方法

复制代码
from torch.utils.tensorboard import SummaryWriter
import numpy as np
from PIL import Image
# 利用openCV中的numpy库可以获得numpy型的图片

writer = SummaryWriter("log")
img_path = "../dataset/bees/26589803_5ba7000313.jpg"
img_PIL = Image.open(img_path)    # 打开图片
img_array = np.array(img_PIL)     # 图片转换
print(type(img_array))   # 打印图片类型
print(img_array.shape)  # 打印图片格式

writer.add_images("test", img_array, 2, dataformats='HWC')  # 根据img_array.shape来指定,如果不指定dataformats就会报错
# y = 2x
for i in range(100):
    writer.add_scalar("y=2x", 2*i, i)

writer.close()


三、Transforms的使用

transform表示对图片进行一些变换

python的用法 -> tensor数据类型

通过transform.ToTensor去解决两个问题:

transforms该如何使用(Python)

为什么我们需要Tensor的数据类型?

复制代码
from torchvision import transforms
from PIL import Image

img_path = "../dataset/bees/10870992_eebeeb3a12.jpg"
img = Image.open(img_path)
tensor_trans = transforms.ToTensor()
tensor_img = tensor_trans(img)
print(tensor_img)

运行后的结果

复制代码
D:\tools\anaconda\envs\pytorch\python.exe D:/code/captcha_ocr-main/learn/transforms.py
tensor([[[0.5725, 0.5725, 0.5725,  ..., 0.5686, 0.5725, 0.5765],
         [0.5725, 0.5725, 0.5725,  ..., 0.5686, 0.5725, 0.5765],
         [0.5686, 0.5686, 0.5725,  ..., 0.5686, 0.5725, 0.5765],
         ...,
         [0.5490, 0.5647, 0.5725,  ..., 0.6314, 0.6235, 0.6118],
         [0.5608, 0.5765, 0.5843,  ..., 0.5961, 0.5843, 0.5765],
         [0.5725, 0.5843, 0.5922,  ..., 0.5647, 0.5529, 0.5490]],

        [[0.4471, 0.4471, 0.4471,  ..., 0.4235, 0.4275, 0.4314],
         [0.4471, 0.4471, 0.4471,  ..., 0.4235, 0.4275, 0.4314],
         [0.4431, 0.4431, 0.4471,  ..., 0.4235, 0.4275, 0.4314],
         ...,
         [0.4000, 0.4157, 0.4235,  ..., 0.4706, 0.4627, 0.4510],
         [0.4118, 0.4275, 0.4353,  ..., 0.4431, 0.4314, 0.4235],
         [0.4235, 0.4353, 0.4431,  ..., 0.4118, 0.4000, 0.3961]],

        [[0.2471, 0.2471, 0.2471,  ..., 0.2588, 0.2627, 0.2667],
         [0.2471, 0.2471, 0.2471,  ..., 0.2588, 0.2627, 0.2667],
         [0.2431, 0.2431, 0.2471,  ..., 0.2588, 0.2627, 0.2667],
         ...,
         [0.2157, 0.2314, 0.2392,  ..., 0.2510, 0.2431, 0.2314],
         [0.2275, 0.2431, 0.2510,  ..., 0.2196, 0.2078, 0.2000],
         [0.2392, 0.2510, 0.2588,  ..., 0.1961, 0.1843, 0.1804]]])

Process finished with exit code 0

加载tensor类型的图片:

复制代码
from torchvision import transforms
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
img_path = "../dataset/bees/10870992_eebeeb3a12.jpg"
img = Image.open(img_path)
writer = SummaryWriter("log")
tensor_trans = transforms.ToTensor()
tensor_img = tensor_trans(img)
writer.add_image("Tensor_img", tensor_img)
writer.close()

四、常见的transforms类的使用

  1. ToTensor类
    将PIL图片转换成tensor图片。

    from torchvision import transforms
    from PIL import Image
    from torch.utils.tensorboard import SummaryWriter

    Tensor的使用

    writer = SummaryWriter("log")
    img_path = "../dataset/bees/10870992_eebeeb3a12.jpg"
    img = Image.open(img_path)
    print(img)
    tensor_trans = transforms.ToTensor() # 创建ToTensor()对象
    tensor_img = tensor_trans(img) # 传入图片参数,将PIL图片转换成tensor图片
    writer.add_image("Tensor_img", tensor_img)
    writer.close()

  1. Normalize类

对tensor类型的图片进行归一化处理。

Normalize的使用:归一化处理

公式:outputchannel = (inputchannel - meanchannel) / stdchannel

复制代码
from torchvision import transforms
from PIL import Image
from torch.utils.tensorboard import SummaryWriter

# Tensor的使用
writer = SummaryWriter("log")
img_path = "../dataset/bees/10870992_eebeeb3a12.jpg"
img = Image.open(img_path)
print(img)


tensor_trans = transforms.ToTensor()
tensor_img = tensor_trans(img)

writer.add_image("Tensor_img", tensor_img)

# Normalize的使用
print(tensor_img[0][0][0])    # 归一化处理之前的数据
trans_norm = transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
img_norm = trans_norm(tensor_img)
print(img_norm[0][0][0])     # 归一化处理后的结果
writer.add_image("Normalize", img_norm)

writer.close()


  1. Resize类:

重置图片大小。

复制代码
from torchvision import transforms
from PIL import Image
from torch.utils.tensorboard import SummaryWriter

# Tensor的使用
writer = SummaryWriter("log")
img_path = "../dataset/bees/10870992_eebeeb3a12.jpg"
img = Image.open(img_path)
print(img)


tensor_trans = transforms.ToTensor()
tensor_img = tensor_trans(img)

writer.add_image("Tensor_img", tensor_img)

print(tensor_img[0][0][0])    # 归一化处理之前的数据
trans_norm = transforms.Normalize([1, 3, 5], [3, 2, 1])
img_norm = trans_norm(tensor_img)
print(img_norm[0][0][0])     # 归一化处理后的结果
writer.add_image("Normalize", img_norm)

writer.close()

# Resize的使用:重置图片大小
print(img.size)    # (500, 464) 
trans_resize = transforms.Resize((512, 512))

img_resize = trans_resize(img)
print(img_resize)   # <PIL.Image.Image image mode=RGB size=512x512 at 0x2A17E774248> 
 
img_resize = tensor_trans(img_resize)
writer.add_image("Resize", img_resize, 0)
print("" + img_resize)
writer.close()


  1. Compose的使用

等比例缩放。

Compose的使用:整体缩放,不改变高宽比例

Compose()中的参数需要的是一个列表,列表中的数据需要的是transforms类型。

即 Compose(transforms参数1, transforms参数2, ...)

复制代码
from torchvision import transforms
from PIL import Image
from torch.utils.tensorboard import SummaryWriter

# Tensor的使用
writer = SummaryWriter("log")
img_path = "../dataset/bees/10870992_eebeeb3a12.jpg"
img = Image.open(img_path)
print(img)


tensor_trans = transforms.ToTensor()
tensor_img = tensor_trans(img)

writer.add_image("Tensor_img", tensor_img)

print(tensor_img[0][0][0])    # 归一化处理之前的数据
trans_norm = transforms.Normalize([1, 3, 5], [3, 2, 1])
img_norm = trans_norm(tensor_img)
# print(img_norm[0][0][0])     # 归一化处理后的结果
writer.add_image("Normalize", img_norm)


# Resize的使用:重置图片大小
print(img.size)    # (500, 464)
trans_resize = transforms.Resize((512, 512))

img_resize = trans_resize(img)
print(img_resize)   # <PIL.Image.Image image mode=RGB size=512x512 at 0x2A17E774248>

# Compose的使用
img_resize = tensor_trans(img_resize)
writer.add_image("Resize", img_resize, 0)
# print(img_resize)
trans_resize_2 = transforms.Resize(1024)
trans_compose = transforms.Compose([trans_resize_2, tensor_trans])
img_resize_2 = trans_compose(img)
writer.add_image("Resize", img_resize_2, 1)

writer.close()

5.RandomCrop类的使用

随机裁剪。

复制代码
from torchvision import transforms
from PIL import Image
from torch.utils.tensorboard import SummaryWriter

# Tensor的使用
writer = SummaryWriter("log")
img_path = "../dataset/bees/10870992_eebeeb3a12.jpg"
img = Image.open(img_path)
print(img)


tensor_trans = transforms.ToTensor()
tensor_img = tensor_trans(img)

writer.add_image("Tensor_img", tensor_img)

print(tensor_img[0][0][0])    # 归一化处理之前的数据
trans_norm = transforms.Normalize([1, 3, 5], [3, 2, 1])
img_norm = trans_norm(tensor_img)
# print(img_norm[0][0][0])     # 归一化处理后的结果
writer.add_image("Normalize", img_norm)


# Resize的使用:重置图片大小
print(img.size)    # (500, 464)
trans_resize = transforms.Resize((512, 512))

img_resize = trans_resize(img)
print(img_resize)   # <PIL.Image.Image image mode=RGB size=512x512 at 0x2A17E774248>


#  Compose的使用:
img_resize = tensor_trans(img_resize)
writer.add_image("Resize", img_resize, 0)
# print(img_resize)
trans_resize_2 = transforms.Resize(1024)
trans_compose = transforms.Compose([trans_resize_2, tensor_trans])
img_resize_2 = trans_compose(img)
writer.add_image("Resize", img_resize_2, 1)


# RendomCrop类的使用:随机裁剪
# trans_random = transforms.RandomCrop(512)
trans_random = transforms.RandomCrop(1000, 500)
trans_compose_2 = transforms.Compose([trans_random, tensor_trans])
for i in range(10):
    img_crop = trans_compose_2(img)
    # writer.add_image("RancomCrop", img_crop, i)
    writer.add_image("RancomCropHW", img_crop, i)

writer.close()
相关推荐
吴佳浩1 天前
《拆解全球最火 AI 开源项目》第一季 · REA
人工智能
特立独行的猫A1 天前
用仓颉语言 cj-tauri 框架,五分钟给娃做了个鸿蒙形近字游戏
java·后端·python
AllData公司负责人1 天前
AI大模型数据开发底座系列说明书,AllData集成Chat2DB开源项目建设AI 数据库分析底座,涵盖AI 洞察/对话SQL/智能视图!
数据库·人工智能·sql·开源·ai 洞察·对话sql
泯泷1 天前
让 Agent 分清“马上办、等一等、顺手办”
人工智能·llm·agent
鲜于言悠9051 天前
Claude Fable 5.2 登场,专治复杂推理与长任务
人工智能
大可不必了1 天前
03 函数定义和调用
开发语言·python
联犀1 天前
如何工程化降低语音交互AI设备的延迟(小智ai,芙崽这样的ai设备)
人工智能
杉岩数据1 天前
杉岩数据董事长陈坚:从数据存储到行业智能——杉岩的AI时代战略布局
人工智能
冬奇Lab1 天前
Loop 工程到底是高深的新技术,还是炒冷饭?用训练一个识别狗的模型讲明白
人工智能
冬奇Lab1 天前
一天一个开源项目(第260篇):Plannotator —— 给 AI 编码 Agent 配一块「可批注的审阅台」,计划和代码改动都能在浏览器里逐条批示
人工智能·开源·claude