0
本文作者: AI研習(xí)社-譯站 | 2020-08-20 15:00 |
字幕組雙語(yǔ)原文:深度學(xué)習(xí)基礎(chǔ):張量運(yùn)算
英語(yǔ)原文:Tensor Operations — Basic Building Blocks of Deep Learning
2012-至今:深度學(xué)習(xí)爆炸時(shí)代
在2012年的Imagenet運(yùn)動(dòng)之后,深度學(xué)習(xí)取得了突飛猛進(jìn)的發(fā)展。 深度學(xué)習(xí)現(xiàn)在已經(jīng)成為我們?nèi)粘I钪胁豢苫蛉钡囊徊糠?,?dāng)我們與語(yǔ)音助手交談、使用家庭自動(dòng)化系統(tǒng)、寫(xiě)電子郵件等時(shí),許多算法都在運(yùn)行。事實(shí)上,它的影響是如此之大,以至于我們可以在亞馬遜上看到名為“嬰兒的神經(jīng)網(wǎng)絡(luò)”的書(shū)籍:D
就其核心而言,深度學(xué)習(xí)只不過(guò)是人腦工作方式的縮影(忽略了人腦中存在的實(shí)際復(fù)雜性,這種復(fù)雜性仍然很難復(fù)制)。 計(jì)算機(jī)使用成百上千個(gè)跨越深層的神經(jīng)元連接從它的輸入和輸出中學(xué)習(xí)(因此有了“深度學(xué)習(xí)”這個(gè)詞)。
每一個(gè)神經(jīng)元連接都有與自身相關(guān)的不同重量。
在每次迭代中對(duì)權(quán)值進(jìn)行優(yōu)化,使預(yù)測(cè)損失最小化,并以最高精度預(yù)測(cè)輸出。計(jì)算機(jī)是機(jī)器,機(jī)器只懂?dāng)?shù)字。因此,在底層,我們討論的所有這些權(quán)重都是n維矩陣或張量。
由于每個(gè)權(quán)值都是一個(gè)n維矩陣或張量,權(quán)值的學(xué)習(xí)和優(yōu)化涉及數(shù)百萬(wàn)個(gè)矩陣乘法。在過(guò)去的6-7年中,我們已經(jīng)看到許多DL框架的出現(xiàn),它們簡(jiǎn)化了這個(gè)任務(wù)。
五大深度學(xué)習(xí)框架(Pythorch、Tensorflow、Keras、CNTK、Caffe)
Pytorch是一個(gè)流行的深度學(xué)習(xí)框架,由Facebook人工智能研究(FAIR)開(kāi)發(fā)和維護(hù),用于處理張力。自2016年1.0.0發(fā)布以來(lái),由于使用的簡(jiǎn)單性和靈活性,它獲得了極大的普及。在本文中,我們將主要關(guān)注使用Pytorch的一些核心張量運(yùn)算。您可能想通過(guò)這個(gè)博客了解如何安裝PyTorch的詳細(xì)說(shuō)明。
torch.size
torch.mm
torch.cat
torch.mul
torch.inverse
Torch.size返回任何輸入張量的維度。
x = torch.tensor([ [[1, 2, 3, 4], [3, 4., 6, 7]], [[10,20,30,40], [20,30,40,50]], [[5,6,7,8], [9,10,11,12]] ]) x.size() torch.Size([3, 2, 4]) |
在上面的示例中,我創(chuàng)建了一個(gè)3X2X4張量,torch.size返回3個(gè)維度。 我們的張量在外括號(hào)內(nèi)有3個(gè)元素,每個(gè)元素都是一個(gè)矩陣。 每個(gè)矩陣同樣有2個(gè)元素,每個(gè)元素都是一個(gè)包含4個(gè)元素的列表。
2.torch.mm
torch.mm返回任意兩個(gè)輸入矩陣matr1和mat2的矩陣乘法(不是元素一一對(duì)應(yīng)相乘)
mat1 = torch.tensor([[1,2,3], [4,5,6], [6,7,8]]) mat2 = torch.tensor([[10,20,30], [40,50,60], [60,70,80]]) x = torch.mm(mat1, mat2) y = mat1@mat2 x,y (tensor([[ 270, 330, 390], [ 600, 750, 900], [ 820, 1030, 1240]]), tensor([[ 270, 330, 390], [ 600, 750, 900], [ 820, 1030, 1240]])) |
在上面的示例中,mat1和mat2的大小均為3X3。 因此,torch.mm的輸出大小也為3X3。 我們可以看到可以使用“ @”運(yùn)算符代替torch.mm來(lái)執(zhí)行相同的操作。
使用torch.mm()時(shí)要注意的幾點(diǎn)
第一個(gè)輸入矩陣的列大小應(yīng)等于第二個(gè)輸入矩陣的行大小
對(duì)于不是矩陣或大于2維的張量,torch.mm不起作用,我們可以使用torch.mul進(jìn)行逐個(gè)元素的乘法
‘@'運(yùn)算符執(zhí)行與torch.mm相同的操作
Torch.cat可以水平或垂直連接2個(gè)張量
#假設(shè)我們有以下2個(gè)張量,并嘗試垂直連接它門(mén)x = torch.tensor([[1,3], [2,5], [3,6]]) y = torch.tensor([[10,30], [20,50], [30,60]]) z = torch.cat((x,y)) z tensor([[ 1, 3], [ 2, 5], [ 3, 6], [10, 30], [20, 50], [30, 60]]) |
我們可以看到,張量y已經(jīng)堆疊在張量x的下方。
# 現(xiàn)在我們嘗試著將它們水平連接起來(lái)x = torch.tensor([[1,3], [2,5], [3,6]]) y = torch.tensor([[10,30], [20,50], [30,60]]) z = torch.cat((x,y), dim = 1) z tensor([[ 1, 3, 10, 30], [ 2, 5, 20, 50], [ 3, 6, 30, 60]]) |
通過(guò)使用dim參數(shù)并將其設(shè)置為1,我們可以水平連接2個(gè)張量。 默認(rèn)設(shè)置為0,這將導(dǎo)致垂直串聯(lián)。
使用torch.cat時(shí)的注意事項(xiàng)
使用dim = 1來(lái)水平連接張量
可以連接任意數(shù)量的張量,但是,請(qǐng)確保張量在串聯(lián)方向上的大小應(yīng)相同
torch.mul 可對(duì)2個(gè)張量進(jìn)行逐元素乘法。
mat1 = torch.tensor([[[1,2,3], (tensor([[[ 10, 40, 90], tensor([[[ 10, 40, 90], |
我們可以看到逐元素乘法適用于任何維度的張量。使用*運(yùn)算符或者使用a.mul(b),其中a和b為輸入張量,也可以實(shí)現(xiàn)torch.mul的功能。
mat1 = torch.randn(1,1,4) mat2 = torch.randn(2,2,4) x = torch.mul(mat1, mat2) y = mat1 * mat2 z = mat1.mul(mat2) x,y,z (tensor([[[ 0.3923, 1.2011, -0.7222, -0.0097], [-0.3082, -0.7667, 0.0777, -0.1011]], [[-0.0289, 0.6919, 0.2720, -0.0952], [-0.3427, -1.1867, -1.0518, -0.0562]]]), tensor([[[ 0.3923, 1.2011, -0.7222, -0.0097], [-0.3082, -0.7667, 0.0777, -0.1011]], [[-0.0289, 0.6919, 0.2720, -0.0952], [-0.3427, -1.1867, -1.0518, -0.0562]]]), tensor([[[ 0.3923, 1.2011, -0.7222, -0.0097], [-0.3082, -0.7667, 0.0777, -0.1011]], [[-0.0289, 0.6919, 0.2720, -0.0952], [-0.3427, -1.1867, -1.0518, -0.0562]]])) |
Torch.mul can be used for broadcasting of tensors. For tensors to be broadcastable, the following conditions should be met: Each tensor should have atleast one dimension When iterating over the dimension sizes, starting at the trailing dimension, the dimension sizes must either be equal, one of them is 1, or one of them does not exist. |
使用torch.mul時(shí)要注意的幾點(diǎn)
torch.mul類似于兩個(gè)向量之間的點(diǎn)積。
“ *”運(yùn)算符或a.mul(b)也執(zhí)行與torch.mm相同的操作
輸入張量應(yīng)滿足廣播條件
torch.inverse計(jì)算任意張量的逆
x = torch.rand(4, 4) print(x) y = torch.inverse(x) print(y) print(x@y) tensor([[0.5113, 0.6916, 0.4692, 0.0154], [0.3848, 0.3022, 0.0248, 0.9268], [0.8846, 0.6778, 0.0108, 0.8708], [0.2503, 0.9674, 0.8385, 0.3985]]) tensor([[ 5.4673, 3.9426, -2.8567, -3.1387], [-7.0532, -7.4136, 6.1454, 4.0863], [ 6.5743, 6.5758, -5.9237, -2.6038], [-0.1456, 1.6838, -0.6596, 0.0402]]) tensor([[ 1.0000e+00, -5.8052e-07, -4.9533e-08, 2.9703e-09], [ 2.4891e-07, 1.0000e+00, -2.3864e-08, -1.8278e-07], [ 3.2888e-07, 2.2601e-08, 1.0000e+00, -1.5329e-07], [ 3.5323e-07, -2.4265e-08, -4.5756e-07, 1.0000e+00]]) |
這里,我們通過(guò)使用randn函數(shù)來(lái)建立了一個(gè)由隨機(jī)數(shù)組成的4x4張量。torch.inverse可計(jì)算x的逆。Inv(x) @ X 則會(huì)返回一個(gè)單位矩陣。
使用torch.inverse需要注意的幾點(diǎn):
只有在輸入張量的各個(gè)維度的元素?cái)?shù)量相同時(shí)才可以正常使用torch.inverse
torch.inverse 同樣適用于3維張量。但是張量在各個(gè)方向上的維度需要相同或者為方陣張量。
這篇文章里我主要提及了一下幾點(diǎn):
什么是深度學(xué)習(xí)?
Pytorch是啥?
什么是重要的張量運(yùn)算?
如何實(shí)現(xiàn)執(zhí)行上述張量運(yùn)算的核心功能?
使用這些功能時(shí)要注意的幾點(diǎn)是什么?
雷鋒字幕組是一個(gè)由 AI 愛(ài)好者組成的翻譯團(tuán)隊(duì),匯聚五百多位志愿者的力量,分享最新的海外AI資訊,交流關(guān)于人工智能技術(shù)領(lǐng)域的行業(yè)變革與技術(shù)創(chuàng)新的見(jiàn)解。
團(tuán)隊(duì)成員有大數(shù)據(jù)專家、算法工程師、圖像處理工程師、產(chǎn)品經(jīng)理、產(chǎn)品運(yùn)營(yíng)、IT咨詢?nèi)?、在校師生;志愿者們?lái)自IBM、AVL、Adobe、阿里、百度等知名企業(yè),北大、清華、港大、中科院、南卡羅萊納大學(xué)、早稻田大學(xué)等海內(nèi)外高校研究所。
如果,你也是位熱愛(ài)分享的AI愛(ài)好者。歡迎與雷鋒字幕組一起,學(xué)習(xí)新知,分享成長(zhǎng)。
雷鋒網(wǎng)雷鋒網(wǎng)
雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見(jiàn)轉(zhuǎn)載須知。