PyTorch中常用工具
torchvision
- models:提供深度學習中各種經典的網絡結構以及預訓練好的模型,包括AlexNet, VGG, ResNet, Inception
- datsets:提供常用的數據集加載,設計上均繼承torch.utils.data.dataset,主要包括MNIST,CIFAR10/100,ImageNet,COCO
- transforms:提供常用的數據預處理操作,主要包括對tensor和PILImage對象的操作
- torchvision.utils.save_image:直接將tensor保存成圖片
from torch.utils import data import os from PIL import Image from torchvision import transforms from torchvision import utils import numpy import torch class Data(data.Dataset): def __init__(self, root): # 返回指定路徑下的文件和文件夾列表。 imgs_HR = os.listdir(os.path.join(root, 'gt')) self.imgs_HR = [os.path.join(root, 'gt', img) for img in imgs_HR] imgs_LR = os.listdir(os.path.join(root, 'lr')) self.imgs_LR = [os.path.join(root, 'lr', img) for img in imgs_LR] self.transform = transforms.ToTensor() def __getitem__(self, item): img_path_LR = self.imgs_LR[item] img_path_HR = self.imgs_HR[item] LR_img = Image.open(img_path_LR) HR_img = Image.open(img_path_HR) HR = self.transform(HR_img) # print(HR1.shape) LR = self.transform(LR_img) filename = os.path.splitext(os.path.basename(img_path_HR)) return LR, HR, filename def __len__(self): return len(self.imgs_HR) if __name__ == '__main__': train = Data(root='/data/wcy/celebA-18000/test') for LR, HR, filename in train: print(filename) utils.save_image(HR, os.path.join('/data/wcy/wcy/fishnet/result-test/{}.png').format(str(filename[0])))
可視化工具
- tensorboardX:命令:tensorboard --logdir=log目錄 --port=指定端口
- visdom:pip install visdom
GPU加速
tensor,variable,nn.module都有一個.cuda對象,通過調用該方法可以將其轉爲對應的GPU對象,variable和tensor.cuda會將新對象轉移到GPU而其他的數據還保留在cpu。而module.cuda會將所有的數據都轉移到GPU上。
服務器有多個GPU,tensor.cuda()會將tensor保存到第一塊GPU上,等價於tensor.cuda(0)。指定其他GPU的方法:
- torch.cuda.set_device(1):指定第二塊GPU
- 設置環境變量:CUDA_VISIBLE_DEVICES=0,2,3,設置使用第一,三、四塊卡。此時tensor.cuda(1)會將tensor轉移到CUDA_VISIBLE_DEVICES[1]=2,即第三塊卡上。
import os os.environ['CUDA_VISIBLE_DEVICES'] = "0,1,2"
持久化
tensor,variable,nn.module和optimizer均可以保存到硬盤中。保存:torch.save(obj, filename)加載:obj = torch.load(filename)
module和optimizer建議保存他們的state_dict()
from torchvision import transforms
import torch as t
a = t.Tensor(3, 4)
if t.cuda().is_available():
a = a.cuda()
t.save(a, 'a.pth')
b = t.load('a.pth')
# 加載爲c, 存儲於CPU
c = t.load('a.pth', map_llocation=lambda storage, loc:storage)
# 加載爲d,存儲於GPU
d = t.load('a.pth', map_location={'cuda:1':'cuda:0'})
# 設置默認類型
t.set_default_tensor_type('torch.FloatTensor')
from torchvision.models import AlexNet
model = AlexNet()
t.save(model.state_dict(), 'alexnet.pth')
model.load_state_dict(t.load('alexnet.pth'))
optimizer = t.optim.Adam(model.parameters(), lr=0.1)
t.save(optimizer.state_dict(), 'optimizer.pth')
optimizer.load_state_dict(t.load('optimizer.pth'))
all_data = dict(
optimizer=optimizer.state_dict(),
model = model.state_dict(),
info = u'模型和優化器的所有參數'
)
t.save(all_data, 'all.pth')
all_data = t.load('all_pth')
all_data.keys()