数据处理
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))
注意numpy
和torch
的meshgrid
不同,返回的坐标顺序刚好相反
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
待更