中间空的十天做了包括:新建一个层generate_layer,写forward(1-2天),看bp算法(1-2天),写backward(1-2天),写lmdb输入并搭网络(1-2天),跑程序(1-2天),调输入的bug(1-2天,那lmdb生成的uint8的数据不能直接读入,调了好久)。
原来是用deconv做unpool的事,现在在将unpooling移植到我们的网络上来。
bug:第一次Iteration可以计算loss,第二次 Iteration计算错误
解决:最后的score的大小为5120*4,我们的标签是5120才能计算loss,看loss层的实现,看反卷积层的实现,添加LOG代码,发现第一个可以计算,第二个错误,怀疑unpool大小只初始化一次,经过unpool后大小保持第一次的大小,添加LOG代码,输出layersetup过程和reshape过程中unpool的height_,发现layersetup只运行了一次而reshape每次都会执行,所以unpool_height_的更新应该放在reshape里,然后make一下,搞定。
删掉调试信息并注释掉一些无用代码,我的unpool就能跑了,接下来就是看内部实现(-_-)。
先跑个一万次玩玩。。。(忘记make了,全是调试信息,ctr+c还停不下来-_-)
没拷贝权重,需要先调参数。。。不然下降太慢。。。
直接用测试集验证准确率试试,没ac层不好看结果啊,加个,发现准确率低且不变。。。
bug2:snapshot输出的时候出现Segmentation fault,这个错也发生在caffe训练完后,这应该是什么bug吧,上次遇到这个错是将cpu改为gpu就好了,没有真正解决这个问题。
暂未解决:先改小snapshot值,快速报错,在solver.cpp里添加输出代码,发现在ToProto出错,solver调用net,net调用layer的ToProto,layer的本体在include里,发现是个虚函数,但有实现,layer又调用blobs的实现,这个组织。。。一级级管下来。输出发现就是不能执行到blob层。
调了一天没调出来,感觉是我新加入的层有问题,把它删掉后其他的网络不会出现Segmentation Fault,最后还是自己写的东西不兼容。。。