Pytorch快速入门(一)

一、Python两大法宝

 Python语法有两大法宝:dir()、help() 函数。

        dir():打开,看见里面有多少分区、多少工具。

        help():说明书,查看使用方法。

import torch
print(torch.cuda.is_available())
help(torch.cuda.is_available) # 查看 torch.cuda.is_available 的用法
dir(torch)  # 查看torch包中有哪些区、有哪些工具

二、Pytorch加载数据

1.Pytorch中加载数据需要Dataset、Dataloader。

        Dataset提供一种方式去获取每个数据及其对应的label,告诉我们总共有多少个数据。

        Dataloader为后面的网络提供不同的数据形式,它将一批一批数据进行一个打包。

2.常用数据集两种形式

        常用的第一种数据形式,文件夹的名称是它的label。

        常用的第二种形式,lebel为文本格式,文本名称为图片名称,文本中的内容为对应的label。

from torch.utils.data import Dataset
help(Dataset)

使用help函数,显示该如何运用 

3.路径直接加载数据

from PIL import Image

img_path = "Data/FirstTypeData/train/ants/0013035.jpg"        
img = Image.open(img_path)
img.show()

 4. Dataset加载数据

from torch.utils.data import Dataset
from PIL import Image
import os

class MyData(Dataset):     
    def __init__(self,root_dir,label_dir):    # 该魔术方法当创建一个事例对象时,会自动调用该函数
        self.root_dir = root_dir # self.root_dir 相当于类中的全局变量
        self.label_dir = label_dir     
        self.path = os.path.join(self.root_dir,self.label_dir) # 字符串拼接,根据是Windows或Lixus系统情况进行拼接               
        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 = "Data/FirstTypeData/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)
print(len(ants_dataset))
print(len(bees_dataset))
train_dataset = ants_dataset + bees_dataset # train_dataset 就是两个数据集的集合了     
print(len(train_dataset))

img,label = train_dataset[200]
print("label:",label)
img.show()

三、Tensorboard用途

        Tensorboad 可以用来查看loss是否按照我们预想的变化,或者查看训练到某一步输出的图像是什么样。

1.tensorboard写日志

如果正确安装tensorboard之后,重新运行代码,还是报错在torch.utils.tensorboard中找不到SummaryWriter,请通过pip进行安装:
pip install -i https://mirrors.aliyun.com/pypi/simple/ tensorboardX,因为SummaryWriter是存在于tensorboardX(其作为tensorboard的子模块)同时请将报错的:
from torch.utils.tensorboard import SummaryWriter
改为:
from tensorboardX import SummaryWriter
from tensorboardX import SummaryWriter

writer = SummaryWriter("logs2") # 创建一个logs文件夹,writer写的文件都在该文件夹下
#writer.add_image()
for i in range(100):
    writer.add_scalar("y+2x", 2*i, i)
writer.close()

2. Tensorboard 读日志

        在 Anaconda 终端里面,激活环境,再输入 tensorboard --logdir=C:\Users\wangy\Desktop\03CV\logs 命令,将网址赋值浏览器的网址栏,回车,即可查看tensorboard显示日志情况。

        为避免多人使用端口导致冲突,也可以在后面加上后缀,使得端口独立,tensorboard --logdir=C:\Users\wangy\Desktop\03CV\logs --port=6008 

        输入网址可得Tensorboard界面。 

3. Tensorboard 读图片

 

from tensorboardX import SummaryWriter
from PIL import Image
import numpy as np

img_path1 = "dataset/train/ants/45472593_bfd624f8dc.jpg"
img_PIL1 = Image.open(img_path1)
img_array1 = np.array(img_PIL1)

img_path2 = "dataset/train/bees/95238259_98470c5b10.jpg"
img_PIL2 = Image.open(img_path2)
img_array2 = np.array(img_PIL2)

writer = SummaryWriter("logs")
writer.add_image("test",img_array1,1,dataformats="HWC") # 1 表示该图片在第1步
writer.add_image("test",img_array2,2,dataformats="HWC") # 2 表示该图片在第2步
writer.close()

