问题标签 [beam-search]

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 投票
2 回答
1159 浏览

python - 使用 TensorFlow 后端的 CTC Beam 搜索

keras 文档和 tensorflow 提供了一个函数 ctc_decode,它对网络的输出进行 ctc 波束搜索解码。该文档没有提供解码器的示例用法。https://github.com/igormq/ctc_tensorflow_example/blob/master/ctc_tensorflow_example.py提供了一个示例用法,但我无法检索解码的文本转录本。

关于打印输出张量的stackoverflow存在问题,但我没有得到任何输出,因为我的张量的输出是形状(?,?)。

pred 是神经网络的输出。请帮助我了解出了什么问题,因为我认为我应该获得为预测解码的字符的数值,但我得到的是 [[0]]。

0 投票
0 回答
289 浏览

python - 为什么sequence_length的变量在tensorflow-r1.0的ctc_beam_search_decoder中没用?

我想生成一批具有固定形状 [ batch_size, seq_lenth] 的序列。因此我的代码:

其中logitsdynamic_rnn形状为 [ max_time, batch_size, cell_output_size] 的输出。我设置seq_length40. 但结果output不是形状 [ batch_size, seq_length]。鉴于它的形状是动态的,我无法将它填充到固定长度。那么我应该怎么做才能得到固定大小的输出呢?提前致谢!

0 投票
1 回答
501 浏览

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

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

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

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

0 投票
2 回答
7220 浏览

python - Python 中的束搜索

我正在 Keras 中实现 Seq2Seq 模型。但是,他们没有在解码器中提供波束搜索选项。因此,我考虑了 pynlpl 的 BeamSearch,但他们在此处找到的关于搜索的文档没有任何关于如何实现它的信息。您能否举例说明如何实施波束搜索?

这里有一个类似的答案:How to implement a custom beam search in TensorFlow? 但是,还不清楚。

0 投票
1 回答
4959 浏览

python - Tensorflow:无法理解 ctc_beam_search_decoder() 输出序列

我正在使用 Tensorflowtf.nn.ctc_beam_search_decoder()解码 RNN 的输出,执行一些多对多映射(即,每个网络单元的多个 softmax 输出)。

网络输出和 Beam 搜索解码器的简化版本是:

这种情况下的输出是:

我的理解是输出张量应该是维度[batch_size, max_sequence_len]的,每一行都包含找到路径中相关类的索引。

在这种情况下,我希望输出类似于:

我不了解如何ctc_beam_search_decoder工作?

0 投票
1 回答
336 浏览

tensorflow - tf.contrib.seq2seq.gather_tree 是如何工作的?

gather_treein究竟是如何contrib.seq2seq工作的?我可以看到它采用了预测的 ID 和梁父 ID,并以某种方式返回了最终的梁,但引擎盖下到底发生了什么?似乎没有任何 Python 代码库可供我检查以找出答案。API不是很解释;

有代码源tf.contrib.seq2seq.gather_tree吗?我正在使用 TensorFlow 1.3,往里gen_beam_search_ops.py看似乎没有帮助。

0 投票
0 回答
945 浏览

tensorflow - TensorFlow BeamSearchDecoder 将 sample_id 输出为(实际 sample_id+1)

  • 我是否编写了自定义代码(而不是使用 TensorFlow 中提供的股票示例脚本):是的。基于 NMT 教程,我正在为自己的任务编写自定义代码。
  • 操作系统平台和发行版(例如,Linux Ubuntu 16.04):Linux Ubuntu 14.04 LTS
  • TensorFlow 安装自(源代码或二进制文件):Source
  • TensorFlow 版本(使用下面的命令):1.5
  • Python版本:3.6.3
  • Bazel 版本(如果从源代码编译):0.9.0
  • GCC/编译器版本(如果从源代码编译):5.4.1
  • CUDA/cuDNN 版本:CUDA 8.0、cuDNN 6
  • GPU型号和内存:1080 Ti
  • 重现的确切命令:将通过这篇文章进行解释。

