您好,登錄后才能下訂單哦!
本篇文章為大家展示了如何實(shí)現(xiàn)PyTorch的基本數(shù)據(jù)類型、數(shù)據(jù)的獲得和生成,內(nèi)容簡明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。
總的來說,除了String類型之外,Python中存在的數(shù)據(jù)類型,PyTorch中都有對(duì)應(yīng)的數(shù)據(jù)類型。只不過PyTorch中的數(shù)據(jù)類型都是Tensor。
PyTorch中的變量是用Variable定義。例如想要定義一個(gè)FloatTensor的變量,我們可以這樣:先定義一個(gè)常量tensor,然后用Variable類包裝一下即可:
① w = Variable(torch.tensor([2.0, 3.0]), requires_grad = True)
這個(gè)w是一維的,稱之為張量。張量可以是一維、二維或多維。如果w需要梯度下降優(yōu)化,那就要梯度requires_grad = True。如果w不需要梯度下降優(yōu)化,則設(shè)置requires_grad為False。
② b = Variable(torch.tensor(1.0), requires_grad = True)。這個(gè)b是0維的,稱之為標(biāo)量。
Variable變量除了有tensor的屬性和方法之外,還有一些特殊的屬性和方法:grad屬性、zero_grad()方法等。
PyTorch的數(shù)據(jù)的獲得
第一行是導(dǎo)入torch包,注意,名字是torch,而不是PyTorch。
第二行代碼是引入numpy包,并使用np作為別名。以后代碼中不再顯示這兩行代碼。
PyTorch可以從Numpy獲得數(shù)據(jù),把Numpy的數(shù)據(jù)轉(zhuǎn)化成PyTorch的數(shù)據(jù)的方式:torch.from_numpy()
PyTorch也可以自己生成數(shù)據(jù)。torch.empty()、torch.Tensor()、torch.IntTensor()這三種方法獲得的是矩陣,矩陣中的數(shù)據(jù)是隨機(jī)的,有可能非常大,也可能非常小。所以用這些方法獲得的矩陣中的數(shù)據(jù)一定要重新進(jìn)行初始化,而不能直接使用。
torch.tensor([2,3])是把已有的一個(gè)列表轉(zhuǎn)化成一維張量,這個(gè)一維張量里面的數(shù)據(jù)是兩個(gè)標(biāo)量,分別是toensor(2)和toensor(3)。這兩個(gè)標(biāo)量中的數(shù)據(jù)都是整數(shù)類型。
b = torch.Tensor(2, 3)是生成一個(gè)2行3列的二維張量,PyTorch默認(rèn)的數(shù)據(jù)類型是TensorFloat,所以得到的都是tensor(0.0),簡寫成tensor(0.)。
a = torch.rand(2,3)表示產(chǎn)生一個(gè)2行3列的二維張量,這個(gè)張量中的數(shù)據(jù)是[0, 1]之間的tensor標(biāo)量,里面的數(shù)據(jù)分布是均勻分布的。
而torch.rand_like(a)表示產(chǎn)生與張量a相同形狀的張量,里面的數(shù)據(jù)也是[0, 1]之間的tensor標(biāo)量。
torch.randint(1,10, [5])的意思是產(chǎn)生5個(gè)元素的一維張量,里面的數(shù)據(jù)是[1, 10)之間的整數(shù)。如果把第三個(gè)參數(shù)換成[5, 2],那就可以得到5行2列的二維張量。
與torch.rand([2, 3])得到均勻分布的數(shù)據(jù)不同,torch.randn([2, 3])生成2行3列的二維張量,里面的數(shù)據(jù)是均值為0,方差為1的正態(tài)分布的。函數(shù)名randn()中的n是normal,也就是正態(tài)的意思。(正態(tài)分布:Normal distribution)。
torch.full([2,3], 7)的意思是生成2行3列的二維張量,里面的數(shù)據(jù)是都是7。張量和一個(gè)普通數(shù)據(jù)的相乘(加、減、除)得到的結(jié)果是張量中的每個(gè)元素都與這個(gè)普通數(shù)據(jù)相乘(加、減、除)。torch.ones([2, 3])的意思是生成2行3列的二維張量,里面的數(shù)據(jù)是都是1。所以torch.full([2,3], 7)也可以用torch.ones([2, 3]) + 6或torch.ones([2, 3]) * 7代替。
如果torch.full([], 9)第一個(gè)參數(shù)是一個(gè)空數(shù)組,這樣得到的就是一個(gè)標(biāo)量9。與torch.tensor(9)一樣。
torch.linspace(0, 10, steps = 4)的意思是把0~10分為3等分。
torch.logspace(0, 1, steps = 10)的意思是把0~1分為9等分,然后分別計(jì)算10^X,得到如下序列。
torch.zeros([2,3])的意思是生成2行3列的二維張量,里面的數(shù)據(jù)是都是0。
torch.ones([2,3])在前面已經(jīng)介紹過了,是2行3列的二維張量,里面的數(shù)據(jù)是都是1。
torch.eye(3,4)生成的是對(duì)角線矩陣,對(duì)角線上的數(shù)據(jù)都是1,其余都是0。如果兩個(gè)參數(shù)相等就生成正方形的矩陣,這時(shí)可以只寫一個(gè)參數(shù)。
torch.full([2,3], 9)在前面已經(jīng)介紹過了,是2行3列的二維張量,里面的數(shù)據(jù)是都是9。它可以用torch.ones([2,3])代替。
產(chǎn)生隨機(jī)打亂的一個(gè)序列。troch.randperm()函數(shù)非常有用。一般情況下,我們的數(shù)據(jù)集中的數(shù)據(jù)都是有序的,在訓(xùn)練和檢測的時(shí)候,我們都需要一些隨機(jī)的次序的數(shù)據(jù),這時(shí)就可以用troch.randperm()產(chǎn)生隨機(jī)的整數(shù),用這些整數(shù)作為數(shù)據(jù)集中的數(shù)據(jù)的index進(jìn)行取樣即可得到隨機(jī)的數(shù)據(jù)。
torch中也有與Python一樣的range()函數(shù),但是torch產(chǎn)生的是張量。為了避免混淆,PyTorch建議使用arange()函數(shù)。類似的,numpy中也有arange()函數(shù)。
torch與Python一樣支持切片功能,且語法幾乎一致。
reshape()函數(shù)是tensor自帶的函數(shù)。它可以改變tensor的維度和尺寸。例如把[4, 1, 28, 28]的四維數(shù)據(jù)轉(zhuǎn)化成1~4維,只需要保證轉(zhuǎn)變之后的數(shù)據(jù)的維度的乘積與轉(zhuǎn)變之前相等。
卷積操作需要的是二維數(shù)據(jù),而卷積層后的全連接層需要一維數(shù)據(jù)。用reshape()函數(shù)處理之后就可以把n張圖片的二維數(shù)據(jù)轉(zhuǎn)成一維數(shù)據(jù)。當(dāng)然,有些預(yù)處理的圖片是一維數(shù)據(jù),也可以用這個(gè)函數(shù)處理成二維數(shù)據(jù),然后進(jìn)行卷積操作。
a.unsqueeze()就是在指定的位置插入一個(gè)維度,里面的參數(shù)是插入的維度的位置。這里的參數(shù)與Python的切片用的參數(shù)完全一致。
與a.unsqueeze()相反,a.squeeze()是壓縮指定位置的維度。如果不指定參數(shù),則壓縮所有能壓縮的維度。所有一維的維度都是可以壓縮的。
b.expand()是維度擴(kuò)展,注意這是維度擴(kuò)展,而不是維度增加。這里a是4維的,b必須也是4維的才能進(jìn)行擴(kuò)展。里面的參數(shù)也是跟Python的切片一樣。最后還有一個(gè)b.expand_as(a),就是把b擴(kuò)展成a一樣的尺寸。
a.repeat()是把a(bǔ)的每個(gè)維度重復(fù)多少次。這里需要指定每一個(gè)維度的重復(fù)次數(shù)。
在數(shù)學(xué)上,二維矩陣使用a.T表示轉(zhuǎn)置,在PyTorch中使用a.t()表示。但轉(zhuǎn)置僅限于二維矩陣。
a.transpose(1, 3)表示交換兩個(gè)維度的數(shù)據(jù)。當(dāng)交換數(shù)據(jù)與矩陣變形聯(lián)用時(shí)一定要當(dāng)心數(shù)據(jù)被污染。
permute():手動(dòng)指定各個(gè)維度的數(shù)據(jù)的存放位置,這個(gè)方法比transpose()更靈活。
矩陣也可以像字符串一樣分割,使用的也是split()。很是好奇,PyTorch怕range()函數(shù)與Python中的range()函數(shù)混淆,但卻不怕split()函數(shù)與Python中的split()函數(shù)混淆。
上述內(nèi)容就是如何實(shí)現(xiàn)PyTorch的基本數(shù)據(jù)類型、數(shù)據(jù)的獲得和生成,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。