N1H111SM's Miniverse

Pytorch Techniques

字数统计: 408阅读时长: 1 min
2020/05/28 Share

Materials

Functions

torch.nn.Conv2d

1
2
3
4
5
6
7
8
9
10
11
torch.nn.Conv2d(
in_channels,
out_channels,
kernel_size,
stride=1,
padding=0,
dilation=1,
groups=1,
bias=True,
padding_mode='zeros'
)

Pytorch和tensorflow中(也和我们一般理解的)的图像表示形式不同:torch中的channel维在height和width之前,所以input的tensor形状为$(N,C_{\text{in}}, H, W)$.

torch.nn.ZeroPad2d

在二维Tensor的左右上下四个方向添加zero-padding.

1
2
pad = nn.ZeroPad2d(padding=(1, 2, 3, 4))
y = pad(x)

torchvision.transforms.Pad

有的时候我们希望对于数据的处理都封装在load_data这一层中,所以我们希望能够使用torchvision里的transform.Compose. 以下展示了将MNIST上(1, 28, 28)的数据转换为能够匹配用于CIFAR-10的DCGAN架构的代码。注意Pad需要在ToTensor()层前,因为该方法适配于PIL Image对象而不是Tensor对象。

1
2
3
transform = transforms.Compose([transforms.Pad(padding=(2,2,2,2), fill=0),
transforms.ToTensor(),
transforms.Normalize((0.1307,), (0.3081,))])

在BYOL工作中,我们需要得到一个batch的PIL image然后对该batch进行两次同样的随机化的transform. 注意torchvision.transform对图像的操作都封装在了dataloader中. 背后的原理是可以使用多线程对多个图像进行并行的transform最后将PIL图像转换为tensor组装成为一个batch的tensor可以加速这个操作,这是pytorch的开发人员在设计transform这个机制的哲学,因此他们不认为对batched transform的支持是必须的. 这就给我们的开发带了一些问题.

一个解决方案是采用kornia这个pytorch支持库,在dataloader层面我们只需要一个ToTensortransform即可,然后通过kornia定义一个自己的nn.Sequential即可完成要求.

CATALOG
  1. 1. Functions
    1. 1.0.1. torch.nn.Conv2d
    2. 1.0.2. torch.nn.ZeroPad2d
    3. 1.0.3. torchvision.transforms.Pad