我正在编写基于 NMT 教程代码的 Seq2Seq 代码。(https://github.com/tensorflow/nmt

我已将解码器的输出投影仪修改为全连接层,而不仅仅是教程代码中的线性投影仪。通过定义以下自定义层类:

自定义层.py

https://github.com/kami93/ntptest/blob/master/customlayer.py

然后像这样初始化自定义层:

然后像这样把层作为 BeamSearchDecoder 的 output_layer

最后像这样得到输出sample_id

问题就出现在这里。

因为我的自定义层的最后一个输出维度是“757”,所以我希望 sample_id 应该是自定义层输出的 argmax id 的索引,它应该在 [0,756] 之间。

但是,返回的实际 sample_id 介于 [1,757] 之间(即返回“我的预期 sample_id + 1”)。

在https://github.com/tensorflow/tensorflow/blob/r1.5/tensorflow/contrib/seq2seq/python/ops/beam_search_decoder.py检查 tf.contrib.seq2seq.BeamSearchDecoder 的实际代码 ...是在“line 510”和“line 652”之间的行上执行“_beam_search_step”,

在第 545 行,vacab_size 被收集为 757。

在第 577 行,在所有嵌套的“K*757”假设中确定具有最高 K(Beam width) softmax 概率的索引。

在第 595 行,通过模运算计算实际指数。

结果,我认为 [1,757] 之间的索引完全没有必要作为 sample_id 返回。至少由于 757 的模运算严格返回 [0,756] 之间的值,因此我认为永远不应该返回 757 的 sample_id。但我实际上得到了它。

有人可以建议为什么我得到[1,757]的样本ID,而不是[0,756]?

0 投票
0 回答
1149 浏览

deep-learning - 使用 seq2seq 加速 Beam Search

我有一个完全工作的 seq2seq 注意力模型,带有光束搜索,它确实提供了改进的结果。但是在 k=5(k 是我的假设)的情况下进行推理(批量大小 1024)需要 > 1 分钟,因为它们都没有被并行化。一切都一次发生 1 个样本。

任务(简体)
目标是句子翻译,15 个单词 Lang A 到 15 个单词 Lang B。

  • 编码器是一个 RNN,它接收 15 个单词的句子并对它的表示进行编码,给出一个 [timestep, 512] 矩阵以及最终的隐藏状态。
  • 解码器是另一种 RNN,将编码器隐藏状态作为初始状态,使用 [timestep, 512] 矩阵进行注意力,并输出翻译后的单词 [batch] 一次一个时间步长。当然,到目前为止,还有某种形式的并行化。
  • 在推理阶段,使用波束搜索。在解码器的每个时间步,我不是采用概率最高的预测词,而是采用 k 个最佳词。并提供 k 个单词作为下一个时间步的输入,以便它可以预测句子中的下一个单词(算法的其余部分如下所示)。算法使得解码不那么贪婪地预测结果,在后续时间步中具有更高的总概率。

有 6 个张量和 2 个列表来跟踪和处理状态变化。这里有加速或并行化的空间吗?也许每个 k 可以同时通过编码解码?任何帮助深表感谢。

0 投票
1 回答
555 浏览

c++ - CTC Beam Search 和 Tensorflow C++ API 的问题

我已经冻结了一个 tensorflow 模型,它的最后一个节点是 ctc 光束搜索。使用 pyhton API 可以解释输出张量并转换为最终的标签序列。由于我想在 C++ 中使用这个冻结模型,我想知道如何使用 C++ API 来处理这个输出张量并获得最终的标签序列。使用 python API,我将此函数称为“sparse_tensor_to_str”,传递我在运行会话后获得的张量。在我的例子中,最后的标签序列是一串字符。

在 C++ 中,我喜欢以下内容:

我得到一个像这样的 9x2 张量的输出张量:

其中 9 是最终字符串的实际长度。在这里,我无法获得正确的信息,例如在 python 中,用于覆盖最终字符串。

0 投票
0 回答
729 浏览

python - 在tensorflow中使用CRF进行解码时如何获得top-k最佳候选序列

CRF++允许我们获得每个标签的边际概率(每个输出标签的一种置信度度量)和输出的可能条件(整个输出的置信度度量)。

Tensorflow 有自己的 crf 实现。在训练一个 crf 模型之后,我们可以通过ory得到每个测试输入序列的最佳标签序列及其非归一化分数。xtf.contrib.crf.viterbi_decode()tf.contrib.crf.crf_decode()

但是,仅获得一个最佳序列对我来说是不够的。目前,top-k 最好的序列及其对应的分数都对我有用。我注意到目前上述两个功能不提供这些信息。因此,我想知道在对 tensorflow 源代码进行微小修改后是否有可能获得前 k 个最佳候选者。

  1. top-k 标签序列及其对应的非标准化分数。
  2. 每个标签的边际概率(如 CRF++)