一点一点进步吧,程序还能把活人急死?

来源:互联网 发布:福彩内部数据 编辑:程序博客网 时间:2024/05/06 15:00

    现在描述的是昨天(April 20/2014)下午3点心情,当时既激动又感概,又哭又笑,心情从来没有如此放松过!因为一周左右总在挣扎SDAE的训练,最终SDAE训练成功了,尝试了很多种参数,很多技巧,直至最终网络收敛了。

    事情是这样滴。我是一枚计科的妹纸,本科成绩还不错,但属于不怎么上机编程的那种,我的水平是任谁只要学过几天编程都可以虐我的那种,很烂的那种。挺幸运,最终凭借成绩侥幸地保送了研究生,但是好景不长~~~有句话说得很到位:人在江湖混,迟早都要还。上了研究生,很多事情必须亲力亲为,不能只是看论文写推导公式,导师想要的是实现得怎么样,实验效果做得怎么样,这样......我就尴尬了!因为,我真的是典型的不会编程的计科妹纸,没有代码量,没有编程技巧,这个时候觉得实现一个算法简直就是天方夜谭!但是,导师扔了个deadline就走了,自己也只有硬着头皮上,刚开始想着能少编点就少编点,能躲一个任务就躲一个。后来,发现这真的不是个长远之计,因为还有好几年的时间,不掌握点真正的编程本事,以后怎么混?没有任何一个人能代替你走你的人生,没有一个人能代替你努力奋斗。所以,就下定决心好好搞吧,一点一点去学,去思考,程序再难也是一行一行代码码上去的,程序结构再庞大也有简单的核心思想。so.....开始了真正意义上“从零开始入门”,不放掉问题,不放弃自己。

   下面讲下这次改程序的心得,我觉得肯定很能代表刚入门的妹纸们挣扎时的心得。

    SDAE(stack denoising autoencoder)是作者Naiyang Wang在一篇DLT跟踪算法中提及的,论文中用了9层的深度栈式自动编码机来训练大量的跟踪场景中会出现的严格样本,在用SDAE的encoder部分接个sigmoid层来训练分类器,最后把分类器嵌入在粒子滤波框架中进行跟踪。我需要做的就是用自己的样本来进行线下的pretraining过程,基本训练代码用的是deeplearn tool中的sae部分。

    刚开始,我是这样做的。论文中提及不用一张完整的图像所有像素作为输入进行训练,而是把一张图像分成了5个patch(左上,右上,左下,右下,中)进行训练后分别用sae训练再联接起来作为整张图像训练的参数。我对任务进行了拆分:

    1.把1w多张图像批量分成5个部分进行保存; 

    2. 分别用5个部分用sae进行训练; 

    3.把分别训练的部分参数联接成整张图像训练的参数;

    前面1个任务和第2个任务在经历轻度挣扎后,调试无错误,逻辑无错误后,我就将其仍在服务器上进行训练了。第3个任务暂时搁浅,因为没有很清晰的头绪。过了2个小时,里面损失函数值是Nan,我没在意,觉得迭代次数多了,其自然会收敛,事实证明我太naive!过了一夜,完成了100多次迭代后,其损失函数值仍然是Nan,怎么回事呢?我开始重新调代码,逻辑没问题啊~单步执行了一上午,确实一次都不能收敛啊。又重新看了看论文,没有找到解决的方案,当时真的是很抓狂!

    接着,我就这个方案和作者讨论,不得不大赞作者Nanyang Wang简洁和严谨的逻辑思维!根据作者回复,论文对一张图像每个patch的训练确实描述得有点模糊,作者指出他们没有用9层深度网络进行patch的训练,只用了个3层的ae来进行训练,然后又用了"learning Multiple Layers of Features from Tiny Images"中的理论来解决patch中训练的参数怎样初始化到整张图像参数中去。这次交流让我受益匪浅,绝对的!好的是,我找到了正确的解决方案。但有点残忍是,他的回答彻底地否定了我之前的轻度挣扎。

    打击后勇敢地归零开始。我按照交流的方案,将解决方案定为4步:

    1.从图像得到patch;(之前已完成)

    2.用3层的网络来训练patch;

    3.从learning Multiple Layers of Features from Tiny Images中找到从已训练的patch参数到初始化深度网络网络输入层间参数的解决办法;

    4.训练9层深度网络;

    这次,把所有的思路都理清楚了,又挣扎了一番,将程序搞定,然后扔在服务器上跑。成功绝对不是一蹴而就的,失败才是常态!这句话太在理。这次也没有成功,所有的损失函数值还是Nan,网络根本不能进行前向训练,更别提用BP算梯度,进行误差反向传导了。

    再接着,开始了自己的反思。我担心是因为没有在输入样本中加入噪声而导致的。所以,我把前面4步解决方案推翻从从头加噪声再编码再进行实验,结果还是Nan证明不是这个原因。我又琢磨会不会是要把patch训练的3层网络的decoder部分的参数初始化9层深度训练网络的第2层和第3层,重新进行了实现,又不行。我继续想会不会是其余参数需要调整,包括:迭代次数、学习速率、动量参数、加噪声的多少,我和作者交流了下这个想法,马上得到了肯定的回应。

    最后,赶快进行实验,因为失败了太多次,不在乎更多,只是多个尝试机会。终于,在改变了学习速率后,收敛的问题解决了,终于收敛了。

     最最后,既然能收敛,那么就尝试下,怎样能更快地收敛,怎样损失函数更小。于是进行了many many次实验,确定了参数,当时激动又感概,又哭又笑,觉得天空从没这么蓝,白云从来没这么舒卷得如此心醉过。可能这就是付出了努力后,收获的一点点进步吧。

     也许,以后会遇到更多地超出我能力的难题,也许我编程技巧缺乏得可怜,也许我没有一点编程经验。也许,等着我的失败次数远大于成功。也许,我走上了一条不适合女生走的不归路,也许我没有天赋。

    但是,选择了,就坚持地走下去,在这条路上去找到自己最好的定位。但,记住,永远别没尽全力尝试就否定自己!

0 0
原创粉丝点击