Python 将标量输入Tensorflow 2模型的正确方法

Python 将标量输入Tensorflow 2模型的正确方法,python,tensorflow,deep-learning,Python,Tensorflow,Deep Learning,在我的Tensorflow 2模型中,我希望批量大小是参数化的,这样我就可以动态地构建具有适当批量大小的张量。我有以下代码: batch_size_param = 128 tf_batch_size = tf.keras.Input(shape=(), name="tf_batch_size", dtype=tf.int32) batch_indices = tf.range(0, tf_batch_size, 1) md = tf.keras.Model(inputs=

在我的Tensorflow 2模型中,我希望批量大小是参数化的,这样我就可以动态地构建具有适当批量大小的张量。我有以下代码:

batch_size_param = 128

tf_batch_size = tf.keras.Input(shape=(), name="tf_batch_size", dtype=tf.int32)
batch_indices = tf.range(0, tf_batch_size, 1)

md = tf.keras.Model(inputs={"tf_batch_size": tf_batch_size}, outputs=[batch_indices])
res = md(inputs={"tf_batch_size": batch_size_param})
代码在
tf.range
中抛出错误:

ValueError: Shape must be rank 0 but is rank 1
 for 'limit' for '{{node Range}} = Range[Tidx=DT_INT32](Range/start, tf_batch_size, Range/delta)' with input shapes: [], [?], []
我认为问题在于,
tf.keras.Input
自动尝试在第一维度扩展输入数组,因为它期望输入的部分形状而不需要批量大小,并将根据输入数组的形状附加批量大小,在我的例子中,这是一个标量。我可以将标量值作为一个常量整数输入
tf.range
,但这次,在编译模型图之后,我将无法更改它


有趣的是,尽管我也查看了文档,但我没有找到一种只向TF-2模型中输入标量的正确方法。那么,处理这种情况的最佳方法是什么呢?

不要使用
tf.keras.Input
,只需通过子类化定义模型即可

将tensorflow导入为tf
类ScalarModel(tf.keras.Model):
定义初始化(自):
super()。\uuuu init\uuuuu()
def呼叫(自我,x):
返回tf.范围(0,x,1)
打印(ScalarModel()(10))
#tf.Tensor([01234456789],shape=(10,),dtype=int32)

我不确定这是否真的是个好主意,但你可以像这样使用tf.squeak

inp = keras.Input(shape=(), dtype=tf.int32)
batch_indices = tf.range(tf.squeeze(inp))
model = keras.Model(inputs=inp, outputs=batch_indices)
所以

model(6)
给予

会使

model(np.array([6,7]))
返回

<tf.RaggedTensor [[0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5, 6]]>

model(np.array([6,7]))
<tf.RaggedTensor [[0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5, 6]]>