CTC + BLSTM 架构 Stalls/Hangs 第一个纪元之前

CTC + BLSTM Architecture Stalls/Hangs before 1st epoch

我正在研究一个识别在线手写识别的代码。 它与 CTC 损失函数和 Word Beam 搜索一起使用(自定义实现: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)

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

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

  1. 光学模型,即通过"looking"
  2. 训练尽可能好的阅读文本的模型
  3. 语言模型,即使用足够大的文本语料库,使用足够快的解码器模式

为了select部分(1)的最佳模型,使用最佳路径(贪心)解码进行验证就足够了。 如果最佳路径包含错误字符,束搜索也没有机会恢复的可能性很高(即使使用语言模型)。

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

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

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