四、transforms的使用

1.transforms的用途

        Transforms当成工具箱的话,里面的class就是不同的工具。例如像totensor、resize这些工具。

        Transforms拿一些特定格式的图片,经过Transforms里面的工具,获得我们想要的结果。

2.Transforms该如何使用

2.1 transforms.Totensor使用

from torchvision import transforms
from PIL import Image

# 图像文件路径
img_path = "dataset/train/bees/90179376_abc234e5f4.jpg"

# 使用PIL库打开图像文件
img = Image.open(img_path)

# 创建transforms.ToTensor类的实例化对象
tensor_trans = transforms.ToTensor()

# 调用transforms.ToTensor类的__call__的魔术方法,将图像转换为张量
tensor_img = tensor_trans(img)

# 打印转换后的张量
print(tensor_img)

2.2 需要Tensor数据类型原因

        Tensor有一些属性,比如反向传播、梯度等属性,它包装了神经网络需要的一些属性。

        

# 导入必要的库
from tensorboardX import SummaryWriter  # 导入用于TensorBoard可视化的库
from torchvision import transforms  # 导入用于图像转换的库
from PIL import Image  # 导入用于图像处理的库
import cv2  # 导入OpenCV库

# 图像文件路径
img_path = "dataset/train/bees/85112639_6e860b0469.jpg"

# 使用PIL库打开图像文件
img = Image.open(img_path)

# 创建TensorBoard的SummaryWriter对象,用于记录日志和可视化
writer = SummaryWriter("logs")

# 创建图像转换操作,将PIL图像转换为PyTorch张量
tensor_trans = transforms.ToTensor()
tensor_img = tensor_trans(img)

# 将图像张量添加到TensorBoard日志中,"Temsor_img"是可视化时显示的图像名称
writer.add_image("Tensor_img", tensor_img)

# 关闭SummaryWriter,确保将日志写入到TensorBoard文件
writer.close()

下面操作与上一步相同,就不在说明了

3. 常见的Transforms工具

3.1 __call__魔术方法使用

class Person:
    def __call__(self, name):
        print("__call__ " + "Hello " + name)

    def hello(self, name):
        print("hello " + name)


person = Person()  # 实例化对象
person("zhangsan")  # 调用__call__魔术方法
person.hello("list")  # 调用hello方法

3.2 Normanize归一化

# 导入必要的库
from tensorboardX import SummaryWriter  # 用于 TensorBoard 可视化的库
from torchvision import transforms  # 用于图像转换的库
from PIL import Image  # Python Imaging Library,用于图像处理
import cv2  # OpenCV 库,用于计算机视觉任务

# 图像文件路径
img_path = "dataset/train/bees/154600396_53e1252e52.jpg"

# 使用 PIL 库打开图像文件
img = Image.open(img_path)

# 创建 TensorBoard 的 SummaryWriter 对象,用于记录日志和可视化
writer = SummaryWriter("logs")

# 创建图像转换操作,将 PIL 图像转换为 PyTorch 张量
tensor_trans = transforms.ToTensor()
img_tensor = tensor_trans(img)

# 打印原始图像张量中第一个像素的值
print("原始图像张量中第一个像素的值:", img_tensor[0][0][0])

# 创建图像标准化转换操作,将原始图像张量标准化
tensor_norm = transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
img_norm = tensor_norm(img_tensor)

# 打印标准化后图像张量中第一个像素的值
print("标准化后图像张量中第一个像素的值:", img_norm[0][0][0])

# 将原始图像张量和标准化后的图像张量添加到 TensorBoard 日志中
writer.add_image("img_tensor", img_tensor)
writer.add_image("img_norm", img_norm)

# 关闭 SummaryWriter,确保将日志写入到 TensorBoard 文件
writer.close()

tensor(0.2627)
tensor(-0.4745)

3.3 Resize裁剪

3.3.1 Resize裁剪方法一
# 导入必要的库
from tensorboardX import SummaryWriter  # 用于 TensorBoard 可视化的库
from torchvision import transforms  # 用于图像转换的库
from PIL import Image  # Python Imaging Library,用于图像处理
import cv2  # OpenCV 库,用于计算机视觉任务

