Skip to content
nl8590687 edited this page Apr 22, 2020 · 31 revisions

常见问题

环境安装和配置

  • 为了加速计算,如何安装GPU版TensorFlow包

    TensorFlow支持使用GPU来加速计算,需要安装Cuda驱动和cudnn计算API,详细过程请看这篇文章:

    Linux系统下安装TensorFlow的GPU版本

    在多平台上安装TensorFlow的方法

  • 训练模型用工作站的建议配置

    最低:4x CPU, 1x GPU (NVIDIA), RAM 16GB, Graph Memory 8GB

    建议:4x CPU, 1x GPU (NVIDIA), RAM 32GB, Graph Memory 12GB 以上

  • 服务端API服务器部署的建议配置

    最低:1x CPU (Intel), 1 GB RAM

    建议:2x CPU (Intel), 4 GB RAM 以上

运行报错(包括训练和测试时)

  • 开始训练模型时,出现大量输出,最终提示:ResourceExhaustedError (see above for traceback): OOM when allocating tensor with shape[64]之类

    这个是计算机的运行存储资源不足导致的,OOM即为Out of Memory,意为存储空间不足,通常在使用GPU训练模型时,只有2GB等小显存的情况下出现,在CPU训练的情况下内存不足会出现计算机系统卡死的情况。解决方案是,增加显存容量,使用显存较大的GPU,或者多GPU并行计算。本项目推荐显存大小为每个单GPU在8GB-12GB或以上。

  • 训练模型过程中出现报错:InvalidArgumentError: Not enough time for target transition sequence

    这个是音频对应的标签输入的时间维长度过长(即字数/拼音数太多),或者神经网络输出的时间维的长度过短(长度太短以至于不能表示对应的数据标签中的内容)导致的。根据"采样定律"(雾),应该让神经网络的输出长度大于标签长度的2倍(根据CTC解码的原理),为最适宜。作者自己设计的模型就满足这个条件。

  • 模型编译成功,但是一训练就报错,提示InvalidArgumentError

    首先请检查数据的输入格式,尤其是使用有自己生成的数据文件时,一切格式以仓库中 datalist/ 目录下的文件格式和根目录下的 dict.txt 文件的格式为准。

    参考issue

    其次,请确认安装的TensorFlow和Keras的版本是否对应,如果不清楚,硬件条件如果支持(比如CUDA9.0)的话,请直接全部安装最新版本。

  • 模型编译成功,但是一训练就报错,提示OSError: Unable to open file,No such file or directory

    请检查是不是 ms.LoadModel() 中指定的加载保存好的模型文件名路径不存在,当这个文件不存在时会触发错误。还需要注意一下python在windows系统和linux系统上文件路径字符串在表示上的区别,是用'/'还是'\\'等,以及,linux系统对文件路径区分大小写,也就是说A11_183.WAV和A11_183.wav是不一样的,但是在Windows系统下,这两个却是指向一样的文件,所以,应该避免同一个字母不同大小写的文件名。

    参考issue 参考issue

    另外,如果是OSError: Unable to create file (unable to open file: name = 'model_speech/m251/speech_model251_e_0_step_500.model', errno = 2, error message = 'No such file or directory', flags = 13, o_flags = 242)这类的错误,在训练模型(如m251模型)的时候,需要在model_speech/目录下使用mkdir创建一个名为m251的目录,然后就好了。

    参考issue

  • 一运行就提示cannot import module xxx / ModuleNotFoundError: No module named xxx

    请检查python依赖库是否全部安装成功,如果存在没有安装成功的库,请手动安装。

.

  • 训练一个批次之后出现报错

    请检查保存模型的路径是否存在,是否有model_speech这个目录,或者,如果代码中保存模型的路径还包含了“m22”“m24”“m25”等文本,请检查这个目录下是否有对应文本的目录路径名称,比如,是否有model_speech/m22这个路径。

.

  • 训练过程中突然出错,找不到某wav文件,提示FileNotFoundError: [Errno 2] No such file or directory

    请确保文件列表和数据标签与数据集中的wav文件名和存储路径相对应,如果用到了自己生成的文件,请务必保证这一点。

    参考issue

  • 训练刚开始或者一批次刚结束时突然出错,提示UnicodeEncodeError: 'ascii' codec can't encode characters in position 2-3: ordinal not in range(128)

    一般来说是这类代码引起的:

    print('[*\u63d0\u793a] \u521b\u5efa\u6a21\u578b\u6210\u529f\uff0c\u6a21\u578b\u7f16\u8bd1\u6210\u529f')

    我们可以看到程序出现了乱码,这是因为机器默认不支持UTF-8编码的字符集而是使用了ascii之类其他编码导致的,实际代码应该类似于这样:

    print('[*提示] 创建模型成功,模型编译成功')

    解决方案:将中文换成英文,或者让系统支持UTF-8编码的字符集。

  • 程序一运行就提示“xxx程序已停止工作”或者“非法指令(核心已转储)”

    这应该是tensorflow和CPU的锅,tf默认编译的是通用指令集,在大部分计算机上都可以正常运行,但是唯独当前的CPU连这种通用指令集都不支持,所以解决办法就是自己手动编译一个tensorflow吧。或者也可以直接使用GPU版的tensorflow试试,前提是要有Nvidia的GPU。

  • 程序运行时报错,提示有“theano.xxx.xxx”

    这应该是您的Keras后端使用的是Theano的原因,请使用TensorFlow作为Keras的后端来运行。本项目需要使用TensorFlow作为Keras的后端backend,而不是Theano,请安装TensorFlow并将Keras切换到TF后端,程序即可正常运行。

    参考issue

