2017-10-16 76 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)