# 图像文件路径
img_path = "dataset/train/bees/174142798_e5ad6d76e0.jpg"

# 使用 PIL 库打开图像文件
img = Image.open(img_path)
print("原始图像信息:", img)  # PIL 类型的图片原始比例为 500×464

# 创建 TensorBoard 的 SummaryWriter 对象,用于记录日志和可视化
writer = SummaryWriter("logs")

# 创建图像转换操作,将 PIL 图像转换为 PyTorch 张量
trans_totensor = transforms.ToTensor()
img_tensor = trans_totensor(img)

# 创建图像 resize 操作,将图像大小调整为 (512, 512)
trans_resize = transforms.Resize((512, 512))

# 图像 resize 操作:PIL 数据类型的 img -> resize -> PIL 数据类型的 img_resize
img_resize = trans_resize(img)

# 图像 resize 后再进行 totensor 操作:PIL 数据类型的 PIL -> totensor -> img_resize tensor
img_resize = trans_totensor(img_resize)

# 打印 resize 后的图像张量大小
print("resize 后图像张量的大小:", img_resize.size())  # PIL 数据类型的图片原始比例为 3×512×512,3 通道

# 将原始图像张量和 resize 后的图像张量添加到 TensorBoard 日志中
writer.add_image("img_tensor", img_tensor)
writer.add_image("img_resize", img_resize)

# 关闭 SummaryWriter,确保将日志写入到 TensorBoard 文件
writer.close()

 

3.3.2 Resize裁剪方法二
# 导入必要的库
from tensorboardX import SummaryWriter  # 用于 TensorBoard 可视化的库
from torchvision import transforms  # 用于图像转换的库
from PIL import Image  # Python Imaging Library,用于图像处理
import cv2  # OpenCV 库,用于计算机视觉任务

# 图像文件路径
img_path = "dataset/train/bees/174142798_e5ad6d76e0.jpg"

# 使用 PIL 库打开图像文件
img = Image.open(img_path)
print("原始图像信息:", img)  # PIL 类型的图片原始比例为 500×464

# 创建 TensorBoard 的 SummaryWriter 对象,用于记录日志和可视化
writer = SummaryWriter("logs")

# 创建图像转换操作,将 PIL 图像转换为 PyTorch 张量
trans_totensor = transforms.ToTensor()
img_tensor = trans_totensor(img)

# 创建第二个图像 resize 操作,将图像大小调整为 (512, 512)
trans_resize_2 = transforms.Resize((512, 512))

# 使用 transforms.Compose 创建一个复合转换
trans_compose = transforms.Compose([trans_resize_2, trans_totensor])

# 应用复合转换到原始图像
img_composed = trans_compose(img)

# 打印复合转换后的图像张量大小
print("复合转换后图像张量的大小:", img_composed.size())  # PIL 数据类型的图片原始比例为 3×512×512,3 通道

# 将原始图像张量和复合转换后的图像张量添加到 TensorBoard 日志中
writer.add_image("img_tensor", img_tensor)
writer.add_image("img_composed", img_composed)

# 关闭 SummaryWriter,确保将日志写入到 TensorBoard 文件
writer.close()

原始图像信息: <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=500x289 at 0x29C5ABEFA48>
复合转换后图像张量的大小: torch.Size([3, 512, 512])

3.4 RandomCrop随即裁剪

3.4.1 Resize裁剪方法一
# 导入必要的库
from tensorboardX import SummaryWriter  # 用于 TensorBoard 可视化的库
from torchvision import transforms  # 用于图像转换的库
from PIL import Image  # Python Imaging Library,用于图像处理
import cv2  # OpenCV 库,用于计算机视觉任务

# 图像文件路径
img_path = "dataset/train/bees/174142798_e5ad6d76e0.jpg"

# 使用 PIL 库打开图像文件
img = Image.open(img_path)
print("原始图像信息:", img)

