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



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

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)

它只是我模型的一部分,在这些行之后,我在某些张量流操作中使用y,但上面的代码打印形状(?, ?, ?, 10)节点。我不知道为什么TF不能静态推断结果张量的高度和宽度。(我知道 keras 可以,但我想要形状合适的 TF 节点)

如果你打算在 keras 模型中使用这些张量流运算,你必须在Lambda层中使用它们。

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

在 Keras 中,您始终可以在 keras 张量中使用 K.shape() 来获得其形状。许多 keras 后端函数可以将这种形式(主要是使用张量流)作为输入。如果您可以使用 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

在模型中使用 lambda 层:

y = Lambda(tensorflowPart)(y)

最新更新