在tensorflow中的各種運算中,首先滿足的就是變量的維度匹配,但tensorflow中繁複的維度經常使人眼花繚亂,這種問題在面臨複合神經網絡及不定長序列問題時尤爲明顯,本文分析tensorflow中常見維度及相互之間的關係。
首先要明確要使用網絡的輸入結構是什麼,在根據它來構建輸入數據維度。然後需要明確數據來源的維度是什麼,數據來源包括原始的特徵,或者上一層網絡的輸出數據。然後使用維度轉換的函數進行維度的匹配,核心用到的函數是transpose和reshape。
例如
CNN輸入數據維度:
N(Batch size) H(2D feature height) W(2D feature weight) C(channels)
LSTM輸入數據維度
batch_size, n_step_max, n_hidden_unit.
數據對齊
在使用cnn處理不定長特徵序列的時候,需要以最長的那個序列爲基準,進行補充對齊,以最長的那個序列的序列長度,作爲矩陣中序列長度維度的大小。
在使用lstm處理不定長特徵序列時,由於tensorflow中支持不定長序列,所以需要將序列進行padding
維度衰減
在進行卷積運算的時候,輸出維度相比於輸入維度會有減少。
維度變換
reshape
將一維數據轉變爲二維數據,當張量的形狀發生變化時,總元素個數需保持不變。
a= np.array([1,2,3,4,5,6,7,8])
d = a.reshape((2,4))
>>>d
array([[1, 2, 3, 4],[5, 6, 7, 8]])
當不知填什麼數據合適時,使用-1表示,python可通過其他值,推斷出這個值。
a = np.array([[1,2,3],[4,5,6]])
np.reshape(a,(3,-1))
array([[1, 2], [3, 4],[5, 6]])
在做reshape的時候,一定要搞清楚每個維度的數目,所以需要計算網絡的輸出維度
交換維度
transpose
tf.transpose(input, [dimension_1, dimenaion_2,..,dimension_n])
當輸入張量爲二維時,相當於轉置,當輸入張量爲多維時,這個列表裏參數對應的是原度與現維度的對應關係,例如[2,1,0],表示將張量的第三維度和第一維度交換。
維度順序
例如一個4維數據
a= np.array([[[[1],[2],[3],[4]],[[5],[6],[7],[8]],[[9],[10],[11],[12]]],[[[13],[14],[15],[16]],[[17],[18],[19],[20]],[[21],[22],[23],[24]]]])
a . shape = (2,3,4,1)
可以理解爲2個shape爲(3,4,1)的三維數據。
在內存中的存儲順序爲:
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24
如果使用For訓練遍歷,For循環從外到裏對應維度的從左到右。
for(int i=0; i<2; i++){
for(int j=0; j<3; j++){
for(int k=0; k<4; k++){
for(int l=0; l<1; l++){
a[i][j][k][l] = *(data++)
}
}
}
}