Keras无法正确设置图层的动态形状

时间:2017-10-16 10:42:13

标签: tensorflow keras

我正在使用keras==2.0.8 tensorflow==1.3.0后端。 这是我感到困惑的例子:

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节点具有正确的形状)

1 个答案:

答案 0 :(得分:0)

如果您打算在keras模型中使用这些tensorflow操作,则必须在Lambda层内使用它们。

在为lambda图层创建的函数中,您可以正常使用给定的张量。除非你有一个非常具体的因为tensorflow有明确的固定大小,所以不会有任何问题。是否有任何特殊需要要求您使张量流量张量具有明确的形状?

在Keras中,你总是可以在keras张量中使用K.shape()来获得它的形状。许多keras backend函数可以采用这种形状(主要是使用tensorflow)作为输入。如果您可以使用keras后端函数而不是纯tensorflow函数,那么您的代码可以在以后移植到其他后端。

功能示例:

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

在模型中使用lambda图层:

y = Lambda(tensorflowPart)(y)