caffe python接口配置过程中的坑

机器学习 2016-03-26

  我的caffe安装过程在: https://www.hongweipeng.com/index.php/archives/459/ 下面说说python接口的配置,官网就几个命令而已,然而事实并不乐观。

 1.基础安装步骤略过。  配置的话可以参考:http://blog.csdn.net/u011762313/article/details/47624119

 2.在最后执行make pycaffe时卡在了:

CXX/LD -o python/caffe/_caffe.so python/caffe/_caffe.cpp

 不知道原因:默默地等了好久

 3.怀疑是Makefile.config 问题(caffe编译问题大部分源自这里),最后找到一个靠谱的解决方案。

http://blog.csdn.net/lujiandong1/article/details/50540486

  4.修改后编译速度依旧很慢,睡了一觉发现输出:

virtual memory exhausted: Cannot allocate memory make: *** [python/caffe/_caffe.so] Error 1

  问题很明显,虚拟内存不足,于是查看文档   https://help.aliyun.com/knowledge_detail/5988582.html

  增加了1G的虚拟内存

  5.继续尝试编译,输出

CXX/LD -o python/caffe/_caffe.so python/caffe/_caffe.cpp touch python/caffe/proto/init.py PROTOC (python) src/caffe/proto/caffe.proto

  目测成功,于是,进入python,用

import caffe

  测试。结果输出了

/root/caffe/caffe-master/python/caffe/pycaffe.py:13: RuntimeWarning: to-Python converter for boost::shared_ptr<caffe::Net > already registered; second conversion method ignored. from ._caffe import Net, SGDSolver, NesterovSolver, AdaGradSolver, \ /root/caffe/caffe-master/python/caffe/pycaffe.py:13: RuntimeWarning: to-Python converter for .......................... RuntimeError: module compiled against API version a but this version of numpy is 7

  好吧,又是一个bug。我们一个个来解决。。。

  看这个提升

RuntimeError: module compiled against API version a but this version of numpy is 7

,因为 pip install 直接安装的numpy版本的是1.7,提示版本过低,所以先卸载然后源码编译安装1.10。再次import caffe。发现成功消除一个错误。   又发现前一串错误的原因可能是Boost版本不对应引起的(http://stackoverflow.com/questions/35823709/i-import-caffe-from-ipython-but-i-got-runtimewarning-how-to-resolve-it)。但是,感觉这个方向可能是错的(秀一把经验),于是继续查找。

  看到stackoverfolw上有人回答是caffe的误报,并提供了解决办法 http://answers.candoerz.com/question/192787/checking-whether-a-converter-has-already-been-registered.aspx

  于是进入到、caffe/python/caffe目录下   修改_caffe.cpp文件,需要修改的地方有四处 例如将:

bp::register_ptr_to_python<shared_ptr<Layer<Dtype> > >();

  替换为

const boost::python::type_info cinfo = boost::python::type_id<shared_ptr<Blob<Dtype> > >();
  const boost::python::converter::registration* creg = boost::python::converter::registry::query(cinfo);
  if (creg == NULL)
  {
     bp::register_ptr_to_python<shared_ptr<Layer<Dtype> > >();
  }
  else if ((*creg).m_to_python == NULL) {
     bp::register_ptr_to_python<shared_ptr<Layer<Dtype> > >();
  }

  其它三个结构也是一样,但要注意里面的变量名不同。

  保存退出重新编译,import caffe,不报错了。

  总结:1.谷歌虽然强大,但是没有自己的思考也是解决不了问题的。   2.底层的问题解决难度相对较大,所以从第一步安装就要谨慎。

  附上我的_caffe.cpp文件供大家参考: _caffe.cpp


本文由 Tony 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

如果对您有用,您的支持将鼓励我继续创作!