Pytorch学习要点整理
PyTorch是一个基于Torch的Python开源机器学习库,用于自然语言处理等应用程序。它主要由Facebookd的人工智能小组开发,不仅能够实现强大的GPU加速,同时还支持动态神经网络,这一点是现在很多主流框架如TensorFlow都不支持的。 PyTorch提供了两个高级功能:
1.具有强大的GPU加速的张量计算(如Numpy)
2.包含自动求导系统的深度神经网络 除了Facebook之外,Twitter、GMU和Salesforce等机构都采用了PyTorch。
TensorFlow和Pytorch的区别:
(1)tensorflow是基于静态图的,静态图是先定义在运行,一次定义多次运行(当然TensorFlow开始也使用动态计算图)
(2)Pytorch则是基于动态计算图是在运行过程中被定义的,在运行的时候构建,可以多次构建多次运行。
当修改numpy数组之后,与之关联的tensor也会相应的被修改
通过.numpy将Pytorch中的tensor转换成numpy中的数组,通过Torch.Tensor将Numpy数组转换为Torch Tensor怎么用autograd
(1)跟踪Tensor上的所有操作:设置属性requires_grad= True
(2)自动计算所有梯度:调用.backward()
(3) 停止跟踪Tensor 方式1:调用detach()方式2:代码块with torch. no grad
(4) 若Tensor不仅仅是标量,则需要指定gradient参数来指定张量的形式
一、官方教程内容总结
官方教程
1.Any operation that mutates a tensor in-place is post-fixed with an . For example: x.copy(y), x.t_(), will change x.
只要是原地操作张亮一般都是加一个下划线。
2.如果resize或者reshape一个tensor的话可以使用torch.view
x = torch.randn(4, 4)
y = x.view(16)
z = x.view(-1, 8)
- 如果torch是在cpu上,则tensor和numpy共享内存,改变其中一个将改变另外一个。
- 从torch 的tensor转变为numpy
a = torch.ones(5)
b = a.numpy()
从numpy转变为tensor
a = np.ones(5)
b = torch.from_numpy(a)
5.我们不允许张量对张量求导,只允许标量对张量求导,求导结果是和自变量同形的张量。所以必要时我们要把张量通过将所有张量的元素加权求和的方式转换为标量
6.使用PyTorch可以更简洁地实现模型。
torch.utils.data模块提供了有关数据处理的工具,torch.nn模块定义了大量神经网络的层,torch.nn.init模块定义了各种初始化方法,torch.optim模块提供了很多常用的优化算法。
7.我们还指定了参数transform = transforms.ToTensor()使所有数据转换为Tensor,如果不进行转换则返回的是PIL图片。transforms.ToTensor()将尺寸为 (H x W x C) 且数据位于[0, 255]的PIL图片或者数据类型为np.uint8的NumPy数组转换为尺寸为(C x H x W)且数据类型为torch.float32且位于[0.0, 1.0]的Tensor。
注意: 由于像素值为0到255的整数,所以刚好是uint8所能表示的范围,包括transforms.ToTensor()在内的一些关于图片的函数就默认输入的是uint8型,若不是,可能不会报错但可能得不到想要的结果。所以,如果用像素值(0-255整数)表示图片数据,那么一律将其类型设置成uint8,避免不必要的bug。
8.torchvision.transforms模块有大量现成的转换方法,不过需要注意的是有的方法输入的是PIL图像,如Resize;有的方法输入的是tensor,如Normalize;而还有的是用于二者转换,如ToTensor将PIL图像转换成tensor。一定要注意这点,使用时看清文档。
示例:
rgb_mean = np.array([0.485, 0.456, 0.406])
rgb_std = np.array([0.229, 0.224, 0.225])
def preprocess(PIL_img, image_shape):
process = torchvision.transforms.Compose([
torchvision.transforms.Resize(image_shape),
torchvision.transforms.ToTensor(),
torchvision.transforms.Normalize(mean=rgb_mean, std=rgb_std)])
return process(PIL_img).unsqueeze(dim = 0) # (batch_size, 3, H, W)
def postprocess(img_tensor):
inv_normalize = torchvision.transforms.Normalize(
mean= -rgb_mean / rgb_std,
std= 1/rgb_std)
to_PIL_image = torchvision.transforms.ToPILImage()
return to_PIL_image(inv_normalize(img_tensor[0].cpu()).clamp(0, 1))
9.PyTorch官方在torchvision.models模块提供了一些常见的预训练好的计算机视觉模型,包括图片分类、语义分割、目标检测、实例分割、人关键点检测和视频分类等等。使用时要仔细阅读其文档,搞清楚如何使用,例如刚刚提到的对图片进行标准化等。
10.注意:torch.nn仅支持输入一个batch的样本不支持单个样本输入,如果只有单个样本,可使用input.unsqueeze(0)来添加一维。
11.为不同子网络设置不同到学习率。
optimizer =optim.SGD([
# 如果对某个参数不指定学习率,就使用最外层的默认学习率
{'params': net.subnet1.parameters()}, # lr=0.03
{'params': net.subnet2.parameters(), 'lr': 0.01}
], lr=0.03)
12.pytorch中一个很重要的包
torchvision主要由以下几部分构成:
torchvision.datasets: 一些加载数据的函数及常用的数据集接口;
torchvision.models: 包含常用的模型结构(含预训练模型),例如AlexNet、VGG、ResNet等;
torchvision.transforms: 常用的图片变换,例如裁剪、旋转等;
torchvision.utils: 其他的一些有用的方法。
13.指定了参数transform = transforms.ToTensor()使所有数据转换为Tensor,如果不进行转换则返回的是PIL图片。transforms.ToTensor()将尺寸为 (H x W x C) 且数据位于[0, 255]的PIL图片或者数据类型为np.uint8的NumPy数组转换为尺寸为(C x H x W)且数据类型为torch.float32且位于[0.0, 1.0]的Tensor。
14.首先我们需要一个模型的实例,然后验证我们是否有多个 GPU。如果我们有多个 GPU,我们可以用 nn.DataParallel 来包裹 我们的模型。然后我们使用 model.to(device) 把模型放到多 GPU 中。
15.
在这篇教程中我们学习了如何构造和使用数据集类(datasets),转换(transforms)和数据加载器(dataloader)。torchvision包提供了 常用的数据集类(datasets)和转换(transforms)。你可能不需要自己构造这些类。torchvision中还有一个更常用的数据集类ImageFolder。 它假定了数据集是以如下方式构造的:
root/ants/xxx.png
root/ants/xxy.jpeg
root/ants/xxz.png
.
.
.
root/bees/123.jpg
root/bees/nsdf3.png
root/bees/asd932_.png
其中'ants’,bees’等是分类标签。在PIL.Image中你也可以使用类似的转换(transforms)例如RandomHorizontalFlip,Scale。利 用这些你可以按如下的方式创建一个数据加载器(dataloader) :
import torch
from torchvision import transforms, datasets
data_transform = transforms.Compose([
transforms.RandomSizedCrop(224),
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225])
])
hymenoptera_dataset = datasets.ImageFolder(root='hymenoptera_data/train',
transform=data_transform)
dataset_loader = torch.utils.data.DataLoader(hymenoptera_dataset,
batch_size=4, shuffle=True,
num_workers=4)
二、具有参考价值的中文教程
有两种常见情况可能需要修改torchvision modelzoo中的一个可用模型。第一个是我们想要从预先训练的模型开始,然后微调最后一层。 另一种是当我们想要用不同的模型替换模型的主干时(例如,用于更快的预测)。
[参考](http://pytorch123.com/FourSection/ObjectDetectionFinetuning/)
1.空间变换器网络
空间变换器网络是对任何空间变换的差异化关注的概括。空间变换器网络(简称STN)允许神经网络学习如何在输入图像上执行空间变换,以增强模型的几何不变性。例如,它可以裁剪感兴趣的区域,缩放并校正图像的方向。而这可能是一种有用的机制,因为CNN对于旋转和 缩放以及更一般的仿射变换并不是不变的。
关于STN的最棒的事情之一是能够简单地将其插入任何现有的CNN,而且只需很少的修改。
空间变换器网络归结为三个主要部分:
(1)本地网络(Localisation Network)是常规CNN,其对变换参数进行回归。不会从该数据集中明确地学习转换,而是网络自动学习增强 全局准确性的空间变换。
(2)网格生成器( Grid Genator)在输入图像中生成与输出图像中的每个像素相对应的坐标网格。
(3)采样器(Sampler)使用变换的参数并将其应用于输入图像。
2.注意力机制的代码及讲解
3.不同尺寸的图像化为一个尺寸或者某个数的倍数
from maskrcnn_benchmark.structures.image_list import to_image_list
images = [torch.rand(3, 100, 200), torch.rand(3, 150, 170)]
batched_images = to_image_list(images)
# it is also possible to make the final batched image be a multiple of a number
batched_images_32 = to_image_list(images, size_divisible=32)