我用的是Tensorflow 2.3。
如果我使用普通tf张量输入,下面的示例工作得很好:
import tensorflow as tf
text_input = tf.keras.Input([None], dtype=tf.string, name="text_input", ragged=False)
predictions = tf.gather(text_input, 0, axis=-1)
model = tf.keras.Model(inputs=[text_input], outputs=[predictions])
model(tf.constant([['A1', 'A2', 'A3'], ['B1', 'B2', 'B3']]))
<tf.Tensor: shape=(2,), dtype=string, numpy=array([b'A1', b'B1'], dtype=object)>然而,如果我将输入更改为粗糙的张量,则在创建模型时会出现一个错误。
import tensorflow as tf
ragged_input = tf.keras.Input([None], dtype=tf.string, name="ragged_input", ragged=True)
padded_input = ragged_input.to_tensor('')
predictions = tf.gather(padded_input, 0, axis=-1)
model = tf.keras.Model(inputs=[ragged_input], outputs=[predictions])
---------------------------------------------------------------------------
InvalidArgumentError Traceback (most recent call last)
<ipython-input-201-9adaf4aae2b5> in <module>()
3 padded_input = ragged_input.to_tensor('')
4 predictions = tf.gather(padded_input, 0, axis=-1)
----> 5 model = tf.keras.Model(inputs=[ragged_input], outputs=[predictions])
13 frames
/usr/local/lib/python3.6/dist-packages/tensorflow/python/eager/execute.py in quick_execute(op_name, num_outputs, inputs, attrs, ctx, name)
58 ctx.ensure_initialized()
59 tensors = pywrap_tfe.TFE_Py_Execute(ctx._handle, device_name, op_name,
---> 60 inputs, attrs, num_outputs)
61 except core._NotOkStatusException as e:
62 if name is not None:
InvalidArgumentError: You must feed a value for placeholder tensor 'Placeholder_38' with dtype int64 and shape [?]
[[node Placeholder_38 (defined at <ipython-input-201-9adaf4aae2b5>:5) ]] [Op:__inference_keras_scratch_graph_136790]
Function call stack:
keras_scratch_graph发布于 2020-09-11 12:14:27
在我看来,这是一个bug,因为对Keras的RaggedTensor支持不是最好的(参见这里)。我不太清楚是什么原因造成的,但衣衫褴褛的转换对于占位符来说是失败的。
如果可以,最好在将所有RaggedTensor功能作为输入传递和设置ragged=False之前使用它。如果您只想将它用于方便的填充,并且如果所有的图形操作都是基于非粗糙的张量(您的例子就是这样),那么这不是一个问题:
import tensorflow as tf
ragged_input = tf.keras.Input([None], dtype=tf.string, name="ragged_input", ragged=False)
# padded_input = ragged_input.to_tensor('')
predictions = tf.gather(ragged_input, 0, axis=-1)
model = tf.keras.Model(inputs=[ragged_input], outputs=[predictions])
padded_input = tf.ragged.constant([['A1', 'A2'], ['B1', 'B2', 'B3']]).to_tensor('')
result = model(padded_input)
print(result)
# >>> tf.Tensor([b'A1' b'B1'], shape=(2,), dtype=string)发布于 2020-10-06 07:51:55
如果您有单个输入和输出,可以尝试创建一个tf.keras.Sequential模型。
https://stackoverflow.com/questions/63841792
复制相似问题