Python 将标量输入Tensorflow 2模型的正确方法
在我的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=
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]]>