2017-03-22 15 views
0

我用theano後端使用keras。現在我有一個變量x,它是一個類型字段爲「TensorType(float32,3D)」的theano張量。
我在文件開頭添加爲什麼keras函數「expand_dims」改變類型?

from keras import backend as K 

。然後我說:

x = K.expand_dims(x, dim = 1) 

我預計x的類型字段應該是 「TensorType(FLOAT32,4D)」。但是,它是「TensorType(float32,(False,True,False,False))」,我找不出原因。另外,keras文檔沒有提供關於這個函數的更多信息,它只是說「在索引」dim「處添加一個1尺寸的維度。
此外,如果我執行

x = K.squeeze(x, 1) 

,x的類型字段將是 「TensorType(FLOAT32,矩陣)」,這是預期的。

回答

1

該命令expand_dimsdimshuffle Theano在操作引擎蓋下。元組(False, True, False, False)告訴你可以廣播的尺寸。你可能會意識到Numpy的廣播能力。它與一些關鍵差異相似。

來自Theano開發者:Theano需要在編譯之前在圖中聲明所有可廣播的維。 NumPy使用運行時間形狀信息。

有關更多詳細信息,請參閱thisthis

對於您的4-D陣列,第二個維度即頻道是可廣播的。因此,讓我們假設您的4維數組大小爲(10,N,20,30)。現在,您可以對4維數組和另一個大小爲(10,1,20,30)的數組進行元素乘法,而不必重複第二維N次。這被稱爲廣播。現在,您嘗試將您的4維數組和另一個大小爲(1,N,20,30)的數組相乘。這將失敗,因爲第一個維度不可廣播。我希望這很清楚。

+0

我瞭解廣播機制。實際上,我試圖將TensorType(float32,4D)的張量壓縮到TensorType(float32,3D)的張量上,對它做一些處理,並將其恢復爲張量TensorType(float32,4D) )'。但是,我可以將它恢復爲TensorType(float32,(False,True,False,False))張量,我想知道如何將它恢復爲張量'TensorType(float32,4D)'。 – ptr

相關問題