datasets:

datasets.ImageFolder()

1
2
3
4
5
dataset=torchvision.datasets.ImageFolder(
root, transform=None,
target_transform=None,
loader=<function default_loader>,
is_valid_file=None)

参数详解:
root:图片存储的根目录,即各类别文件夹所在目录的上一级目录。
transform:对图片进行预处理的操作(函数),原始图片作为输入,返回一个转换后的图片。
target_transform:对图片类别进行预处理的操作,输入为target,输出对其的转换。如果不传该参数,即对target不做任何转换,返回的顺序索引0,1,2…
loader:表示数据集加载方式,通常默认加载方式即可。
is_valid_file:获取图像文件的路径并检查该文件是否为有效文件的函数(用于检查损坏文件)

dataload:

1、torch.utils.data.DataLoader:对数据进行batch划分。它是一个数据加载器,结合了数据集和取样器,并且可以提供多个线程处理数据集。在训练模型时使用到此函数,用来把训练数据分成多个小组,此函数每次抛出一组数据,直至把所有的数据都抛出,就是做一个数据的初始化。

1
2
3
4
5
6
7
8
9
10
data_loader_train = torch.utils.data.DataLoader(
dataset=dataset_train,
batch_size=args.batch_size,
shuffle=False,
sampler=sampler_train,
batch_sampler=False,
num_workers=args.num_workers,
pin_memory=args.pin_mem,
drop_last=True,
)

参数详解:
dataset:dataset数据类型,输入的原始数据。
batch_size:int数据类型,批训练数据量的大小,默认为1。PyTorch训练模型时调用数据不是一行一行进行的,而是一捆一捆进行的。batch_size就是定义每次给神经网络多少行数据,如果设置成1,那就是一行一行进行。每次是随机读取大小为batch_size。如果dataset中的数据个数不是batch_size的整数倍,这最后一次把剩余的数据全部输出。若想把剩下的不足batch size个的数据丢弃,则将drop_last设置为True,会将多出来不足一个batch的数据丢弃。
sampler:Sampler数据类型,采样,默认设置为None。根据定义的策略从数据集中采样输入。如果定义采样规则,则洗牌(shuffle)设置必须为False。
shuffle:bool数据类型,默认为False,表示在每次迭代训练时是否将数据打乱。将输入数据的顺序打乱,是为了使数据更有独立性,但如果数据是有序列特征的,就不要设置成True了。
drop_last:bool数据类型,丢弃最后数据,默认为False。设置了batch_size 的数目后,最后一批数据未必是设置的数目,有可能会小些,这时你是否需要丢弃这批数据。
num_workers:int数据类型,工作者数量,默认是0。使用多少个子进程来导入数据。设置为0,就是使用主进程来导入数据。注意:这个数字必须是大于等于0的,负数估计会出错。
pin_memory:bool数据类型,内存寄存,默认为False。在数据返回前,是否将数据复制到CUDA内存中。
batch_sampler:Sampler数据类型,批量采样,默认设置为None。但每次返回的是一批数据的索引(注意:不是数据)。其和batch_size、shuffle 、sampler and drop_last参数是不兼容的。
timeout:numeric数据类型,超时,默认为0。是用来设置数据读取的超时时间的,但超过这个时间还没读取到数据的话就会报错,所以,数值必须大于等于0。
collate_fn:callable数据类型,将一小段数据合并成数据列表,默认设置是False。如果设置成True,系统会在返回前会将张量数据(Tensors)复制到CUDA内存中。(没怎么用过)
worker_init_fn:callable数据类型,子进程导入模式,默认为None。在数据导入前和步长结束后,根据工作子进程的ID逐个按顺序导入数据。
2、torch.utils.data.distributed.DistributedSampler():分布式数据,用于多卡训练,注意sampler.set_epoch(epoch)的使用
1
2
sampler_train = torch.utils.data.DistributedSampler(
dataset_train, num_replicas=num_tasks, rank=global_rank, shuffle=True)

