问题标签 [sequence-to-sequence]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
192 浏览

tensorflow - 基于谷歌 TensorFlow 的 seq2seq 模型在训练时崩溃

我一直在尝试使用谷歌基于 RNN 的seq2seq 模型。

我一直在训练一个文本摘要模型,并且正在输入大约 1GB 大小的文本数据。该模型很快填满了我的整个 RAM(8GB),甚至开始填满交换内存(进一步的 8GB)和崩溃后我必须硬关机。

我的 LSTM 网络的配置如下:

我尝试将批量大小从 32 减少到 16,但它仍然没有帮助。为了防止我的模型占用整个 RAM 并崩溃,我应该进行哪些具体更改?(如减少数据大小、减少堆叠 LSTM 单元的数量、进一步减少批量大小等)

我的系统运行 Python 2.7x、TensorFlow 版本 1.1.0 和 CUDA 8.0。该系统有一个 Nvidia Geforce GTX-1050Ti(768 个 CUDA 内核)和 4GB 内存,系统有 8GB RAM 和另外 8GB 交换内存。

0 投票
2 回答
26144 浏览

python-3.x - TypeError:无法在 Seq2Seq 中腌制 _thread.lock 对象

我在我的 Tensorflow 模型中使用存储桶时遇到问题。当我运行它时buckets = [(100, 100)],它工作正常。当我运行它时,buckets = [(100, 100), (200, 200)]它根本不起作用(底部的堆栈跟踪)。

有趣的是,运行 Tensorflow 的 Seq2Seq 教程给出了相同类型的问题,堆栈跟踪几乎相同。出于测试目的,存储库的链接在此处

我不确定问题是什么,但是拥有多个存储桶似乎总是会触发它。

此代码不能作为独立代码运行,但这是它崩溃的函数 - 请记住,更改bucketsfrom[(100, 100)][(100, 100), (200, 200)]触发崩溃。

堆栈跟踪:

0 投票
1 回答
275 浏览

python - 语言模型的困惑度怎么可能介于 0 和 1 之间?

在 Tensorflow 中,我得到的输出是 0.602129 或 0.663941。看起来更接近 0 的值意味着更好的模型,但似乎困惑度应该被计算为 2^loss,这意味着损失是负数。这没有任何意义。

0 投票
0 回答
157 浏览

tensorflow - 使用 Tensorflow 实验对 Seq2Seq 模型进行批处理

我正在尝试将我在本地运行的Seq2Seq 模型转换为使用EstimatorExperiment的 Tensorflow 分布功能。基本特征和目标设置如下:

笔记:

  • 特征将具有形状 [桶数] [输入数量@桶大小] [桶的大小用于输入]
  • 目标将具有形状 [桶数] [响应数@桶大小] [响应桶大小]

几个问题:

  1. 一般来说,是否建议使用 Experiment 类和 Estimator 接口来处理这种模型?
  2. 我可以使用 Experiment 设置训练批量大小吗?它似乎train_stepseval_steps训练和评估的迭代有关。是否有另一个选项可以为这些步骤设置批量大小,或者实验是否在内部/自动计算批量大小?
  3. 我假设 Experimenttrain_input_fn并且eval_input_fn可以是返回特征字典和目标张量的任何input_fn 。在上面的例子中,我真的只需要一个特征张量和一个目标张量,因为我正在创建一个自定义的 Estimator,只要我的 Estimatormodel_fn期望这些形状并且可以正确地从它们返回损失,它们就可以是任何形状。这个对吗?
0 投票
2 回答
4411 浏览

tensorflow - 如何将 AttentionMechanism 与 MultiRNNCell 和 dynamic_decode 一起使用?

我想创建一个使用注意机制的基于多层动态 RNN 的解码器。为此,我首先创建了一个注意力机制:

然后我使用AttentionWrapper注意力机制来包装一个 LSTM 单元:

其中self._create_lstm_cell定义如下:

然后我做一些簿记(例如创建 my MultiRNNCell、创建初始状态、创建TrainingHelper等)

但我收到以下错误:AttributeError: 'LSTMStateTuple' object has no attribute 'attention'

将注意力机制添加到 MultiRNNCell 动态解码器的正确方法是什么?

0 投票
1 回答
501 浏览

tensorflow - 如何在张量流的波束搜索解码器中使用调度采样。

基本解码器包含一个添加辅助方法的参数,该辅助方法可以是调度采样辅助方法。但是波束搜索解码不包含任何辅助参数。

虽然在代码中看起来使用了一些采样,但不清楚是否使用了计划采样。class BeamSearchDecoder(decoder.Decoder): """BeamSearch 采样解码器。"""

很高兴知道并澄清我的疑问。希望对此事有所了解。提前致谢。

