Tensorflow text_generation 教程中对有状态 GRU 的误导性训练数据洗牌

Posted

技术标签:

【中文标题】Tensorflow text_generation 教程中对有状态 GRU 的误导性训练数据洗牌【英文标题】:Misleading training data shuffle for stateful GRU in Tensorflow text_generation tutorial 【发布时间】:2020-07-11 00:40:02 【问题描述】:

我正在研究 Tensorflow text_generation 教程 (https://www.tensorflow.org/tutorials/text/text_generation) 并想知道为什么尽管 GRU 层的有状态设置为 TRUE,但它们是随机训练数据?

这与文档相矛盾 (https://www.tensorflow.org/api_docs/python/tf/keras/layers/RNN): “关于在 RNN 中使用状态性的注意事项:您可以将 RNN 层设置为“有状态”,这意味着为一个批次中的样本计算的状态将被重用于下一批中的样本的初始状态。这假设不同连续批次中的样本之间的一对一映射。”

教程中的代码 sn-ps:

dataset = dataset.shuffle(BUFFER_SIZE).batch(BATCH_SIZE, drop_remainder=True)
tf.keras.layers.GRU(rnn_units,
                        return_sequences=True,
                        stateful=True,
                        recurrent_initializer='glorot_uniform')

【问题讨论】:

你是对的,当 stateful 设置为 True 时,不需要对数据进行 shuffle。因为当您使用 sequentialnonoverlapping 输入序列时,有状态的 RNN 才有意义。而且在创建批次而不是序列长度时,我们可以将整个文本切成 n 等长,其中 n 是批次大小,为每个批次创建一个连续输入序列的数据集。 你最后用什么替换了代码? 我也注意到了这一点。我认为这可能是一个错字,因为他们后来在预测时继续使用状态性,这是对它的有效使用。 【参考方案1】:

文档有误。我按照 TensorFlow 文档中的步骤进行操作,但是当我设置 stateful=False 时,我会得到更好的混洗数据结果。

【讨论】:

以上是关于Tensorflow text_generation 教程中对有状态 GRU 的误导性训练数据洗牌的主要内容,如果未能解决你的问题,请参考以下文章

如何让 Tensorflow Profiler 在 Tensorflow 2.5 中使用“tensorflow-macos”和“tensorflow-metal”工作

python [test tensorflow] test tensorflow installation #tensorflow

关于tensorflow的显存占用问题

java调用tensorflow训练好的模型

tensorflow新手必看,tensorflow入门教程,tensorflow示例代码

tensorflow 如何在线训练模型