out of memory--神经网络训练--case

之前的工作:

由于下载到的数据集包含62个文件夹,每个文件夹有1016张图片,0-9,A-Z,a-z 。上周研究的是印刷体数字的识别,只有用的10个文件夹,这时读取的图片数目可以很大,得到的识别效果也十分好,接近98%。

现在的工作:

将处理的的范围扩大到大小写字母,这时读取的图片量剧增,以每个文件夹读取300张算,总体的图片张数是18600,在训练的时候发生了错误out of memory。刚开始以为是程序出了错误,在仔细检查后,确定没有错误,因为试着减小读取的张数,神经网络又可以重新训练。

尝试解决:

在网上查找了众多资料,以及matlab的help文件。归结为以下几个方面(参考网上的)

首先介绍下实验室电脑的情况,2G内存,赛扬2.6Ghz,32位win7旗舰版。

 

1. 增加虚拟内存--采用3GB 开关启动系统

winxp:修改 c盘根目录 boot.ini 启动选项加上 /3G 例如:multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="MicrosoftWindowsXPProfessional"/noexecute=optin/fastdetect /3G

win7:

开启:

开始-所有程序-附件,右击命令提示符,选择以管理员身份运行

在命令行中,输入"bcdedit/set IncreaseUserVa 3072"

重启电脑

关闭:

开始-所有程序-附件,右击命令提示符,选择以管理员身份运行

在命令行中,输入"bcdedit /deletevalue IncreaseUserVa"

重启电脑

怎么知道有没有更改成功呢?在matlab命令提示符下键入feature memstats,可以看到

Virtual Memory(Address Space):

        In Use:                             1412 MB (58485000)

        Free:                               1659 MB(67b5b000)

        Total:                             3071 MB(bffe0000)(3G)

 

2. 采用PACK (在命令行输入pack 整理内存空间)

pack命令不能用在程序中,只能在运行之前使用所以没什么用,还不如重新启动matlab或电脑。

 

3. 优化程序,减少变量 (矩阵中含零的个数比较多的时候使用稀疏矩阵 sparse )比如用a=sparse(100,200):构造一个100*200的全零稀疏矩阵来存储数据。save 保存变量 load 变量,需要时再读出来。尝试过没什么明显改善!

 

4. 如果必有必要,不要启动java虚拟机,采用matlab -nojvm启动(在快捷方式属性里的"..../matlab.exe")改为("...../matlab.exe"- nojvm)。没尝试过,估计效果也不明显。

 

5. 使用 单精度 single 短整数替代 双精度。尝试过,无明显改善,不适合。

 

6. 还有一些其他零碎的方法,如给存数据或变量的矩阵预分配空间(这也算是一个好习惯),一般用zeros()。尽量关闭应用,只让matlab运行。等等都没有效果。

ps:如何有条件的话,就升级内存,或者重装64位的系统然后装64位的matlab(这应该是个好办法,不过实验室电脑装了太多软件,重装64位,不知道其他软件还兼容不)。

 

针对自身程序问题进行改善:

out of memory这一问题困扰了两三天,实验一直无法继续。一度想放弃matlab转向C++或者opencv,但一想到学习其他语言用于现在的项目时间有点紧,而且仅是为了验证算法。后来认真阅读了Error的信息有很多条,这是其中一个Error in ==> Unt1 at46

net=train(net,input_train(:,k),output_train(:,k));。问题应该是出在train上,再次运行程序,调出input_train,output_train两个变量上,output_train这个变量太大,因为在程序中这存的是训练序列(取18000张)的输出,输入的是从图片中提取的特征(35维),一列代表一个图片,共35*18000。而输出采取的是N取1的方式,62个类别,输出就有62位,即某个类别相应位取1,其余为0。这在类别少的时候可行,一大就会出现 out of memory问题。

解决方法:

神经网络的输出可以输出一位或者对类别进行编码,输出一位效果不好,对于研究的项目汉字识别造成困难,常用汉字一级加二级共6763个,类别非常大。第二个方法是对类二进制编码这样输出就只需要13位就够了。而目前阶段仅涉及数字和字母62,仅需要6位。通过改变output_train,终于能够使神经网络重新运作起来了。

遇到的新问题:

尝试读取更多张图片,到700多又出现内存不足问题了,看来电脑配置该升级了。

之前是N取1,要最后得到结果很简单,只有取输出的最大值为1就行。但现在是编码方式,输出有几个1不明确,得到结果就比较困难了,这在进一步研究中。

参考资料:http://blog.sina.com.cn/s/blog_4b892b790100m4hd.html

                   http://hi.baidu.com/zwwcqu/item/e9718150e61581ded58bac5a

                   http://patricom.blog.163.com/blog/static/127538496201031931522471/

PS:后续,发现问题是出在自己的算法上,神经网络训练的学习函数,之前采用的是net.trainFcn='traingb',梯度下降反向传播算法,改成net.trainFcn='trainrp',   带反弹的BP训练函数。使用的内存减少了很多,速度也快了很多。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值