0 投票
1 回答
929 浏览

python - TensorFlow NotFoundError

我正在运行自定义代码来在 tensorflow 上训练我自己的 Seq2Seq 模型。我正在使用多 rnn 单元和 embedding_attention_seq2seq。恢复模型时出现以下错误:

我已经按照与 GitHub 上的教程类似的图表步骤进行操作。

0 投票
1 回答
668 浏览

tensorflow - 如何修改 Tensorflow Sequence2Sequence 模型以实现双向 LSTM 而不是单向 LSTM?

参考这个帖子了解问题的背景: TensorFlow embedding_attention_seq2seq方法是否默认实现了双向RNN Encoder?

我正在研究相同的模型,并想用双向层替换单向 LSTM 层。我意识到我必须使用 static_bidirectional_rnn 而不是 static_rnn,但由于张量形状中的一些不匹配,我得到了一个错误。

我替换了以下行:

与下面的行:

这给了我以下错误:

InvalidArgumentError(有关回溯,请参见上文):不兼容的形状:[32,5,1,256] 与 [16,1,1,256] [[节点:梯度/model_with_buckets/embedding_attention_seq2seq/embedding_attention_decoder/attention_decoder/Attention_0/add_grad/BroadcastGradientArgs = BroadcastGradientArgs[T =DT_INT32, _device="/job:localhost/replica:0/task:0/cpu:0"](梯度/model_with_buckets/embedding_attention_seq2seq/embedding_attention_decoder/attention_decoder/Attention_0/add_grad/Shape, gradients/model_with_buckets/embedding_attention_seq2seq/embedding_attention_decoder/attention_decoder /Attention_0/add_grad/Shape_1)]]

我知道这两种方法的输出是不同的,但我不知道如何修改注意力代码来合并它。如何将前向和后向状态都发送到注意力模块——我是否将两个隐藏状态连接起来?

0 投票
1 回答
202 浏览

tensorflow - 张量流连续文本序列到序列。为什么要分批?

我正在构建一个序列到序列的莎士比亚预测器,并查看它似乎以 50 个字符为一组进行批处理的示例代码。我对此有点困惑。如果文本是连续的并且您正在处理 50 个字符的块,那么这肯定意味着您只会根据第 50 个字符之后的下一个预期字符来计算损失,并且模型永远不会针对下一个预期字符进行训练其他 49 个字符。换句话说,如果你有 1000 个字符和 20 组 50 个字符,那么它只会被教导预测 20 个不同的字符。这些批次不应该在每个时期移动一个随机偏移量,以便它学习如何预测其他字符吗?

这肯定不对吧?在我的理解中,我在这里缺少什么?

此外,批次是否总是按顺序处理?当状态被推进以表示先前的序列时,这当然很重要。

谢谢雷

7/24 更新:这是原始代码...

据我所见,它似乎没有重叠,但我是 Python 的新手,所以可能会遗漏一些东西。

0 投票
0 回答
895 浏览

tensorflow - Seq2seq 多输入特征(将多个单词/单词标记作为输入传递)

有没有办法将额外的特征标记与现有的单词标记(训练特征/源文件词汇表)一起传递,并将其提供给 seq2seq 的编码器 RNN?因为,它目前一次只接受句子中的一个单词标记。

让我以更具体的方式说明这一点;考虑机器翻译/nmt 的示例 - 假设我有 2 个对应源词汇集的特征列(此处为 Feature1)。例如,考虑以下情况:

总而言之,目前seq2seq数据集是并行数据语料库,在源特征(词汇,即仅Feature1)和目标(标签/词汇)之间具有一对一的映射关系。我正在寻找一种将多个特征(即Feature1、Feature2、Feature3)映射到目标(标签/词汇)的方法。

此外,我相信这在 seq2seq-pytorch 教程(https://github.com/spro/practical-pytorch/blob/master/seq2seq-translation/seq2seq-translation.ipynb)中被掩盖了,如下所示:

当使用单个 RNN 时,输入和输出之间存在一对一的关系。我们很快就会遇到翻译过程中常见的序列顺序和长度不同的问题……。使用 seq2seq 模型,通过将多个输入编码为一个向量,并将一个向量解码为多个输出,我们摆脱了序列的约束顺序和长度。编码序列由单个向量表示,即某个 N 维序列空间中的单个点。在理想情况下,这一点可以被认为是序列的“意义”。

此外,我尝试了 tensorflow,花了很多时间来调试和进行适当的更改,但一无所获。并且从我的同事那里听说 pytorch 可以灵活地执行此操作,值得一试。

请分享您对如何在 tensorflow 或 pytorch 中实现相同的想法。任何人都会告诉如何实际实施/完成这项工作。提前致谢。