前几天想要跑个Hinton大神的CapsNet,是用tensorflow实现,就安装了个tensorflow,结果caffe不能用了
将解决办法记录如下:
第一个问题:cudnn版本不兼容问题
因为之前一直用的caffe,cudnn用的是v5,现如今默认安装的tensorflow用的是cudnn v6,年少无知果断下了一个cudnn v7,然后把v7软链接成v6,具体步骤:
1.删除原来的cudnn
sudo rm -rf /usr/local/cuda/include/cudnn.h
sudo rm -rf /usr/local/cuda/lib64/libcudnn*
2.将新下载的软件包解压到home文件夹下
sudo cp cuda/include/cudnn.h /usr/local/cuda/include/
sudo cp cuda/lib64/lib* /usr/local/cuda/lib64/
3.建立软链接
sudo chmod +r libcudnn.so.7.0.3
sudo chmod +r libcudnn.so.5.1.5
sudo ln -sf libcudnn.so.5.1.5 libcudnn.so.5
sudo ln -sf libcudnn.so.7.0.3 libcudnn.so.7
sudo ln -sf libcudnn.so.7.0.3 libcudnn.so.6
sudo ln -sf libcudnn.so.7 libcudnn.so
sudo ldconfig
bingo!
然而,caffe用的是低版本的cudnn进行的编译,因此这样就牺牲了caffe成就了tensorflow。
解决办法:
1.将~/caffe/include/caffe/util/cudnn.hpp 换成最新版caffe里的相应目录下的cudnn.hpp;
2.将~/caffe/include/caffe/layers/下所有cudnn开头的文件都替换为最新版caffe里相应目录下的同名文件;
3.将~/caffe/src/caffe/layer下所有cudnn开头的文件都替换为最新版caffe里相应目录下的同名文件;
紧接着出现第二个问题:依赖包版本不兼容问题
用之前编译好的caffe训练数据时出现:
1.TypeError: slice indices must be integers or None or have an __index__ method
这是因为安装tensorflow时把numpy更新到最新版了,但我们当时编译lib时用的是低版本的numpy,降级到1.11.0就可以了。
2.AttributeError: 'module' object has no attribute 'text_format'
这是因为安装tensorflow时把protobuf更新到最新版了,但我们当时编译lib时用的是低版本的protobuf,降级到2.6.0就可以了。
这期间还有点小曲折,也一起记录下来,因为我是用requirements.txt来安装需要的python依赖包,所以pip都默认安装成最新的了,因此编译lib时用的是最新版的包,当训练网络时代码会出现版本不兼容问题,比如
ImportError: numpy.core.multiarray failed to import
此时再进行版本升、降级是没有用的,编译好的路径已经是最新版的了,所以需要安装对应版本(requirements.txt里是最低版本)后重新编译lib,至于caffe要不要重新编译,可以尝试一下。
一同折腾,难保以后不会出现类似的问题,因此需要一个一劳永逸的办法:用Virtualenvwrapper解决该问题
$ sudo pip install virtualenvwrapper
把下面几行加入~/.bashrc
export WORKON_HOME=$HOME/virtualenvs # 放所有虚拟环境的地方
source /usr/local/bin/virtualenvwrapper.sh
在终端输入
source ~/.bashrc
pip install opencv-python
其他的缺什么再按就可以了。
AttributeError: 'module' object has no attribute 'text_format'