PyTorch基本數(shù)據(jù)類型(一)
PyTorch基礎(chǔ)入門一:PyTorch基本數(shù)據(jù)類型
1)Tensor(張量)
Pytorch里面處理的最基本的操作對象就是Tensor(張量),它表示的其實(shí)就是一個多維矩陣,并有矩陣相關(guān)的運(yùn)算操作。在使用上和numpy是對應(yīng)的,它和numpy唯一的不同就是,pytorch可以在GPU上運(yùn)行,而numpy不可以。所以,我們也可以使用Tensor來代替numpy的使用。當(dāng)然,二者也可以相互轉(zhuǎn)換。
Tensor的基本數(shù)據(jù)類型有五種:
- 32位浮點(diǎn)型:torch.FloatTensor。pyorch.Tensor()默認(rèn)的就是這種類型。
- 64位整型:torch.LongTensor。
- 32位整型:torch.IntTensor。
- 16位整型:torch.ShortTensor。
- 64位浮點(diǎn)型:torch.DoubleTensor。
那么如何定義Tensor張量呢?其實(shí)定義的方式和numpy一樣,直接傳入相應(yīng)的矩陣即可即可。下面就定義了一個三行兩列的矩陣:
import torch # 導(dǎo)包 a = torch.Tensor([[1, 2], [3, 4], [5, 6]]) print(a)
不過在項(xiàng)目之中,更多的做法是以特殊值或者隨機(jī)值初始化一個矩陣,就像下面這樣:
import torch # 定義一個3行2列的全為0的矩陣 b = torch.zeros((3, 2)) # 定義一個3行2列的隨機(jī)值矩陣 c = torch.randn((3, 2)) # 定義一個3行2列全為1的矩陣 d = torch.ones((3, 2)) print(b) print(c) print(d)
Tensor和numpy.ndarray之間還可以相互轉(zhuǎn)換,其方式如下:
- Numpy轉(zhuǎn)化為Tensor:torch.from_numpy(numpy矩陣)
- Tensor轉(zhuǎn)化為numpy:Tensor矩陣.numpy()
范例如下:
import torch import numpy as np # 定義一個3行2列的全為0的矩陣 b = torch.randn((3, 2)) # tensor轉(zhuǎn)化為numpy numpy_b = b.numpy() print(numpy_b) # numpy轉(zhuǎn)化為tensor numpy_e = np.array([[1, 2], [3, 4], [5, 6]]) torch_e = torch.from_numpy(numpy_e) print(numpy_e) print(torch_e)
之前說過,numpy與Tensor最大的區(qū)別就是在對GPU的支持上。Tensor只需要調(diào)用cuda()函數(shù)就可以將其轉(zhuǎn)化為能在GPU上運(yùn)行的類型。
我們可以通過torch.cuda.is_available()函數(shù)來判斷當(dāng)前的環(huán)境是否支持GPU,如果支持,則返回True。所以,為保險起見,在項(xiàng)目代碼中一般采取“先判斷,后使用”的策略來保證代碼的正常運(yùn)行,其基本結(jié)構(gòu)如下:
import torch # 定義一個3行2列的全為0的矩陣 tmp = torch.randn((3, 2)) # 如果支持GPU,則定義為GPU類型 if torch.cuda.is_available(): inputs = tmp.cuda() # 否則,定義為一般的Tensor類型 else: inputs = tmp
2)Variable(變量)
Pytorch里面的Variable類型數(shù)據(jù)功能更加強(qiáng)大,相當(dāng)于是在Tensor外層套了一個殼子,這個殼子賦予了前向傳播,反向傳播,自動求導(dǎo)等功能,在計算圖的構(gòu)建中起的很重要的作用。Variable的結(jié)構(gòu)圖如下:
其中最重要的兩個屬性是:data和grad。Data表示該變量保存的實(shí)際數(shù)據(jù),通過該屬性可以訪問到它所保存的原始張量類型,而關(guān)于該 variable(變量)的梯度會被累計到.grad 上去。
在使用Variable的時候需要從torch.autograd中導(dǎo)入。下面通過一個例子來看一下它自動求導(dǎo)的過程:
import torch from torch.autograd import Variable # 定義三個Variable變量 x = Variable(torch.Tensor([1, 2, 3]), requires_grad=True) w = Variable(torch.Tensor([2, 3, 4]), requires_grad=True) b = Variable(torch.Tensor([3, 4, 5]), requires_grad=True) # 構(gòu)建計算圖,公式為:y = w * x^2 + b y = w * x * x + b # 自動求導(dǎo),計算梯度 y.backward(torch.Tensor([1, 1, 1])) print(x.grad) print(w.grad) print(b.grad)
上述代碼的計算圖為y = w * x^2 + b。對x, w, b分別求偏導(dǎo)為:x.grad = 2wx,w.grad=x^2,b.grad=1。代值檢驗(yàn)可得計算結(jié)果是正確的。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
使用Python進(jìn)行數(shù)獨(dú)求解詳解(一)
本文主要介紹了如何構(gòu)建一個Python腳本來解決數(shù)獨(dú)難題,本文的重點(diǎn)在于介紹用于構(gòu)建數(shù)獨(dú)求解器的回溯算法。感興趣的小伙伴可以學(xué)習(xí)一下2022-02-02python如何為創(chuàng)建大量實(shí)例節(jié)省內(nèi)存
這篇文章主要為大家詳細(xì)介紹了python如何為創(chuàng)建大量實(shí)例節(jié)省內(nèi)存,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-03-03Python爬蟲beautifulsoup4常用的解析方法總結(jié)
今天小編就為大家分享一篇關(guān)于Python爬蟲beautifulsoup4常用的解析方法總結(jié),小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-02-02python進(jìn)程池Pool中apply方法與apply_async方法的區(qū)別
這篇文章主要介紹了python進(jìn)程池Pool中apply方法與apply_async方法的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-02-02如何使用Python基于接口編程的方法實(shí)現(xiàn)
本文主要介紹了如何使用Python基于接口編程,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11