菜单

LSTM 训练

相关源文件

本文档描述了 Tesseract OCR 中 LSTM(长短期记忆)神经网络的训练过程。它涵盖了用于创建基于 LSTM 的识别模型的数据准备、训练工作流程、配置选项和评估方法。有关使用训练好的 LSTM 模型进行识别的信息,请参阅LSTM 识别

LSTM 训练概述

Tesseract 中的 LSTM 训练涉及准备带标签的训练数据、定义网络架构以及迭代训练网络直到达到目标错误率。训练过程由 `LSTMTrainer` 类管理,该类负责加载训练数据、网络初始化、前向-后向传播、错误计算和模型持久化。

来源

训练数据管理

数据格式与结构

Tesseract 中的训练数据使用 LSTMF(LSTM 特征)文件,这些文件包含预处理过的图像及其对应的真实文本。这些文件由 `DocumentCache` 和 `ImageData` 类加载和管理。

训练数据结构支持两种缓存策略:

  • 顺序 (`CS_SEQUENTIAL`):读取完一个文件中的所有数据后再移动到下一个文件。
  • 轮循 (`CS_ROUND_ROBIN`):轮流从每个文件中读取一个样本。

来源

Box 文件和真实文本

训练数据需要真实文本,这可以通过 box 文件提供。Box 文件定义了字符/单词的位置及其边界框和相应的文本。

Box 文件格式

<character> <left> <bottom> <right> <top> <page_number>

`ImageData` 类处理这些 box 文件,以创建包含对齐图像和文本数据的训练样本。

来源

训练过程

初始化

训练过程开始于初始化字符集(unicharset)和网络架构。

网络架构由描述层类型和排列的网络规范字符串定义。

来源

训练循环

核心训练过程包括:

  1. 样本选择:从文档缓存中获取一个训练样本。
  2. 前向传播:计算样本的网络输出。
  3. 目标创建:将网络输出与真实文本对齐。
  4. 误差计算:计算输出和目标之间的误差。
  5. 反向传播:通过反向传播调整网络权重。

来源

误差指标和评估

Tesseract 在训练期间跟踪多个误差指标:

错误类型描述
ET_RMSRMS 激活误差
ET_DELTAdelta 中的大误差数量
ET_CHAR_ERROR字符错误率 (BCER)
ET_WORD_RECERR单词错误率 (BWER)
ET_SKIP_RATIO跳过的样本比例

这些指标会持续监控,并用于确定何时保存检查点以及何时停止训练。

来源

检查点管理

检查点会定期保存,以保留训练进度。系统维护:

  • 训练的当前状态
  • 最佳模型(最低错误率)
  • 用于从发散中恢复的备份模型

来源

配置选项

网络架构

网络通过描述层结构的字符串进行指定。常见的层类型包括:

层类型描述
LLSTM 层
F全连接层
SSoftmax 层
C卷积层
M最大池化层

网络规范示例

[1,36,0,1 Ct3,3,16 Mp3,3 Lfys48 Lfx96 Lrx96 Lfx256 O1c111]

来源

训练参数

关键训练参数包括:

参数默认描述
learning_rate10.0e-4新 delta 的权重因子
momentum0.5重复 delta 的衰减因子
adam_beta0.999Adam 优化器的 Beta 参数
weight_range0.1初始随机权重的范围
target_error_rate0.01最终错误率(百分比)

来源

评估过程

LSTMTester

`LSTMTester` 类负责在训练期间和训练后评估 LSTM 模型。

评估可以执行:

  • 同步:阻塞操作,完成后返回。
  • 异步:非阻塞操作,在单独的线程中运行。

来源

错误分析

在评估期间,系统会在单独的评估数据上计算字符和单词错误率。这些指标提供了对模型性能的无偏评估。

来源

序列化和模型管理

模型序列化

`LSTMTrainer` 实现序列化以保存和加载模型。

序列化过程可以保存:

  • 网络权重和架构
  • 训练状态(迭代次数、学习率)
  • 错误历史
  • 最佳模型数据

来源

模型转换

训练完成后,模型可以被转换

  • 从训练格式到运行时格式
  • 从浮点格式到整数格式以加快推理速度

来源

高级训练技术

子训练器 (Subtrainers)

LSTMTrainer 可以使用子训练器——与主训练器并行、但使用不同参数的替代训练器。

子训练器通过探索不同的学习率配置来帮助克服平台期。

来源

学习率调整

训练期间可以调整学习率

  • 当错误率停滞时全局降低
  • 基于权重更新行为的层级特定调整
  • 通过回滚到具有降低学习率的最佳模型来从发散中恢复

来源

命令行用法

用于 LSTM 训练的主要命令行工具是 lstmtraining。这是一个典型的流程:

  1. 使用 unicharset_extractor **提取 unicharset**
  2. 使用必需的组件**创建初始 traineddata**
  3. 使用 lstmtraining **开始训练**
  4. 通过加载检查点**继续训练**
  5. 使用 lstmtraining --stop_training **转换为运行时模型**

一个训练会话示例

lstmtraining --traineddata eng.traineddata \
             --net_spec "[1,36,0,1 Ct3,3,16 Mp3,3 Lfys48 Lfx96 Lrx96 Lfx256 O1c111]" \
             --model_output eng \
             --learning_rate 10e-4 \
             --train_listfile train_files.txt \
             --eval_listfile eval_files.txt \
             --max_iterations 10000

来源

错误处理和故障排除

训练期间的常见问题包括:

  1. 发散:错误率突然增加

    • 解决方案:系统回滚到具有降低学习率的先前最佳模型
  2. 平台期:错误率停止改进

    • 解决方案:使用具有不同学习率的子训练器,或继续使用降低的学习率
  3. 内存限制:无法加载所有训练数据

    • 解决方案:使用 max_image_MB 参数限制内存使用

来源

总结

Tesseract 中的 LSTM 训练是一个全面的过程,包括数据准备、网络配置、迭代训练和评估。该系统包含用于错误跟踪、检查点管理和自动学习率调整的复杂机制,以实现最佳识别性能。

对于干净、准备充分的训练数据,成功训练通常会导致字符错误率低于 1%,但结果会因语言复杂性和训练数据质量而异。

来源