{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 1.Dataloader与Dataset\n", "\n", "Q:如何用torch.utils.data.DataLoader构建可迭代的数据装载器?\n", "- 这是个类:`torch.utils.data.DataLoader(dataset, batch_size=1, shuffle=False, sampler=None, batch_sampler=None, num_workers=0, collate_fn=None, pin_memory=False, drop_last=False, timeout=0, worker_init_fn=None, multiprocessing_context=None, generator=None)`\n", "- dataset: Dataset类,决定数据从哪读取及如何读取\n", "- batchsize:批大小\n", "- num_works:是否多进程读取数据\n", "- shuffle:每个epoch是否乱序\n", "- drop_last:当样本数不能被batchsize整除时,是否舍弃最后一批数据\n", "\n", "Q:torch.utils.data.Dataset的功能是什么?\n", "- Dataset抽象类,所有自定义的Dataset需要继承它,并且复写__getitem__()\n", "- getitem:接收一个索引,返回一个样本\n", "- 要如何读取样本,是用户需要自定义的\n", "- ![](http://anki190912.xuexihaike.com/20200920111241.png?imageView2/2/h/150)\n", "\n", "Q:DataLoader数据读取三问:读哪些,从哪读,怎么读\n", "- 1.读哪些?Sampler输出的Index\n", "- 2.从哪读?Dataset中的data_dir\n", "- 3.怎么读?Dataset的getitem\n", "\n", "Q:DataLoader数据读取流程是怎样?\n", "- ![](http://anki190912.xuexihaike.com/20200920115859.png)\n", "- 1.在for循环中使用DataLoader\n", "- 2.根据是否采用多进程还是单进程的DataLoaderIter\n", "- 3.使用Sampler获得index索引\n", "- 4.拿到index索引然后给DatasetFetcher\n", "- 5.在这里调用Dataset\n", "- 6.Dataset根据给定的索引在getitem中在硬盘里读取实际的图像和和标签\n", "- 7.读取了一个batchsize大小的图像后,通过collate_fn进行整理成一个Batch Data形式,然后输入到模型中训练" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 2.transforms与normalize\n", "\n", "Q:torchvision(计算机视觉工具包)中有哪些模块以及相应的作用?\n", "- torchvision.transforms:常用的图像预处理方法\n", "- torchvision.datasets:常用数据集的dataset实现,MNIST,CIFAR-10,ImageNet等\n", "- torchvision.model:常用的模型预训练,AlexNet,VGG,ResNet,GoogLeNet等\n", "\n", "Q:pytorch的transform机制是在哪一步做?\n", "- ![](http://anki190912.xuexihaike.com/20200920150244.png)\n", "\n", "Q:如何逐channel地对图像进行标准化?\n", "- `transforms.Normalize(mean, std, inplace=False)`\n", "- output = (input - mean) / std\n", "- mean:各通道的均值\n", "- std:各通道的标准差\n", "- inplace:是否原地操作\n", "\n", "# 3.transforms图像增强(一)\n", "Q:如何从图像中心裁剪图片?\n", "- `transforms.CenterCrop`\n", "- size:所需裁剪图片尺寸\n", "\n", "Q:如何从图片中随机裁剪出尺寸为size的图片?\n", "- `transforms.RandomCrop(size, padding=None, pad_if_needed=False, fill=0, padding_mode='constant')`\n", "- size:所需裁剪图片尺寸\n", "- padding:设置填充大小\n", " - 当为a时,上下左右均填充a个像素\n", " - 当为(a,b)时,上下填充b个像素,左右填充a个像素\n", " - 党委(a,b,c,d)时,左,上,右,下分别填充a,b,c,d\n", "- pad_if_need:若图像小于设定size,则填充\n", "- padding_mode:填充模式,有4种模式\n", " - constand:像素值由fill设定\n", " - edge:像素值由图像边缘像素决定\n", " - reflect:镜像填充,最后一个像素不镜像,e.g.:[1,2,3,4]->[3,2,1,2,3,4,3,2]\n", " - symmetric:镜像填充,最后一个像素镜像,e.g.:[1,2,3,4]->[2,1,1,2,3,4,4,3]\n", "- fill:constant时,设置填充的像素值,(R,G,B) or (Gray)\n", "\n", "Q:如何随机大小、长宽比裁剪图片?\n", "- `RandomResizedCrop(size, scale=(0.08, 1.0), ratio=(3/4, 4/3), interpolation)`\n", "- size:所需裁剪图片尺寸\n", "- scale:随机裁剪面积比例,默认(0.08, 1)\n", "- ratio:随机长宽比,默认(3/4, 4/3)\n", "- interpolation:插值方法\n", " - PIL.Image.NEAREST\n", " - PIL.Image.BILINEAR\n", " - PIL.Image.BICUBIC\n", "\n", "Q:FiveCrop和TenCrop的功能是什么?\n", "- `transforms.FiveCrop(size)`\n", "- `transforms.TenCrop(size, vertival_flip=False)`\n", "- 功能:在图像的上下左右以及中心裁剪出尺寸为size的5张图片,TenCrop对这5张图片进行水平或者垂直镜像获得10张图片\n", "- size:所需裁剪图片尺寸\n", "- vertical_flip:是否垂直翻转\n", "\n", "Q:如何按照概率水平(左右)或垂直(上下)翻转图片?\n", "- `RandomHorizontalFlip(p=0.5)`\n", "- `RandomVerticalFlip(p=0.5)`\n", "- p:翻转概率\n", "\n", "Q:如何随机旋转图片?\n", "- `RandomRotation(degress, resample=False, expand=False, center=None)`\n", "- degree:旋转角度\n", " - 当为a时,在(-a, a)之间选择旋转角度\n", " - 当为(a, b)时,在(a,b)之间选择旋转角度\n", "- resample:重采样方法\n", "- expand:是否扩大图片,以保持原图信息\n", "- center:旋转点设置,默认中心选择\n", "\n", "# 4.transforms图像增强(二)\n", "Q:如何对图像边缘进行填充?\n", "- `transforms.Pad(padding, fill=0, padding_mode='constant')`\n", "- padding:设置填充大小\n", " - 当为a时,上下左右均填充a个像素\n", " - 当为(a,b)时,上下填充b个像素,左右填充a个像素\n", " - 党委(a,b,c,d)时,左,上,右,下分别填充a,b,c,d\n", "- padding_mode:填充模式,有4种模式\n", " - constand:像素值由fill设定\n", " - edge:像素值由图像边缘像素决定\n", " - reflect:镜像填充,最后一个像素不镜像,e.g.:[1,2,3,4]->[3,2,1,2,3,4,3,2]\n", " - symmetric:镜像填充,最后一个像素镜像,e.g.:[1,2,3,4]->[2,1,1,2,3,4,4,3]\n", "- fill:constant时,设置填充的像素值,(R,G,B) or (Gray)\n", "\n", "Q:如何调整亮度、对比度、 饱和度和色相?\n", "- `transforms.ColorJitter(brightness=0, contrast=0, saturation=0, hue=0)`\n", "- brightness:亮度调整因子\n", " - 当为a时,从[max(0, 1-a), 1+a]中随机选择\n", " - 当为(a,b)时,从[a,b]中\n", "- contrast:对比度参数,同brightness\n", "- saturation:饱和度参数,同brightness\n", "- hue:色相参数\n", " - 当为a时,从[-a, a]中选择参数,注:0<=a<=0.5\n", " - 当为(a,b)时,从[a,b]中选择参数,注:-0.5 <= a <= b <= 0.5\n", "\n", "Q:如何对把彩色图像转换为灰度图像?\n", "- `Grayscale(num_output_channels)`\n", "- `RandomGrayscale(num_output_channels, p=0.1)`\n", "- num_output_channels:输出通道数,只能设1或3\n", "- p:概率值,图像被转换为灰度图的概率\n", "\n", "Q:如何对图像进行仿射变换?\n", "- `RandomAffile(degrees, translate=None, scale=None, shear=None, resample=False, fillcolor=0)`\n", "- 仿射变换是二维的线性变换,由五种基本原子变换构成,分别是选择、平移、缩放、错切和翻转\n", "- degrees:旋转角度设置\n", "- translate:平移区间设置,如(a,b),a设置宽(width),b设置高(height),图像在宽维度平移的区间为-img_width * a < dx < img_width * a\n", "- scale:缩放比例(以面积为单位)\n", "- fill_color:填充颜色设置\n", "- shear:错切角度设置,有水平错切和垂直错切\n", " - 若为a,则仅在x轴错切,错切角度为(-a, a)之间\n", " - 若为(a, b),则a设置x轴角度,b设置y的角度\n", " - 若为(a, b, c, d),则a, b设置x轴角度,c, d设置y轴角度\n", "- resample:重采样方式,有NEAREST、BILINEAR、BICUBIC\n", "\n", "Q:如何对图像进行随机遮挡?\n", "- `RandomErasing(p=0.5, scale=(0.02, 0.33), ratio=(0.3, 3.3), value=0, inplace=Flase)`\n", "- p:概率值,执行该操作的概率\n", "- scale:遮挡区域的面积\n", "- ratio:遮挡区域长宽比\n", "- value:设置遮挡区域的像素值,(R,G,B) or (Gray) or 任意字符串\n", "- 参考文献:《Random Erasing Data Augmentation》\n", "- 注意:这个接收的是Tensor,所以在上一步需要执行`transforms.ToTensor()`\n", "\n", "Q:如何自定义lambda方法?\n", "- `transforms.Lambda(lambd)`\n", "- lambd:lambda匿名函数\n", "- lambda [arg1 [, arg2, ..., argn]]:expression\n", "- ```python\n", "transforms.TenCrop(200, vertical_flip=True)\n", "transforms.Lambda(lambda crops: torch.stack([transforms.Totensor()(crop) for crop in crops]))\n", "```\n", "\n", "Q:如何从一系列transforms方法中随机挑选一个?\n", "- `transforms.RandomChoice([transforms1, transforms2, transforms3])`\n", "\n", "Q:如何依概率执行一组transforms操作?\n", "- `transforms.RandomApply([transforms1, transforms2, transforms3], p=0.5)`\n", "\n", "Q:如何对一组transforms操作打乱顺序?\n", "- `transforms.RandomOrder([transforms1, transforms2, transforms3])`\n", "\n", "Q:用户如何自定义transforms方法?\n", "- 调用方法:\n", "- ```python\n", "class Compose(object):\n", " def __call__(self, img):\n", " for t in self.transforms:\n", " img = t(img)\n", " return img\n", "```\n", "- 要素:\n", " - 1.仅接收一个参数,返回一个参数\n", " - 2.注意上下游的输出与输入\n", "- 通过类实现多参数传入:\n", "- ```python\n", "class YourTransforms(object):\n", " def __init__(self, ...):\n", " ...\n", " def __call__(self, img):\n", " ...\n", " return img\n", "```" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.12" } }, "nbformat": 4, "nbformat_minor": 4 }