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

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

預計閱讀時間: 6 分鐘

上一講,薈薈介紹了什麼是張量,即矩陣向各個維度的擴展。這一講,我們來說一說張量的常見操作和運算,主要包括:張量切片、逐元素運算、廣播、張量乘法、變形。這五種操作在深度學習裡最最常見,當然張量的運算遠不止這5種,還有拼接、迭代、卷積等等,so many。篇幅有限,本講主要介紹深度學習裡最常用的五種中的前三種,其他的運算在實際應用中遇到了再學習也不遲,打好根基,見招拆招。下面容薈薈一一道來。

1. 張量切片(取子集)

根據上一講的介紹,張量是層層疊疊的一個大傢伙,1D張量(向量)的構成元素是0D張量(標量),2D張量(矩陣)的構成元素是1D張量(向量), 3D張量就是一堆2D張量矩陣構成,可以類似的向更高維度的張量拓展。那麼對於這麼一個大傢伙,除了整體把握,我們肯定想時不時地看看它的局部,這種操作就是

切片(Slicing),就是用小刀割一部分下來瞅瞅,薈薈稱之為取子集

在keras中,張量使用Numpy數組表示,所以張量的切片就是Numpy的切片。下面用一個具體實例來講解一下比較常用的切片操作。

還是以第二講中的Mnist數據集為例(首先使用第二講中同樣的方法加載Minst數據集)。該數據集是由60000張28*28的灰度圖像構成的,也就是說它的shape屬性是(60000,28,28),其中60000是批量維度,代表有60000個樣本、第一個28是像素行、第二個28像素列。現在我們只想把其中的第11張到第100張(共90個)取出來,可以有三種方式進行操作。

(1) 指定每個維度的取值範圍:

操作方法如圖1所示,需要注意,每個維度都是從0開始編號的,第11張到第100張,是10:100, 包含編號10但不包含編號100。同理,像素全部都取的話就是0:28,包含編號為0像素,但是不包含編號28(本來就一共28個像素,即從編號0到編號28-1)。這種取編號的秘訣,薈薈稱之為

“編號從零始,包頭不包尾”。

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

圖 1

(2) 用“:”代替某維度的全部

如圖2所示,我們指定了批量維度的取子集範圍,像素維度因為都要取出,所以直接用“:”代替。

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

圖 2

(3) 按順序省略全部都要取的維度

如圖3所示,只在批量維度取子集,默認像素維度都要,那麼兩個像素維度的範圍壓根就不需要寫。

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

圖 3

類似地,我們也可以取出圖像的一個區域,如右下角的14*14的圖像區域(圖4), “14:”的意思就是從編號14的行/列開始直到最後一行/列。又如取出圖像中心位置14*14的區域(圖5),“7:-7”就是從編號7的行/列到編號28-7-1=20的行/列,依舊是

“不包尾”

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

圖4

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

圖5

2. 張量逐元素運算

逐元素運算,顧名思義就是將張量的每個元素進行逐一運算,比如前面講的非線性激活運算ReLU。如圖6所示,在深度神經網絡中,如果一個輸入向量經過加權疊加後形成一個新向量,這個向量的每個元素需要依次進行ReLU運算進行非線性激活,形成輸出向量輸入下一層網絡,即把每一個元素都和0比較一下,大於等於0的保持不變,小於0的都等於0。又或是需要將兩個張量的元素對應一一相加。

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

圖 6 y向量的每個元素都要ReLU一下

使用Numpy通用函數可以把這種張量運算推送至底部的編譯層,執行效率比起python本身的解釋型操作效率高得多,運算速度飛快(不懂我在說啥的話,知道用Numpy數組進行張量運算非常快就行。)逐元素相加和逐元素ReLU運算實例如圖7所示,其中np.arange(x,y)是用來生成一個從x到y,步長為1的1D張量(向量);接下來的maximum運算就是逐元素比大小(下例中每個元素分別和0比),保留較大的那一個,也就是咱們的ReLU了。此外對於如圖8所例舉的一般數學運算都可進行逐元素操作,當然不限於這些,薈薈並沒有寫全。

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

圖 7

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

圖 8

3. 張量廣播(Broadcasting)

看到這裡,有一個疑問沒有解決,如果兩個輸入張量形狀一樣,進行逐元素運算完全沒有問題,那如果兩個輸入張量形狀不一樣,逐點運算如何進行?很貼心的是,Numpy具有這種防止運算歧義的機制,叫做廣播(Broadcasting)

,也就是將形狀較小的張量進行擴張,以匹配形狀較大的張量。其基本規則為:

(1) 如果兩個張量的維度不一樣,那麼小維度的張量形狀會在最左邊補1。比如輸入x的形狀是(20,10), y的形狀是(10,)則先把y變成(1,10)。

(2) 如果兩個張量形狀在任何一個維度都不匹配,那麼張量的形狀會沿著維度為1的維度擴展以匹配另一個張量的形狀。接著上面的例子,y為1的維度重複20次,y形狀變成(20,10),這樣就和x匹配了。

(3) 如果兩個數組的形狀在任何一個維度上都不匹配,且沒有任何一個維度等於1,則會引發異常。

看上去有點暈對不對,沒關係,研究一下圖9就很好理解了。圖10給出了一個形狀不同的兩個張量進行比大小的實例。

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

圖 9

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

圖 10

Sorry,寫著寫著又超時了,還好控制在6分鐘。總結一下,本節主要講了張量切片、逐元素運算和張量廣播三種操作,下一講再談談張量乘法又叫點積,還有張量變形,咱就算暫時基本夠用了。更多numpy數組詳細操作內容,推薦Jake VanderPlas的《Python數據科學手冊》一書。

需要本系列源代碼的同學,請關注公眾號,後臺留言,薈薈會發給你喲。


分享到:


相關文章: