Learning Tensorflow(6)---維度分析

在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++)
				}
		}
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章