Pytorch的若干非奇技淫巧

数据处理

from skimage import io
img = io.imread(filename, as_gray=True)

注意这里as_gray=True返回的img其实是除以255的,所以范围是[0,1]

import numpy as np
import torch

xx, yy = np.meshgrid(np.arange(w), np.arange(h))
yy, xx = torch.meshgrid(torch.arange(w), torch.arange(h))

注意numpytorchmeshgrid不同,返回的坐标顺序刚好相反

import torch
import torchvision

transform = torchvision.transforms.Compose([
	torchvision.transforms.ToTensor(),
	torchvision.transforms.Normalize(mean=(,), std=(,))

])

ToTensor是把图片转化成浮点型,也就是[0,1]范围内,而Normalize则是用高斯正则化,tensor = (tensor - mean) / (std + eps),如果mean=0.5, std=0.5的话,则相当于tensor = tensor * 2 - 1,将数据归一化到[-1,1]

import os
import os.path as osp
import torchvision
from skimage import io

filename = osp.join(self.hparams.log_dir, "%s_%s_%s.png" % \
 (self.global_step, batch_idx, random_idx))
imgs = torchvision.utils.make_grid(imgs, \ 
							nrow=V).permute(1,2,0).detach().cpu().numpy().astype(np.uint8)
io.imsave(filename, imgs)

注意这里的nrow指的并不是行数,而是列数

张量操作

import torch

a = torch.randn(3,10)
b = torch.randn(3,10)

c = torch.cat((a, b), dim=0) # [6, 10]
d = torch.stack((a, b), dim=0) # [2, 3, 10]

cat会在dim维上进行拼接,而stack意为堆叠,会增加新的一维,stack常用于图片的堆叠

节省显存

  • 尽量使用inplace,原地操作,不再复制张量
    def inplace_relu(m):
        classname = m.__class__.__name__
        if classname.find('ReLU') != -1:
            m.inplace=True
    
    model.apply(inplace_relu)
  • 不做梯度传播
    with torch.no_grad():
    	# 一些不需要梯度计算的运算,比如纯数学运算
  • 删除临时张量,释放cache显存
    del r'''一些不再需要的临时张量'''
    torch.cuda.empty_cache()
  • 使用非确定性算法,寻找cuDNN最优配置,优化框架效率
    torch.backends.cudnn.enabled = True
    torch.backends.cudnn.benchmark = True

待更

你可能感兴趣的:(snippets)