我使用Tensorflow 2.0,并且有一个在命令式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)
这意味着我根本无法重塑。但是我需要。我该怎么办?
答案 0 :(得分:1)
在图形模式下运行时,请使用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)