在 tf.keras.Model 中获取输入形状(命令 API)

Get input shape in tf.keras.Model (Imperative API)

我使用 Tensorflow 2.0,我有一个在 Imperative API 中定义的模型。在调用方法中我使用这样的东西:

b, h, w, c = images.shape
k_h, k_w = kernels.shape[2], kernels.shape[3]

images = tf.transpose(images, [1, 2, 0, 3])  # (h, w, b, c)
new_shape = tf.TensorShape([1, h, w, b * c])
images = tf.reshape(images, new_shape)

当我使用自定义循环训练我的模型时——没问题。但我想将我的模型移植到 SavedModel 格式。我使用以下函数:

tf.keras.experimental.export_saved_model(
        model, file_path,
        serving_only=True,
        input_signature=[
                tf.TensorSpec(shape=[None, None, None, 3], dtype=tf.float32),
            ]
        )

我得到错误:

TypeError: unsupported operand type(s) for *: 'NoneType' and 'int'

此外,即使指定 shape=[1, None, None, 3] 我也做不到,因为我得到了:

ValueError: Tried to convert 'shape' to a tensor and failed. Error: Cannot convert a partially known TensorShape to a Tensor: (1, None, None, 3)

这意味着我根本无法进行重塑。但我需要它。我该怎么做?

当 运行 在图形模式下使用 tf.shape。 tf.Tensor.shape 在图形模式下运行时自动形状推断失败。 这是经过必要更改的代码。

image_shape = tf.shape(images)
kernel_shape = tf.shape(kernels)
b, h, w, c = image_shape[0], image_shape[1], image_shape[2], image_shape[3], 
k_h, k_w = kernel_shape[2], kernel_shape[3]

images = tf.transpose(images, [1, 2, 0, 3])  # (h, w, b, c)
new_shape = tf.TensorShape([1, h, w, b * c])
images = tf.reshape(images, new_shape)