数据

划分

训练集(train set)、验证集(valid/dev set)、测试集(test set) = 随堂测试、模拟考、高考

加载流程

1.数据预处理
2.构建MyDataset实例
3.构建Dataloader

数据预处理

PyTorch 做数据增强的方法是在原始图片上进行的,并覆盖原始图片。

# 设置均值,标准差,以及数据标准化
normMean = [0.4948052, 0.48568845, 0.44682974]
normStd = [0.24580306, 0.24236229, 0.2603115]
normTransform = transforms.Normalize(normMean, normStd)    # 以通道为单位进行计算均值,标准差。
# transforms.Compose 将所需要进行的处理给 compose 起来,并且需要注意顺序!
trainTransform = transforms.Compose([    
transforms.Resize(32),
transforms.RandomCrop(32, padding=4),    # 随机剪裁
transforms.ToTensor(),    # 对数据进行 transpose,h*w*c变成 c*h*w 再除以 255,使得像素值归一化至[0-1]之间
normTransform    # 数据标准化(减均值,除以标准差)
])

构建MyDataset实例

MyDataset 主要获取图片的索引以及定义如何通过索引读取图片及其标签。

# return img, label
train_data = MyDataset(txt_path=train_txt_path, transform=trainTransform)
valid_data = MyDataset(txt_path=valid_txt_path, transform=validTransform)

PyTorch 读取图片,主要是通过 Dataset 类,Dataset是MyDataset(所有datasets )的基类。

class Dataset(object):
   	def __getitem__(self, index):  # 接收一个 list 的 index,然后返回图片数据的路径和标签
   	def __len__(self):
   	def __add__(self, other):

流程:

  1. 制作存储了图片的路径和标签信息的 txt
    读取图片路径,标签,保存到 txt 文件中。txt 中的路径,是以训练时的那个 py 文件所在的目录为工作目录。
  2. 将这些信息转化为 list,该 list 每一个元素对应一个样本
  3. 通过 getitem 函数,读取数据和标签,并返回数据和标签

构建Dataloader

DataLoader触发Mydataset 中的 getiterm 函数读取一张图片的数据和标签,并拼接成一个 batch 返回,作为模型真正的输入。

# 返回一个batch的list,有两个元素,图片和标签
train_loader = DataLoader(dataset=train_data, batch_size=train_bs, shuffle=True)
valid_loader = DataLoader(dataset=valid_data, batch_size=valid_bs)

详细流程

流程:从 MyDataset 来,到 MyDataset 去

1. main.py: train_data = MyDataset(txt_path=train_txt_path, ...--->
2. main.py: train_loader = DataLoader(dataset=train_data, ...) --->
3. main.py: for i, data in enumerate(train_loader, 0) --->
4. dataloder.py: class DataLoader(): def __iter__(self): return _DataLoaderIter(self) --->
5. dataloder.py: class _DataLoderIter(): def __next__(self): batch = self.collate_fn([self.dataset[i]
for i in indices]) --->
6. tool.py: class MyDataset(): def __getitem__(): img = Image.open(fn).convert('RGB') --->
7. tool.py: class MyDataset(): img = self.transform(img) --->
8. main.py: inputs, labels = data inputs, labels = Variable(inputs), Variable(labels) outputs =net(inputs)
  1. 通过 MyDataset 创建一个实例,在该实例中有路径,有处理图片的方法
  2. 初始化 DataLoder ,使 DataLoder 拥有图片的路径
  3. 在一个 iteration 进行时,才读取一个 batch 的图片数据。enumerate()函数会返回可迭代数据的一个“元素”。在这里 data 是一个 batch 的图片数据和标签, data 是一个 list
  4. class DataLoader()中再调用 class _DataLoderIter()
  5. _ DataLoderiter()类中跳到__next__(self)函数,通过indices = next(self.sample_iter) 获取一个 batch 的 indices,再通过batch = self.collate_fn([self.dataset[i] for i in indices])获取一个 batch 的数据(会调用 self.collate_fn 函数)
  6. self.collate_fn 中调用 MyDataset中的__getitem__()函数,通过 Image.open()读取图片数据
  7. 对原始图片数据进行一系列预处理(transform 中设置),最后返回 img, label,再通过 self.collate_fn 来拼接成一个 batch。一个 batch 是一个 list,有两个元素,第一个元素是图片数据,是一个4D 的 Tensor, shape 为(64,3,32,32),第二个元素是标签 shape 为(64)。
  8. 对数据进行转换成 Variable 类型,最终成为模型的输入。

transforms 的二十二个方法

裁剪——Crop

transforms.CenterCrop 中心裁剪
transforms.RandomCrop 随机裁剪
transforms.RandomResizedCrop 随机长宽比裁剪
transforms.FiveCrop 上下左右中心裁剪
transforms.TenCrop 上下左右中心裁剪后翻转

翻转和旋转——Flip and Rotation

transforms.RandomHorizontalFlip(p=0.5) 依概率 p 水平翻转
transforms.RandomVerticalFlip(p=0.5) 依概率 p 垂直翻转
transforms.RandomRotation 随机旋转

图像变换

transforms.Resize resize
transforms.Normalize 标准化
transforms.ToTensor 转为 tensor,并归一化至[0-1]
transforms.Pad 填充
transforms.ColorJitter 修改亮度、对比度和饱和度
transforms.Grayscale 转灰度图
transforms.LinearTransformation() 线性变换
transforms.RandomAffine 仿射变换
transforms.RandomGrayscale 依概率 p 转为灰度图
transforms.ToPILImage 将数据转换为 PILImage
transforms.Lambda: Apply a user-defined lambda as a transform.暂不了解,待补充

对 transforms 操作,使数据增强更灵活

transforms.RandomChoice(transforms), 从给定的一系列 transforms 中选一个进行操作
transforms.RandomApply(transforms, p=0.5),给一个 transform 加上概率,依概率进行操作
transforms.RandomOrder,将 transforms 中的操作随机打乱

摘自《Pytorch模型训练实用教程》。详情见:https://github.com/tensor-yu/PyTorch_Tutorial
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值