dataset:输入的原始数据
num_replicas:参与分布式训练的进程数,默认情况下将自己检索这个参数。
rank:当前进程的编号,默认情况下将自己检索这个参数。
shuffle:是否打乱数据集,默认为True。
seed:当shuffle=True时,用于random的随机数种子。这个参数在所有分布式进程中必须保持一致,默认为False。
具体参见:链接1链接2

transforms:

1、transforms.Compose()
transforms.Compose()用于整合一系列的图像变换函数,将图片按照Compose()中的顺序依次处理。torch.nn.Sequential()transforms.Compose()起到相同的功能。torch.nn.Sequential()torch.jit.script()结合来导出模型。

1
2
3
4
5
6
7
8
9
10
11
12
13
'''Compose'''
transform1 = transforms.Compose([
transforms.CenterCrop(10),
transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225)),
])

'''Sequential'''
transform2 = torch.nn.Sequential(
transforms.CenterCrop(10),
transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225)),
)
scripted_transforms = torch.jit.script(transforms)


torch.nn.Sequential()transforms.Compose()中都能加入一系列的图像变换函数,相关transforms中数据增强、图像变换的方法可参见链接

2、内部具体函数
transforms.RandomResizedCrop()
将给定图像随机裁剪为不同的大小和宽高比,然后缩放所裁剪得到的图像为制定的大小;(即先随机采集,然后对裁剪得到的图像缩放为同一大小)
参数解释:
size:该参数用于Resize功能,指定最终得到的图片大小。如果size是一个int值,如H,则最终图片大小为HxH,如果size是一个二元组,如(H,W),则最终图片大小为HxW。size参数跟crop功能完全没关系。
scale:该参数用于Crop功能,指定裁剪区域的面积占原图像的面积的比例范围,是一个二元组,如(scale_lower, scale_upper),我们会在[scale_lower, scale_upper]这个区间中随机采样一个值scale_a,则裁剪区域的面积S_crop=image_height image_width scale_a。 即scale_a表示从原图片中裁剪多大的一部分区域。而scale参数是scale_a的取值范围。
ratio:该参数用于Crop功能,指定裁剪区域的宽高比范围,是一个二元组,如(ratio_lower,ratio_upper),我们会在[scale_lower, scale_upper]这个区间中随机采样一个值ratio_a,则裁剪区域的宽/裁剪区域的高 = ratio_a。即宽高比。根据scale我们可以确定裁剪区域的面积为S_crop,现在我们可以根据宽高比,求得裁剪区域的高 = sqrt(S_crop / ratio_a),裁剪区域的宽 = sqrt(S_crop * ratio_a)。sqrt是平方根函数。
interpolation:该参数用于Resize功能,指缩小或者扩大图像的时候,使用什么样的插值方法。NEARESTBILINEARBICUBIC

transforms.RandomHorizontalFlip()
以给定的概率随机水平旋转给定的PIL的图像,默认为0.5

transforms.ToTensor()
将numpy的ndarray或PIL.Image读的图片转换成形状为(C,H,W)的Tensor格式,且/255归一化到[0,1]之间

transforms.Normalize()
用平均值和标准偏差归一化张量图像。给定mean和std,对于n通道,此变换将标准化输入的每个通道,input[channel] = (input[channel] - mean[channel]) / std[channel]

具体参见:链接1链接2

torch.manual_seed()

1
2
3
4
5
6
7
8
9
torch.manual_seed(number) 
"""
设置CPU生成随机数的种子,方便下次复现实验结果。为CPU设置种子用于生成随机数,以使得结果是确定的。
当你设置一个随机种子时,接下来的随机算法生成数根据当前的随机种子按照一定规律生成。随机种子作用域是在设置时到下一次设置时。
要想重复实验结果,设置同样随机种子即可。number不变,每次运行时随机数就不变
"""
torch.cuda.manual_seed(number) # 为特定GPU设置种子,生成随机数:
torch.cuda.manual_seed_all(number) # 如果使用多个GPU,应该使用torch.cuda.manual_seed_all()为所有的GPU设置种子。