前言
该pytorch学习笔记应该配合b站小土堆的《pytorch深度学习快速入门教程》使用
环境配置:Anaconda Python编译器:pycharm、jupyter
-
两大法宝函数
dir():知道包中有什么东西(函数 / 属性...)
help():查看函数的使用说明
1. Dataset类代码实战
from torch.utils.data import Dataset
from PIL import Image #PIL 图像处理第三方库pillow
import os
# 创建类
class MyData(Dataset):
# __init__ 创建对象时自动调用 用于初始化对象属性
def __init__(self,label,path): #实例方法,默认第一个参数self需要接收到一个实例
self.label = label
self.path = path #私有属性公有化(路径)
self.img_path = os.listdir(self.path) #获取所有列表地址
# __getitem__ 对实例对象 根据index进行索引
def __getitem__(self, idx):
img_name = self.img_path[idx]
img_item_path = os.path.join(self.path,img_name) #路径拼接
img = Image.open(img_item_path) #获取对应图像信息
label = self.label
return img,label
# 返回列表长度
def __len__(self):
return len(self.img_path)
# 创建实例
ants_dataset = MyData("ants",r"D:\python code\pythonProject\dataset\train\ants")
len(ants_dataset)
img,label = ants_dataset[5]
img.show()
bees_dataset = MyData("bees",r"D:\python code\pythonProject\dataset\train\bees")
# 拼接数据集
train_dataset = ants_dataset + bees_dataset
len(train_dataset)
2.Tensorboard
TensorBoard 是一组用于数据可视化的工具
- TensorBoard的使用
主要是使用SummaryWriter类中的 .add_image(图片可视化) 以及 .add_scalar(数据可视化)方法,一般来说,只接受tensor或numpy类型的图像数据
from tensorboardX import SummaryWriter #导入类
########## .add_scalar数据可视化 ############
writer = SummaryWriter("logs") #创建实例 logs为文件名
for i in range(100):
writer.add_scalar("y=2x",2*i,i)
writer.close()
########### .add_image图像可视化 ###########
writer = SummaryWriter("logs")
writer.add_image(标题,tensor或numpy数据)
writer.close()
3.Transforms
3.1 Tensor数据类型的意义
Tensor数据类型包装了 神经网络理论所需要的一些参数
3.2 常见的transform工具
-
transform如何使用
transform是一个工具箱,里面有很多 类(如ToTensor、resize),一般我们根据类去实例化出具体的对象,然后再利用__call__函数,将对象当作函数调用
3.2.1 数据类型转换
ToTensor:将numpy或PIL Image类型的图片 转化为 tensor类型
ToPILImage:将tensor或numpy数据类型 转化为 PIL Image类型
from torchvision import transforms
from PIL import Image
img_path = r"D:\python code\pythonProject\dataset\train\ants\0013035.jpg"
img = Image.open(img_path)
print(img)
# 将PIL Image类型(图片)转化为tensor
tensor_trans = transforms.ToTensor() # 创建实例(工具)
tensor_img = tensor_trans(img) # 利用call内置方法 像函数一样调用实例(使用工具)
3.2.2 其他
- 注意事项:1.关注输入输出类型 2.学会看官方文档(按住CTRL点相应函数)
方法 | transform工具 | 说明 | input |
归一化 | Normalize | 对数据进行标准化处理 | 实例化:mean std列表 调用:tensor类型 |
规格调整 | Resize | 调整输入图片的规格(大小) | 实例化:序列 调用:PIL类型 |
组合 | Compose | 将多个transforms变换组合在一起, 并按照顺序执行 | 实例化: 含transform的list |
随机裁剪 | RandomCrop | 根据给定规格随机裁剪图片 | 实例化:序列 |
- 代码示例
from PIL import Image
from torchvision import transforms
from tensorboardX import SummaryWriter
writer = SummaryWriter("logs")
img = Image.open(r"D:\python code\pythonProject\image\OIP-C.jpg")
print(img)
# ToTensor
trans_tensor = transforms.ToTensor()
tensor_img = trans_tensor(img)
writer.add_image("ToTensor",tensor_img) #用Tensorboard可视化
# Normalize 归一化
print(tensor_img[0],[0],[0]) #归一化之前
trans_norm = transforms.Normalize([0.5,0.5,0.5],[0.5,0.5,0.5]) #图片为RGB三通道,所以三个均值,三个标准差
norm_img = trans_norm(tensor_img)
print(tensor_img[0],[0],[0]) #归一化之后
writer.add_image("Normalize",norm_img) #用Tensorboard可视化
# Resize 调整规格
print(img.size) #img为PIL数据类型
trans_resize = transforms.Resize((512,512))# 将size调整为512*512
resize_img = trans_resize(img) # resize_img为PIL数据类型
print(resize_img)
resize_img = trans_tensor(resize_img) # resize_img转换为tensor数据类型
writer.add_image("Resize",resize_img,0)
# Compose 组合
trans_resize2 = transforms.Resize((256,1024)) #调整规格
trans_compose = transforms.Compose([trans_tensor,trans_resize2]) #先转换数据类型 再调整规格
compose_img = trans_compose(img) #调用实例
writer.add_image("Compose",compose_img,1)
# RondomCrop 随机裁剪
trans_random = transforms.RandomCrop(100)
trans_compose2 = transforms.Compose([trans_random,trans_tensor])
for i in range(10):
randomcrop_img = trans_compose2(img)
writer.add_image("RandomCrop",randomcrop_img,i)
writer.close()
#最后在下方终端输入 tensorboard --logdir=文件名(logs) 即可打开tensorboard
4.torchvision中的数据集
torchvision专门用于处理图像,其主要包含三个部分:model包(提供了训练好的模型)、dataset包(提供大量数据集)、transform包(对Tensor或PIL image图像进行转换处理)
- dataset中的内置数据集使用 —— 以CIFAR-10数据集为例
CIFAR-10数据集:
由 10 个类的 60000 张 32x32 彩色图像组成,每个类有 6000 张图像。
有 50000 张训练图像和 10000 张测试图像。
注:图像.show() 只能对PIL图像使用,如果是含PIL和其它参数的元组,无法使用
-
代码示例
在 torchvision.datasets.CIFAR10()的参数中可以直接选用设定好的transform工具,直接导入处理好的数据
import torchvision
from tensorboardX import SummaryWriter
# 与transforms进行联动
dataset_transfrom = torchvision.transforms.Compose([
torchvision.transforms.ToTensor(),
torchvision.transforms.Resize(128)]) #先Tensor 后调整大小
# 导入数据集 —— 训练集与测试集(注意后面的参数)
train_set = torchvision.datasets.CIFAR10(root=r"D:\python code\pythonProject\dataset",
train = True,download=True,transform=dataset_transfrom)
test_set = torchvision.datasets.CIFAR10(root=r"D:\python code\pythonProject\dataset",
train = False,download=True,transform=dataset_transfrom)
writer = SummaryWriter("logs2")
for i in range(10):
img,target = test_set[i] #等号后 为 含tensor图像信息和图像标签target的元组
writer.add_image("torchvision",img,i)
writer.close() #!!!不要忘记关闭读写
5.dataloader的使用
简介:
Dataloader是一个数据读取机制,它由数据集(dataset)和采样器(sampler)两个模块组成。主要是根据sampler提供的索引在dataset中读取数据。
Dataloader的主要目的是将数据分批读取计算,节省显存
- 示例
import torchvision
from torch.utils.data import DataLoader
from tensorboardX import SummaryWriter
#准备测试的数据集(主要是说明数据集的位置)
test_data = torchvision.datasets.CIFAR10(root=r"D:\python code\pythonProject\dataset",
train=False,transform=torchvision.transforms.ToTensor())
# batch_size:每次抽出多少样本 shuffle:是否打乱样本顺序
test_loader = DataLoader(dataset=test_data,batch_size=64,shuffle=True,num_workers=0)
# 查看每次抽取出的样本
writer = SummaryWriter("dataloader")
step = 0
for data in test_loader:
imgs,targets = data
writer.add_images("test_data",imgs,step)
step = step + 1
writer.close()
#最后在下方终端输入 tensorboard --logdir=文件名 即可打开tensorboard