# 创建 TensorBoard 的 SummaryWriter 对象,用于记录日志和可视化
writer = SummaryWriter("logs")

# 创建图像转换操作,将 PIL 图像转换为 PyTorch 张量
tensor_trans = transforms.ToTensor()
img_tensor = tensor_trans(img)
# 将原始图像张量添加到 TensorBoard 日志中
writer.add_image("img_tensor", img_tensor)

# 创建随机裁剪转换操作,将图像大小裁剪为 (256, 256)
trans_random = transforms.RandomCrop(256)

# 使用 transforms.Compose 创建一个复合转换
trans_compose_2 = transforms.Compose([trans_random, tensor_trans])

# 多次应用复合转换,添加裁剪后的图像到 TensorBoard 日志中
for i in range(10):
    img_crop = trans_compose_2(img)
    writer.add_image("RandomCrop", img_crop, i)
    print("裁剪后图像大小:", img_crop.size())

# 关闭 SummaryWriter,确保将日志写入到 TensorBoard 文件
writer.close()

原始图像信息: <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=500x289 at 0x181EC32FCC8>
裁剪后图像大小: torch.Size([3, 256, 256])
裁剪后图像大小: torch.Size([3, 256, 256])
裁剪后图像大小: torch.Size([3, 256, 256])
裁剪后图像大小: torch.Size([3, 256, 256])
裁剪后图像大小: torch.Size([3, 256, 256])
裁剪后图像大小: torch.Size([3, 256, 256])
裁剪后图像大小: torch.Size([3, 256, 256])
裁剪后图像大小: torch.Size([3, 256, 256])
裁剪后图像大小: torch.Size([3, 256, 256])
裁剪后图像大小: torch.Size([3, 256, 256])

注意:裁剪后的尺寸大小不能超过本身的长和宽

3.4.2 RandomCrop随即裁剪方式二
# 导入必要的库
from tensorboardX import SummaryWriter  # 用于 TensorBoard 可视化的库
from torchvision import transforms  # 用于图像转换的库
from PIL import Image  # Python Imaging Library,用于图像处理
import cv2  # OpenCV 库,用于计算机视觉任务

# 图像文件路径
img_path = "dataset/train/bees/132826773_dbbcb117b9.jpg"

# 使用 PIL 库打开图像文件
img = Image.open(img_path)
print("原始图像信息:", img)

# 创建 TensorBoard 的 SummaryWriter 对象,用于记录日志和可视化
writer = SummaryWriter("logs")

# 创建图像转换操作,将 PIL 图像转换为 PyTorch 张量
tensor_trans = transforms.ToTensor()
img_tensor = tensor_trans(img)
# 将原始图像张量添加到 TensorBoard 日志中
writer.add_image("img_tensor", img_tensor)

# 创建随机裁剪转换操作,将图像大小裁剪为 (312, 100)
trans_random = transforms.RandomCrop((100, 100))  # 指定随机裁剪的宽和高
trans_compose_2 = transforms.Compose([trans_random, tensor_trans])

# 多次应用复合转换,添加裁剪后的图像到 TensorBoard 日志中
for i in range(10):
    img_crop = trans_compose_2(img)
    writer.add_image("RandomCrop", img_crop, i)
    print("裁剪后图像大小:", img_crop.size())

# 关闭 SummaryWriter,确保将日志写入到 TensorBoard 文件
writer.close()

原始图像信息: <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=500x334 at 0x17071CDFF88>
裁剪后图像大小: torch.Size([3, 100, 100])
裁剪后图像大小: torch.Size([3, 100, 100])
裁剪后图像大小: torch.Size([3, 100, 100])
裁剪后图像大小: torch.Size([3, 100, 100])
裁剪后图像大小: torch.Size([3, 100, 100])
裁剪后图像大小: torch.Size([3, 100, 100])
裁剪后图像大小: torch.Size([3, 100, 100])
裁剪后图像大小: torch.Size([3, 100, 100])
裁剪后图像大小: torch.Size([3, 100, 100])
裁剪后图像大小: torch.Size([3, 100, 100])

  • 14
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值