首页 > 解决方案 > map_fn 和 tf.keras.layers.Input

问题描述

我有一个输入,它由两个整数组成,开始和结束。我想生成一个包含从开始到结束的整数的张量。例如,给定 (2, 5) 作为输入,我想生成 (2,3,4,5) 这是我的尝试:

start_end_input = tf.keras.layers.Input(shape=(2,), dtype=tf.int32, name="start_end")
tf.map_fn(lambda row: tf.range(row[0], row[1]), start_end_input, dtype=(tf.int32, tf.int32))

我得到了这个:

self._tensor_array = [None for _ in range(size)]
TypeError: 'Tensor' object cannot be interpreted as an integer

任何想法?

谢谢。

标签: pythontensorflowkerastensortf.keras

解决方案


tf.ragged.range采用限制向量(以及可选的开始和步骤向量),并返回包含请求范围的RaggedTensor 。例如:

>>> tf.ragged.range([0, 5, 8], [3, 3, 12])
<tf.RaggedTensor [[0, 1, 2], [], [8, 9, 10, 11]]>

如果你想把它包装在 Keras 中,它看起来像这样:

>>> model = tf.keras.Sequential([
...     tf.keras.layers.Input(shape=(2,), dtype=tf.int32, name="start_end"),
...     tf.keras.layers.Lambda(lambda row: tf.ragged.range(row[:,0], row[:,1]))])
>>> model.predict([[1, 10], [5, 8], [2, 4]])
<tf.RaggedTensor [[1, 2, 3, 4, 5, 6, 7, 8, 9], [5, 6, 7], [2, 3]]>

推荐阅读