2017-10-16 58 views
0

我正在使用keras==2.0.8tensorflow==1.3.0後端。 這裏是一個我很困惑與例如:Keras無法正確設置圖層的動態形狀

from keras.layers import Input, Reshape, Conv2DTranspose 

x = Input((5000,)) 
y = Reshape((25, 25, 8))(x) 
y = Conv2DTranspose(10, 5, padding='same', strides=2)(y) 
print(y) 

這只是我的模型的一部分,這些行後,我在一些tensorflow操作使用y,但形狀(?, ?, ?, 10)的代碼上面打印節點。我不知道爲什麼TF不能靜態地推導出張量的高度和寬度。 (我知道keras可以,但我希望TF節點具有適當的形狀)

+0

究竟是你的問題和期望的結果? – desertnaut

+0

我預計輸出節點的形狀就像'(50,50,10)',就像最後一個keras層的輸出形狀一樣。 –

回答

0

如果您打算在keras模型中使用這些tensorflow操作,則必須在Lambda層內使用它們。

在爲lambda層創建的函數中,可以正常使用給定的張量。除非你有一個非常特殊的張量流量原因來明確這個固定尺寸,否則不會有任何問題。是否有任何特殊需求要求您具有明確的形狀張量流張量?

在Keras中,您始終可以在keras張量中使用K.shape()來獲得其形狀。很多功能都可以採用這種形式(主要是張量流)作爲輸入。如果您可以使用keras後端函數而不是純張量流函數,那麼您的代碼稍後可以移植到其他後端。功能

例子:

def tensorflowPart(x): 

    #do tensorflow operations with the tensor x 

    shape = K.shape(x) #use the shape of the tensor, as a tensor 

    #more tensorflow operations 

    return result 

在模型中使用的拉姆達層:

y = Lambda(tensorflowPart)(y)