使用pytorch进行文字识别时出现标题上的错误。
1、在训练前添加如下语句:
torch.backends.cudnn.benchmark = True
没用
2、将 batch_size 从 64 改为 32。
没用
3、在训练前添加如下语句:
torch.cuda.set_device(id)
我只有一个显卡,所以id=0,解析查看:https://discuss.pytorch.org/t/runtime-error-77/9392/9
没用
4、这个方法解决了
参考:https://discuss.pytorch.org/t/weird-cuda-illegal-memory-access-error/8848/9
出错原因:我自己有4000个常用字的字典,所以最后网络输出层的维度为4000。在训练过程中如果训练集图片中包含字典里没有的汉字,则添加到该字典中,所以字典长度就不为4000了,所以就会出现报错。
解决方法:可以提前把训练集中新的汉字加到字典中,或者在训练过程中不把新的汉字加到字典中。
2019.07.01 更新。。。
最近又出现这个问题了,检查了很久,才发现是对python的一个用法不熟悉导致的。
文本识别的数据是非常庞大的,所以我就先将它们制作成 lmdb 数据库,这有一篇比较好的教程:https://zhuanlan.zhihu.com/p/70359311
标签文件中的每一行如下:
'0019365.jpg 进击的巨人\n'
因为是从txt文件中读取的,所以最后有一个换行符。
现在我需要将图片名和文本标签分别读取出来,
line = '0019365.jpg 进击的巨人\n'
print(line.split())
输出结果为:['0019365.jpg', '进击的巨人'],是的没错,换行符自动被去除了。
然后文本标签中有空格的话,上面的方法就不行了,
line = '0019365.jpg 进击的巨人 兵长\n'
print(line.split())
输出结果为:['0019365.jpg', '进击的巨人', '兵长'],这被分成三份了。
所以我改用了如下方法:
line = '0019365.jpg 进击的巨人 兵长\n'
print(line.split(' ', 1))
输出结果为:['0019365.jpg', '进击的巨人 兵长\n'],这里只分为了两份,但是!!!它没有去除换行符!!!这是我之前没有发现的,所以加上换行符一起被当做了文本标签。
然后就出现标题上的那个错误了。。。
作者简介
我是阿德,一名五年工作经验的软件开发工程师,985高校非科班程序员,热爱编程与开源,
此公众号【程序员阿德】专注于分享各种计算机干货,包括但不限于计算机组成原理、数据结构与算法、计算机网络、操作系统、数据库、Linux等。
相信你能够在这里有所收获,精进为一名优秀程序员,我们一起加油~
更多硬核技术和编程干货,可以关注公众号 [程序员阿德] 获取