pytorch 簡介及常用工具包展示
一、pytorch 簡介
- Pytorch是torch的python版本,是由Facebook開源的神經(jīng)網(wǎng)絡(luò)框架,專門針對 GPU 加速的深度神經(jīng)網(wǎng)絡(luò)(DNN)編程。Torch 是一個(gè)經(jīng)典的對多維矩陣數(shù)據(jù)進(jìn)行操作的張量
(tensor )庫,在機(jī)器學(xué)習(xí)和其他數(shù)學(xué)密集型應(yīng)用有廣泛應(yīng)用。 - Pytorch的計(jì)算圖是動(dòng)態(tài)的,可以根據(jù)計(jì)算需要實(shí)時(shí)改變計(jì)算圖。
- 由于Torch語言采用 Lua,導(dǎo)致在國內(nèi)一直很小眾,并逐漸被支持 Python 的 Tensorflow 搶走用戶。作為經(jīng)典機(jī)器學(xué)習(xí)庫 Torch 的端口,PyTorch 為 Python 語言使用者提供了舒適的寫代碼選擇。
二、pytorch 優(yōu)勢
- 1.簡潔:
PyTorch的設(shè)計(jì)追求最少的封裝,盡量避免重復(fù)造輪子。不像 TensorFlow 中充斥著session、graph、operation、name_scope、variable、tensor、layer等全新的概念,PyTorch 的設(shè)計(jì)遵循tensor→variable(autograd)→nn.Module 三個(gè)由低到高的抽象層次,分別代表高維數(shù)組(張量)、自動(dòng)求導(dǎo)(變量)和神經(jīng)網(wǎng)絡(luò)(層/模塊),而且這三個(gè)抽象之間聯(lián)系緊密,可以同時(shí)進(jìn)行修改和操作。 - 2.速度:
PyTorch 的靈活性不以速度為代價(jià),在許多評測中,PyTorch 的速度表現(xiàn)勝過 TensorFlow和Keras 等框架。 - 3.易用:
PyTorch 是所有的框架中面向?qū)ο笤O(shè)計(jì)的最優(yōu)雅的一個(gè)。PyTorch的面向?qū)ο蟮慕涌谠O(shè)計(jì)來源于Torch,而Torch的接口設(shè)計(jì)以靈活易用而著稱,Keras作者最初就是受Torch的啟發(fā)才開發(fā)了Keras。 - 4.活躍的社區(qū):
PyTorch 提供了完整的文檔,循序漸進(jìn)的指南,作者親自維護(hù)的論壇,供用戶交流和求教問題。Facebook 人工智能研究院對 PyTorch 提供了強(qiáng)力支持。
三、pytorch 常用工具包
- torch :類似 NumPy 的張量庫,支持GPU;
- torch.autograd :基于 type 的自動(dòng)區(qū)別庫,支持 torch 之中的所有可區(qū)分張量運(yùn)行;
- torch.nn :為最大化靈活性而設(shè)計(jì),與 autograd 深度整合的神經(jīng)網(wǎng)絡(luò)庫;
- torch.optim:與 torch.nn 一起使用的優(yōu)化包,包含 SGD、RMSProp、LBFGS、Adam 等標(biāo)準(zhǔn)優(yōu)化方式;
- torch.multiprocessing: python 多進(jìn)程并發(fā),進(jìn)程之間 torch Tensors 的內(nèi)存共享;
- torch.utils:數(shù)據(jù)載入器。具有訓(xùn)練器和其他便利功能;
- torch.legacy(.nn/.optim) :出于向后兼容性考慮,從 Torch 移植來的 legacy 代碼;
四、pytorch 注意點(diǎn)
特別注意一個(gè)問題:
通道問題:不同視覺庫對于圖像讀取的方式不一樣,圖像通道也不一樣:
opencv 的 imread 默認(rèn)順序時(shí) H * W * C
pytorch的Tensor是 C * H * W
Tensorflow是兩者都支持
五、pytorch 理解
- numpy風(fēng)格的tensor操作
- pytorch對tensor提供的API參照了numpy
- 變量自動(dòng)求導(dǎo)
- 在計(jì)算過程形成的計(jì)算圖中,參與的變量可快速計(jì)算出自己對于目標(biāo)函數(shù)的梯度
- 神經(jīng)網(wǎng)絡(luò)求導(dǎo)及損失函數(shù)優(yōu)化等高層封裝
- 網(wǎng)絡(luò)層封裝在torch.nn
- 損失函數(shù)封裝在torch.functional
- 優(yōu)化函數(shù)封裝在torch.optim
六、pytorch-Tensor
1. tensor 數(shù)據(jù)類型
tensor數(shù)據(jù)類型:3浮點(diǎn)(float16,float32,float64)5整數(shù)(int16,int32,int64,int8+uint8)
Data type | dtype | CPU tensor | GPU tensor |
---|---|---|---|
16-bit floating point | torch.float16 or torch.half | torch.HalfTensor | torch.cuda.HalfTensor |
32-bit floating point | torch.float32 or torch.float | torch.FloatTensor | torch.cuda.FloatTensor |
64-bit floating point | torch.float64 or torch.double | torch.DoubleTensor | torch.cuda.DoubleTensor |
Data type | dtype | CPU tensor | GPU tensor |
---|---|---|---|
8-bit integer(unsigned) | torch.uint8 | torch.ByteTensor | torch.cuda.ByteTensor |
8-bit integer(signed) | torch.int8 | torch.CharTensor | torch.cuda.CharTensor |
16-bit integer(signed) | torch.int16 or torch.short | torch.ShortTensor | torch.cuda.ShortTensor |
32-bit integer(signed) | torch.int32 or torch.int | torch.IntTensor | torch.cuda.IntTensor |
64-bit integer(signed) | torch.int64 or torch.long | torch.LongTensor | torch.cuda.LongTensor |
2. 創(chuàng)建 tensor 相關(guān)的 API
創(chuàng)建tensor的常見api
方法名 | 說明 |
---|---|
Tensor() | 直接從參數(shù)構(gòu)造張量,支持list和numpy數(shù)組 |
eye(row,column) | 創(chuàng)建指定行數(shù)&列數(shù)的單位tensor(單位陣) |
linspace(start,end,count) | 在[s,e]上創(chuàng)建c個(gè)元素的一維tensor |
logspace(start,end,count) | 在[10s,10e]上創(chuàng)建c個(gè)元素的一維tensor |
ones(size) | 返回指定shape的tensor,元素初始值為1 |
zeros(size) | 返回指定shape的tensor,元素初始值為0 |
ones_like(t) | 返回一個(gè)tensor,shape與t相同,且元素初始值為1 |
zeros_like(t) | 返回一個(gè)tensor,shape與t相同,且元素初始值為1 |
arange(s,e,sep) | 在區(qū)間[s,e)上以間隔sep生成一個(gè)序列張量 |
3. tensor 對象的 API
tensor 對象的方法
方法名 | 作用 |
---|---|
size() | 返回張量的shape |
numel() | 計(jì)算tensor的元素個(gè)數(shù) |
view(shape) | 修改tensor的shape,與np.reshape相似,view返回的是對象的共享內(nèi)存 |
resize | 類似于view,但在size超出時(shí)會(huì)重新分配內(nèi)存空間 |
item | 若為單元素tensor,則返回python的scalar |
from_numpy | 從numpy數(shù)據(jù)填充 |
numpy | 返回ndarray類型 |
七、python 自動(dòng)求導(dǎo)
tensor對象通過一系列運(yùn)算組成動(dòng)態(tài)圖,每個(gè)tensor對象都有以下幾個(gè)控制求導(dǎo)的屬性。
變量 | 作用 |
---|---|
requird_grad | 默認(rèn)為False,表示變量是狗需要計(jì)算導(dǎo)數(shù) |
grad_fn | 變量的梯度函數(shù) |
grad | 變量對應(yīng)的梯度 |
八、pytorch 神經(jīng)網(wǎng)絡(luò)
torch.nn提供了創(chuàng)建神經(jīng)網(wǎng)絡(luò)的基礎(chǔ)構(gòu)件,這些層都繼承自Module類。下面是自己手動(dòng)實(shí)現(xiàn)一個(gè)線性層(linear layer)。適當(dāng)參考,以后直接調(diào)用現(xiàn)成的接口,這里稍微了解一下,無實(shí)際意義。
????
import torch class Linear(torch.nn.Module): def __init__(self, in_features, out_features, bias=True): super(Linear, self).__init__() # torch.randn() 返回一個(gè)符合均值為0,方差為1的正態(tài)分布 self.weight = torch.nn.Parameter(torch.randn(out_features, in_features)) if bias: self.bias = torch.nn.Parameter(torch.randn(out_features)) def forward(self, x): # xW+b x = x.mm(self.weight) if self.bias: x = x + self.bias.expand_as(x) return x if __name__ == '__main__': net = Linear(3,2) x = net.forward print('11',x)
下面表格中列出了比較重要的神經(jīng)網(wǎng)絡(luò)層組件。
對應(yīng)的在nn.functional模塊中,提供這些層對應(yīng)的函數(shù)實(shí)現(xiàn)。
通常對于可訓(xùn)練參數(shù)的層使用module,而對于不需要訓(xùn)練參數(shù)的層如softmax這些,可以使用functional中的函數(shù)。
一些容器:
容器類型 | 功能 |
---|---|
Module | 神經(jīng)網(wǎng)絡(luò)模塊基類 |
Sequential | 序貫?zāi)P停愃苉eras,用于構(gòu)建序列型神經(jīng)網(wǎng)絡(luò) |
ModuleList | 用于存儲(chǔ)層,不接受輸入 |
Parameters(t) | 模塊的屬性,用于保存其訓(xùn)練參數(shù) |
ParameterList | 參數(shù)列表1 |
容器代碼:
# 方法1 像 model1 = nn.Sequential() model.add_module('fc1', nn.Linear(3,4)) model.add_module('fc2', nn.Linear(4,2)) model.add_module('output', nn.Softmax(2)) # 方法2 model2 = nn.Sequential( nn.Conv2d(1,20,5), nn.ReLU(), nn.Conv2d(20,64,5), nn.ReLU() ) # 方法3 model3 = nn.ModuleList([nn.Linear(3,4), nn.ReLU(), nn.Linear(4,2)])
- torch.nn.Module提供了神經(jīng)網(wǎng)絡(luò)的基類,當(dāng)實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)時(shí)需要繼承自此模塊,并在初始化函數(shù)中創(chuàng)建網(wǎng)絡(luò)需要包含的層,并實(shí)現(xiàn)forward函數(shù)完成前向計(jì)算,網(wǎng)絡(luò)的反向計(jì)算會(huì)由自動(dòng)求導(dǎo)機(jī)制處理。
- 通常將需要訓(xùn)練的層寫在init函數(shù)中,將參數(shù)不需要訓(xùn)練的層在forward方法里調(diào)用對應(yīng)的函數(shù)來實(shí)現(xiàn)相應(yīng)的層。
編碼三步走:
在pytorch中就只需要分三步:
- 寫好網(wǎng)絡(luò);
- 編寫數(shù)據(jù)的標(biāo)簽和路徑索引;
- 把數(shù)據(jù)送到網(wǎng)絡(luò)。
到此這篇關(guān)于pytorch 簡介及常用工具包展示的文章就介紹到這了,更多相關(guān)pytorch 常用工具包內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python利用glob庫實(shí)現(xiàn)輕松應(yīng)對文件和目錄管理
Python提供了glob庫,它允許我們根據(jù)特定模式匹配文件和目錄,本文將詳細(xì)介紹glob庫的用法,并通過實(shí)例演示它的各種功能,需要的可以了解一下2023-07-07python pickle存儲(chǔ)、讀取大數(shù)據(jù)量列表、字典數(shù)據(jù)的方法
pickle模塊實(shí)現(xiàn)了用于序列化和反序列化python對象結(jié)構(gòu)的二進(jìn)制協(xié)議。這篇文章主要介紹了python pickle存儲(chǔ)、讀取大數(shù)據(jù)量列表、字典的數(shù)據(jù),需要的朋友可以參考下2019-07-07Django自帶的用戶驗(yàn)證系統(tǒng)實(shí)現(xiàn)
這篇文章主要介紹了Django自帶的用戶驗(yàn)證系統(tǒng)實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12Python尋找兩個(gè)有序數(shù)組的中位數(shù)實(shí)例詳解
這篇文章主要介紹了Python尋找兩個(gè)有序數(shù)組的中位數(shù),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-12-12