训练时状态异常

  • 训练模型一段时间后,由于内存不足,训练程序被kill

    这个是作者(我)的锅,程序可能存在一定的内存泄露的情况,目前暂时无法定位导致内存泄露的代码位置,在小内存的情况下可能会出现,目前解决方案是增大内存容量即可。跑深度学习的机器一般来说内存配置都是足够大的(我见过的最大的机器有200+GB内存,RAM),这点问题一般不会有什么影响。

  • 训练模型时,一开始错误率为100%,然后突然变为0%,然后再100%和0%两个极端震荡,最后永远变为0%

    这个应该时训练时,测试函数的数值精度问题导致的,简单说就是,这个项目使用的是Python3编写的,这种情况就是在Python2上运行导致的,在Python2上运行会出现一些奇怪的问题,本项目不支持即将退休的Python2,请各位直接转战到Python3吧。 这个问题最先出现的时间比较早,但是持续了很长时间才发现问题所在,因为作者一直使用3,大多数网友也是,所以一直没遇到过,结果有个别网友使用的是2,直到他自己意识到这个问题才发现是Python2的锅。这个问题的原理就是,Python3的1/2=0.5,但是Python2中1/2=0,向下取整了,虽然最后看到的是错误率0%,但是这是假象,实际情况是并不是0%,而是中间的某一个数,然后丢失了精度。

    参考issue

其他

  • 语音模型直接识别出来的是汉语拼音,能不能转为汉字

    语音模型是使用汉语拼音作为模型的输出的,如果需要转为汉字,还需要语言模型,仓库中的 LanguageModel.py 就是用来做这件事的,可以实现从拼音转为汉字。test.py文件包含了这整个一套的过程,可以实现从wav声音文件或序列,到最终的汉字。

  • 自己电脑比较渣,在哪里可以下载作者已经训练好的模型

    本项目已经预发布了若干个版本的完整软件,可以在Github本仓库下releases里面的发布的软件的压缩包ASRT_vxx.xx.zip里获得完整源程序,包含有已经训练好的模型,每个版本具体使用到的模型都有说明,发布的版本基本上有着不错的语音识别字准确率。

  • 如何使用多GPU进行模型的训练

    在本项目的general_function中包含一个muti_gpu模块,这个模块可以实现多GPU并行计算,可以加速计算和扩展显存空间。 调用方式:

    from general_function.muti_gpu import *
    ...
    NUM_GPU = 2
    ...
    model.build((self.AUDIO_LENGTH, self.AUDIO_FEATURE_LENGTH, 1))
    model = ParallelModel(model, NUM_GPU)
    ...
    model.compile(loss={'ctc': lambda y_true, y_pred: y_pred}, optimizer = ada_d)
    

    参考issue

  • 我的录音音质不是ASRT所采用的标准音质,如何将其进行转换?

    可以使用ffmpeg来实现,ffmpeg可以重采样,在音视频领域都可以使用它来进行操作。另外,sox也可以。

    样例:

    ffmpeg -i input.wav -ac 1 -ar 16000 output.wav
    
    sox -r 44200 input.wav -r 16000 output.wav
    

    感谢网友们提供的帮助。

  • 为什么代码种删掉了LSTM层,这是出于什么考虑

    就是为了设计一种模型的结构而已,没什么考虑不考虑的。别问,问就是我偏要删掉(手动狗头)

    为什么一定要用LSTM呢?这一点我其实一直都很好奇,希望大家不要被条条框框束缚,别问什么会不会效果更好,只有实践才是检验真理的唯一标准

    不过本项目仓库中,还是有用到循环层(GRU)的模型,比如m26和m261,大家都可以试试。(并不真香)

  • 模型训练时能暂停保存,之后再接着训练吗

    模型会定期在指定迭代步数到达之后自动保存,比如设置为500时,每迭代500次就会自动保存一次最新的模型参数文件,下次接着训练时,重新加载最后保存的模型继续训练即可。在模型训练的代码中可以看到有LoadModel()函数,修改参数中的文件路径为要加载的模型参数文件路径即可。在测试模型效果的时候也是同理。