天天看點

【Pytorch】Pytorch基礎知識

Pytorch的特色之一是提供建構動态計算圖的架構,這樣網絡結構就不是一成不變的了,甚至可以在運作時修正它們。

【Tensor】

Tensor是Pytorch中的基本對象,意思為張量,表示多元的矩陣,是Pytorch中的基本操作對象之一,Tensor的聲明和擷取size如下:

import torch
x = torch.Tensor(5,3)
x.size()
           

Tensor與Numpy的array可以進行互相啊轉換,轉換函數為:

x = torch.rand(5,3)
# torch -> numpy:
y = x.numpy()

# numpy -> torch:
x = y.torch.from_numpy()
           

【Variable】

Variable是Pytorch的一個基本對象,可以把它了解為是對Tensor的一個封裝,Variable用于放入計算圖中以進行前向傳播、反向傳播和自動求導。在一個Variable中有三個重要屬性:data、grad和creator。其中,data表示包含的Tensor資料部分;grad表示傳播方向的梯度,這個屬性是延遲配置設定的,而且僅允許進行一次;creator表示建立這個Variable的Function的引用,該引用用于回溯整個建立鍊路。

from torch.autograd import Variable
x = torch.rand(4)
x = variable(x, requires_grad = true)
y = x * 3
grad_variables = torch.floattensor([1,2,3,4])
y.backward(grad_variables)
print(x.grad)

-------tensor([3., 6., 9., 12.])--------
           

對于y.backward(grad_variables),grad_variables就是y求導時的梯度參數,由于autograd僅用于标量,是以當y不是标量且在聲明時使用了requires_grad=true時,必須指定grad_variables參數,在完成原始的反向傳播後得到的梯度會用這個grad_variables進行修正,然後将結果儲存至Variable的grad中,grad_variables的長度要與y一緻。在深度學習中求導與梯度有關,是以grad_variables一般會定義為類似[1, 0.1, 0.01, 0.001]表示梯度的方向,取較小的值不會對求導效率有影響。

【CUDA】

如果安裝了支援CUDA版本的Pytorch,就可以啟用顯示卡運算了。torch.cuda用于設定和運作CUDA操作,它會記錄目前選擇的GPU,并且配置設定所有CUDA張量将預設在上面建立,可以使用torch.cuda.device上下文管理器更改所選裝置。不過,一旦張量被配置設定,可以直接對其進行操作,而不考慮所選擇的裝置,結果将始終放在與張量相關的裝置上。預設情況下, 不支援跨GPU操作,唯一的例外時copy_()。除非啟用對等存儲器的通路,否則對于分布不同裝置上的張量,任何啟動操作的嘗試豆漿引發錯誤。

torch.cuda.is_available()
           

【模型的儲存與加載】

Python中對于模型資料的儲存和加載操作都是引用Python内置的pickle包,使用pickle.dump()和pickle.load()方法。

torch.save(model, 'model.pkl')  #儲存整個模型
model = torch.load('model.pkl')  #加載整個模型
torch.save(alexnet.state_dict(), 'params.pkl')  #儲存網絡中的參數
alexnet.load_state_dict(torch.load('params.pkl'))  #加載網絡中的參數
           

在torchvision.models子產品裡,Pytorch提供了一些常用的模型:AlexNet、VGG、ResNet等,可以使用torch.util.model_zoo來預加載它們,具體設定通過參數pretrained=True來實作。

import torchvision.models as models
alexnet = models.alexnet(pretrained=True)
           

加載這類預訓練模型的過程中,還可以進行微處理。

pretrained_dict = model_zoo.load_url(model_url['resnet134'])
model_dict = model.state_dict()
pretrained_dict = {k:v for k,v in pretrained_dict.items() if k in model_dict}  #将pretrained_dict裡不屬于model_dict的鍵剔除掉
model_dict.update(pretrained_dict) #更新現有的model_dict
model.load_state_dict(model_dict)
           

參考資料:Pytorch機器學習:從入門到實踐

繼續閱讀