【AI學習篇】實戰深度學習(5):張量操作第二彈

醫工薈萃,不是蘿蔔開會,融合創新才是硬道理!

預計閱讀時間: 6 分鐘

上一講薈薈講了一下張量切片、逐元素運算、廣播,這一講再說說張量點積和張量變形,集齊這五種裝備,基本可以開始愉快地玩耍了。

張量點積

前面我們說過逐元素運算,要將兩個張量進行逐元素相乘,我們使用“*“運算符,比如將兩個矩陣A和B進行逐元素相乘

【AI學習篇】實戰深度學習(5):張量操作第二彈

而在神經網絡中,經常需要類似圖1的乘法方式,我們將輸入向量和權值向量的對應元素進行相乘後再求和,這種方式我們稱之為張量點積。

【AI學習篇】實戰深度學習(5):張量操作第二彈

圖1

如圖2所示,如果有多個神經元需要輸出,則可以把輸入X寫成一個列向量,它的轉置為

【AI學習篇】實戰深度學習(5):張量操作第二彈

輸入權值矩陣可寫為

【AI學習篇】實戰深度學習(5):張量操作第二彈

該矩陣的每一列,代表輸入到中間層某一個神經元的權值向量,如下圖中輸入到z2的權值正是上述矩陣的第二列。從圖中可以看出,我們得到的中間層神經元的輸出(這裡為了簡單起見省略了非線性激活函數,如ReLU)也是一個列向量,如下:

【AI學習篇】實戰深度學習(5):張量操作第二彈

其中的第n個元素正是輸入的每個元素和W的第n列對應元素一一相乘並相加的結果。如果向更高維度擴展,輸入不是一個向量,而是一個矩陣,比如我們將100個輸入樣本向量輸入剛才討論的神經網絡,那麼X

T的形狀就是(100,3),ZT的形狀就是(100,4)。

【AI學習篇】實戰深度學習(5):張量操作第二彈

圖2

看到這裡,學過線性代數的童鞋可能已經看出,這不就是我們學過的矩陣乘法嘛,沒錯,這裡說的張量點積,如果是2d張量(矩陣),就是我們最常見的矩陣乘法,語法如下。

【AI學習篇】實戰深度學習(5):張量操作第二彈

只不過它還可以繼續拓展,比如要在神經網絡裡處理視頻數據,形狀通常是(幀,長,寬,顏色),如果需要進行點積(對應元素相乘相加),這時候如果有一個底層優化過的張量點積運算,我們就可以保持其他維度不變,直接用一次dot把所有幀和顏色的張量都進行相同的點積運算,而按照傳統方法我們則需要進行多重循環。

在Numpy中,如果A為M維張量,B為N為張量,兩個張量的點積就是

將A張量的最後一個軸中的所有元素,與B張量中倒數第二個軸的所有元素對應相乘後相加的結果,也就是dot(a, b)[i,j,k,m] = sum(a[i,j,:] * b[k,:,m])。有點暈菜對不對,下面用矩陣來解釋一下,如圖3所示,矩陣x的第一個軸是行,第二個軸是列,矩陣一共就兩個軸,所以x的最後一個軸就是列,同理y的倒數第二個軸是行。可見矩陣x和y的點積就是將x第i行中的所有列(x的最後一個軸)和y第j列中的所有行(y的倒數第二個軸)對應相乘並相加的結果返回給z(i,j)。從這個例子中也可以發現,這就要求x的列數必須等於y的行數,也就是A張量最後一個軸的元素數量必須等於B張量倒數第二個軸中的元素數量。

【AI學習篇】實戰深度學習(5):張量操作第二彈

圖3

那麼張量點積後的形狀和輸入張量形狀的關係又是什麼呢,以一個例子來說明一下,如果A的形狀為(a,b,c,d),B的形狀為(d,e),那麼numpy.dot(A,B)的形狀為(a,b,c,e)。如果A的形狀為(a,b,c,d), B的形狀為(c,d),那麼就呵呵了,因為A的最後一個軸元素數量為d,而B的倒數第二個軸元素數量為c,不匹配,會報錯。

下面給出了一個矩陣乘法的實際案例,小夥伴們去仔細研究一下吧。

【AI學習篇】實戰深度學習(5):張量操作第二彈

此外,Numpy還提供了一種更為靈活的張量點乘函數numpy.tensordot(a,b,axes),可以指定需要和並的軸,但是不太容易理解,這裡就不寫出來混淆試聽了,有興趣的朋友們可以看看Chenxiao Ma的博客,寫的還挺清楚的https://www.machenxiao.com/blog/tensordot

對於初學者來說知道numpy.dot就是求矩陣乘法也基本夠用了

張量變形

  • reshape

張量變形其實咱們在第二講中已經見過,當時我們需要把一個形狀為(60000,28,28)的手寫字符圖像張量輸入一箇中間層為784個神經元的密集連接型神經網絡。所以需要將這個張量變形為(60000,28*28)的形狀,才好和後面的全連接神經網絡進行加權點乘。當時我們的預處理代碼是:

train_images =train_images.reshape((60000, 28 * 28))

reshape函數很簡單,輸入參數就是你想要的新形狀,只要新張量中的元素個數和原始張量中的元素個數是一樣的即可。元素的安排順序默認和c語言是一致的,即依次進行排列。下面兩個例子可以讓你清楚地理解這一操作。

【AI學習篇】實戰深度學習(5):張量操作第二彈

【AI學習篇】實戰深度學習(5):張量操作第二彈

  • 轉置Transpose

另一種常見的張量變形就是轉置了,即把矩陣的行換成列,列換成行,也就是x[i,:]變為x[:,i],語法為np.transpose(x)。

【AI學習篇】實戰深度學習(5):張量操作第二彈

到這裡,張量最常見的幾種常見的操作和運算算是告一段落,總結一下本講的內容:1.

張量點積(相乘相加,2D張量就是矩陣乘法);2. 張量變形(張量在神經網絡逐層傳播,每一層的輸入和輸出形狀有可能發生變化,需要變形加以適應)。下一講我們會從卷積神經網絡開始正式進入深度學習的實際操作,過程中我們會反覆操練這些張量操作方法。



分享到:


相關文章: