0

我正在研究识别在线手写识别的代码。它适用于 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)

4

1 回答 1

0

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

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

  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”模式并增加光束宽度
于 2019-12-21T20:20:57.307 回答