TensorFlow 文本生成 RNN 示例在 TF 2.6 上失败,tf.sparse.to_dense(),无效参数:重复索引 [1] = [0]

Posted

技术标签:

【中文标题】TensorFlow 文本生成 RNN 示例在 TF 2.6 上失败,tf.sparse.to_dense(),无效参数:重复索引 [1] = [0]【英文标题】:TensorFlow text generation RNN example failing on TF 2.6, tf.sparse.to_dense(), Invalid argument: indices[1] = [0] is repeated 【发布时间】:2021-10-26 14:19:39 【问题描述】:

我正在尝试运行 TensorFlow 文本生成 RNN 示例,

https://github.com/tensorflow/text/blob/master/docs/tutorials/text_generation.ipynb

在安装了 TensorFlow 2.6 的本地 Windows 计算机上运行。

我能够成功地运行并训练 RNN 模型。我得到一个“张量”对象没有属性“numpy”错误但添加了,

tf.compat.v1.enable_eager_execution()

这解决了它。

但现在尝试用一些文本测试模型我得到了错误,

Invalid argument: indices[1] = [0] is repeated

这发生在 OneStep 函数内的tf.sparse.to_dense

class OneStep(tf.keras.Model):
  def __init__(self, model, chars_from_ids, ids_from_chars, temperature=1.0):
    super().__init__()
    self.temperature = temperature
    self.model = model
    self.chars_from_ids = chars_from_ids
    self.ids_from_chars = ids_from_chars

    print(len(ids_from_chars.get_vocabulary()))
    # Create a mask to prevent "[UNK]" from being generated.
    skip_ids = self.ids_from_chars(['[UNK]'])[:, None]
    sparse_mask = tf.SparseTensor(
        # Put a -inf at each bad index.
        values=[-float('inf')]*len(skip_ids),
        indices=skip_ids,
        # Match the shape to the vocabulary
        dense_shape=[len(ids_from_chars.get_vocabulary())])
    print(sparse_mask)
    self.prediction_mask = tf.sparse.to_dense(sparse_mask)

我添加了一些调试来打印 ids_from_chars

76
SparseTensor(indices=tf.Tensor(
[[0]
[0]], shape=(2, 1), dtype=int64), values=tf.Tensor([-inf -inf], shape=(2,), dtype=float32), dense_shape=tf.Tensor([76], shape=(1,), dtype=int64))
2021-08-25 15:28:23.935194: W tensorflow/core/framework/op_kernel.cc:1692] OP_REQUIRES failed at sparse_to_dense_op.cc:162 : Invalid argument: indices[1] = [0] is repeated
Traceback (most recent call last):
File "app.py", line 1041, in test_nlp_text_generation
result = text_generation.predictionfunction(text, analytic_id)
File "D:\Projects\python-run-2\text_generation.py", line 238, in predictionfunction
one_step_model = OneStep(model, chars_from_ids, ids_from_chars)
File "D:\Projects\python-run-2\text_generation.py", line 166, in __init__
self.prediction_mask = tf.sparse.to_dense(sparse_mask)
File "D:\Users\james\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\ops\sparse_ops.py", line 1721, in sparse_tensor_to_dense
name=name)
File "D:\Users\james\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\ops\gen_sparse_ops.py", line 3161, in sparse_to_dense
_ops.raise_from_not_ok_status(e, name)
File "D:\Users\james\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\framework\ops.py", line 6941, in raise_from_not_ok_status
six.raise_from(core._status_to_exception(e.code, message), None)
File "<string>", line 3, in raise_from
tensorflow.python.framework.errors_impl.InvalidArgumentError: indices[1] = [0] is repeated [Op:SparseToDense]

此外,我之前在我的计算机上运行过这个示例。刚刚重新安装了 TensorFlow,并再次从头开始尝试演示。

知道是什么导致了这个错误,或者如何解决它?

【问题讨论】:

【参考方案1】:

我通过下面的代码重现了这个错误

import tensorflow as tf

#there are same values in the tensor
skip_ids = tf.constant([[0], [0]], dtype=tf.int64)

sparse_mask = tf.SparseTensor(
    # Put a -inf at each bad index.
    values=[-float('inf')] * len(skip_ids),
    indices=skip_ids,
    # Match the shape to the vocabulary
    dense_shape=[76])
print(sparse_mask)

prediction_mask = tf.sparse.to_dense(sparse_mask)

您的索引具有相同的值,它不允许在相同的位置分配值。只需在索引张量中获取唯一值:

import tensorflow as tf

skip_ids = tf.constant([[0], [0]], dtype=tf.int64)

# get unique indices
tmp1 = tf.reshape(skip_ids, shape=(-1,))
uniques, idx, counts = tf.unique_with_counts(tmp1)
uniques_ids = tf.expand_dims(uniques, axis=1)


sparse_mask = tf.SparseTensor(
    # Put a -inf at each bad index.
    values=[-float('inf')] * len(uniques_ids),
    indices=uniques_ids,
    # Match the shape to the vocabulary
    dense_shape=[76])
print(sparse_mask)

prediction_mask = tf.sparse.to_dense(sparse_mask)

print(prediction_mask)

我的tensorflow版本是2.1.0

【讨论】:

以上是关于TensorFlow 文本生成 RNN 示例在 TF 2.6 上失败,tf.sparse.to_dense(),无效参数:重复索引 [1] = [0]的主要内容,如果未能解决你的问题,请参考以下文章

Tensorflow - 使用经过训练的 RNN 生成文本

在 Tensorflow 中生成特殊输出词后如何停止 RNN?

TensorFlow:递归神经网络(RNN与LSTM)

RNN 的 TensorFlow 示例

『TensotFlow』LSTM古诗生成任务总结

探索ChatGPT技术在文本生成机器翻译领域的简单应用