【记笔记】Pytorch中的一些函数

pytorch函数笔记

DataLoader

原文链接:https://blog.csdn.net/qq_28057379/article/details/115427052

  1. DateLoader中的num_worker参数,这个参数的大概意思相当于创建几个工作流程,通过batch_sampler分配指定的batch,worker负责将batch加载进RAM,类似预加载?(我猜的)
  2. num_worker设置得大,好处是寻batch速度快,因为下一轮迭代的batch很可能在上一轮/上上一轮…迭代时已经加载好了。坏处是内存开销大,也加重了CPU负担(worker加载数据到RAM的进程是CPU复制的嘛)。num_workers的经验设置值是自己电脑/服务器的CPU核心数,如果CPU很强、RAM也很充足,就可以设置得更大些。
  3. 如果num_worker设为0,意味着每一轮迭代时,dataloader不再有自主加载数据到RAM这一步骤(因为没有worker了),而是在RAM中找batch,找不到时再加载相应的batch。缺点当然是速度更慢。

设置大小建议:

Dataloader的num_worker设置多少才合适,这个问题是很难有一个推荐的值。有以下几个建议:

  1. num_workers=0表示只有主进程去加载batch数据,这个可能会是一个瓶颈。
  2. num_workers = 1表示只有一个worker进程用来加载batch数据,而主进程是不参与数据加载的。这样速度也会很慢。
  3. num_workers>0 表示只有指定数量的worker进程去加载数据,主进程不参与。增加num_works也同时会增加cpu内存的消耗。所以num_workers的值依赖于
    batch size和机器性能。
  4. 一般开始是将num_workers设置为等于计算机上的CPU数量
  5. 最好的办法是缓慢增加num_workers,直到训练速度不再提高,就停止增加num_workers的值。

torchvision.transforms.compose()

原文链接:https://blog.csdn.net/b_dxac/article/details/115611780

torchvision是pytorch的一个图形库,它服务于PyTorch深度学习框架的,主要用来构建计算机视觉模型。torchvision.transforms主要是用于常见的一些图形变换。以下是torchvision的构成:

  1. torchvision.datasets: 一些加载数据的函数及常用的数据集接口;

  2. torchvision.models: 包含常用的模型结构(含预训练模型),例如AlexNet、VGG、ResNet等;

  3. torchvision.transforms: 常用的图片变换,例如裁剪、旋转等;

  4. torchvision.utils: 其他的一些有用的方法。

torchvision.transforms.Compose()类。这个类的主要作用是串联多个图片变换的操作。这个类的构造很简单:

class torchvision.transforms.Compose(transforms):
 # Composes several transforms together.
 # Parameters: transforms (list of Transform objects) – list of transforms to compose.
 
Example # 可以看出Compose里面的参数实际上就是个列表,而这个列表里面的元素就是你想要执行的transform操作。
>>> transforms.Compose([
>>>     transforms.CenterCrop(10),
>>>     transforms.ToTensor(),])

事实上,Compose()类会将transforms列表里面的transform操作进行遍历。实现的代码很简单:

## 这里对源码进行了部分截取。
def __call__(self, img):
	for t in self.transforms:	
		img = t(img)
    return img
介绍transforms中的函数:

【记笔记】Pytorch中的一些函数_第1张图片

备注:Python图像库PIL(Python Image Library)是python的第三方图像处理库,但是由于其强大的功能与众多的使用人数,几乎已经被认为是python官方图像处理库了。

函数解析:

# torchvision 数据集的输出是范围在[0,1]之间的 PILImage,我们将他们转换成归一化范围为[-1,1]之间的
# 张量 Tensors。
transform = transforms.Compose(
    [transforms.ToTensor(),
     transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])

那transform.Normalize()是怎么工作的呢?以上面代码为例,

ToTensor() 能够把灰度范围从0-255变换到0-1之间,而后面的transform.Normalize()则把0-1变换到(-1,1).
具体地说,对每个通道而言,Normalize执行以下操作:
image=(image-mean)/std
其中mean和std分别通过(0.5,0.5,0.5)和(0.5,0.5,0.5)进行指定。原来的0-1最小值0则变成(0-0.5)/0.5=-1,而最大值1则变成(1-0.5)/0.5=1.
而transforms.Compose()负责将这两个对图像的操作串联起来。

你可能感兴趣的:(记笔记,python,pytorch)