【问题标题】:CTC + BLSTM Architecture Stalls/Hangs before 1st epochCTC + BLSTM 架构在第一个时代之前停止/挂起
【发布时间】:2019-12-19 20:15:08
【问题描述】:

我正在编写一个识别在线手写识别的代码。 它适用于 CTC 损失函数和 Word Beam Search(自定义实现:githubharald)

TF 版本:1.14.0

以下是使用的参数:

batch_size: 128
total_epoches: 300
hidden_unit_size: 128
num_layers: 2
input_dims: 10 (number of input Features)
num_classes: 80 (CTC output logits)
save_freq: 5
learning_rate: 0.001
decay_rate: 0.99
momentum: 0.9
max_length: 1940.0 (BLSTM with variable length time stamps)
label_pad: 63

我面临的问题是,在将解码器从 CTC Greedy Decoder 更改为 Word Beam Search 后,我的代码在特定步骤后停止。它没有显示第一个 epoch 的输出,现在卡在那里大约 5-6 小时。

被卡住的步骤:tensorflow/stream_executor/platform/default/dso_loader.cc:42] Successfully opened dynamic library libcublas.so.10

我正在使用 Nvidia DGX-2 进行训练(名称:Tesla V100-SXM3-32GB)

【问题讨论】:

  • 你不应该在训练代码中使用词束搜索,因为它比最佳路径解码慢。但是,它仍然不应该花费 5-6 小时(除非您将一些更复杂的模式与非常大的语言模型结合使用,但在简单的“单词”模式下绝对不会花费那么长时间)。
  • 您好,感谢您的回答。好的,所以我在验证期间进行采样,并在特定批次的每个 epoch 之后转储 rnn 输出(每次都说第 5 批次)。在这个转储的 rnn 输出上使用 Word Beam Search(使用 NGramForecast 方法)解码器作为 C.E.R. 的测试措施是否可以? (字符错误率)。这种策略合法吗?

标签: python-3.x tensorflow lstm handwriting-recognition ctc


【解决方案1】:

Here is the paper描述词束搜索,也许它包含一些对你有用的信息(我是论文的作者)。

我会将您的任务视为两个独立的部分:

  1. 光学模型,即通过“查看”文本来训练一个尽可能擅长阅读文本的模型
  2. 语言模型,即使用足够大的文本语料,使用足够快的解码器模式

要为第 (1) 部分选择最佳模型,使用最佳路径(贪婪)解码进行验证就足够了。 如果最佳路径包含错误字符,那么波束搜索也没有机会恢复的可能性很高(即使在使用语言模型时也是如此)。

现在进入第 (2) 部分。关于词束搜索的运行时间:您正在使用“NGramsForecast”模式,这是所有模式中最慢的。它的运行时间为 O(W*log(W)),其中 W 是字典中的单词数。 “Ngrams”有 O(log(W))。 如果您查看论文并转到表 1,您会发现使用预测模式(“NGramsForecast”或“NGramsForecastAndSample”)时运行时变得更糟,而字符错误率可能会或可能不会变得更好(例如“Words”模式的运行时间为 90 毫秒,而“NGramsForecast”对于 IAM 数据集的运行时间超过 16 秒)。

对于实际用例,我建议如下:

  • 如果您有字典(即唯一单词列表),请使用“单词”模式
  • 如果您有一个包含足够多目标语言句子的大型文本语料库,请使用“NGrams”模式
  • 如果您需要更好的字符错误率,请不要使用预测模式,而是使用“Words”或“NGrams”模式并增加光束宽度

【讨论】:

  • 嘿!所以我尝试使用贪婪解码器来快速暴力评估我的模型。 IAM-on DB(Stroke level label sentence)在线字符识别。我同样获得了 12.7 的 CER。但是,当我使用以下参数在测试集上运行 CTCWordBeamSearch 时: 1. LM Smoothening:0.01 2. Beam Width:尝试了 [5, 25, 30, 50] 的 2 个极值 3. NGrams 模式 目前,我的 CER获得率高达 47%。是不是我做错了什么?
  • 您使用的是哪个文本语料库?来自测试集的文本(因此,您想要识别的每个单词都包含在文本中)?如果是这样,CER 应该低得多。你也可以试试文字模式吗?
  • 我使用 Iam 数据集文本作为我的语料库文本。我从 Simple HTR 存储库本身(下面的链接)中选择了语料库。 github.com/githubharald/SimpleHTR/blob/master/data/corpus.txt
  • SimpleHTR 的语料库文件是从 IAM 离线数据集(训练和验证)中提取的,而您正在使用 IAM 在线数据集。所以你应该从在线数据集中创建你自己的语料库或字典,因为我所知道的文本不同。
  • 嘿!我读了你的论文并有一个小问题。您提到了可以使用单词词典和 train+validate 集的基本 LM。就文字模式而言,我相信这个LM会做得很好。但是,由于单词之间的上下文仅限于使用训练数据(而不是字典),是否可以将这个语料库与 NGrams 或 NGramsForecast 一起使用?
猜你喜欢
  • 1970-01-01
  • 2018-01-16
  • 2011-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-20
相关资源
最近更新 更多