1. tensorflow编译 、安装
#CPU
bazel build -c opt //tensorflow/tools/pip_package:build_pip_package
#GPU
bazel build -c opt --config=cuda //tensorflow/tools/pip_package:build_pip_package
bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
sudo pip install /tmp/tensorflow_pkg/tensorflow-*.whl
问题1:
ImportError: libcudart.so.7.0: cannot open shared object file: No such file or directory。
请在.profile文件中中添加如下:
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/cuda/lib64"
export CUDA_HOME=/usr/local/cuda
2.利用Tensorflow训练图像分类的模型
谷歌的Inceptionv3给出了保存好的模型和训练的代码,直接可以拿来训练。
这里采用迁移学习的方法。即前面的层的参数都不变,而只训练最后一层的方法。最后一层是一个softmax分类器,这个分类器在原来的网络上是1000个输出节点(ImageNet有1000个类),所以需要删除网络的最后的一层,变为所需要的输出节点数量,然后再进行训练。
Tensorflow中采用的方法是这样的:将自己的训练集中的每张图像输入网络,最后在瓶颈层(bottleneck),就是倒数第二层,会生成一个2048维度的特征向量,将这个特征保存在一个txt文件中,再用这个特征来训练softmax分类器。
具体的方法如下:
1.编译和预处理
bazel buildtensorflow/examples/image_retraining:retrain
如果电脑比较新,建议用这个命令来编译:
bazel build -c opt --copt=-mavx tensorflow/examples/image_retraining:retrain
后面一种在提取bottleneck特征的时候比前面的一种快了10倍左右。
编译完成后就可以使用了。但是建议还是改动一下tensorflow/examples/image_retraining目录下的retrain的python脚本,因为里面的默认路径是/tmp,这个文件夹一旦电脑关机所有数据都会清除。建议把里面所有的这个路径都改为另外的路径。之后在该路径下将自己的训练数据集放好。
训练数据集是有格式要求的:
a.数据集应该这样设置,训练集文件夹下放置多个子文件夹,每个子文件夹就是一个类,里面包含该类的所有图像。
b.图像应该是jpg或者jpeg格式。
2.训练
在设置好数据集后,运行
bazel-bin/tensorflow/examples/image_retraining/retrain --image_dir ~/XXX
image_dir ~/XXX是训练数据集的路径XXX是数据集的名称。
这时就开始训练了。训练过程中会首先下载原来的Inception网络,保存在ImageNet的文件夹下。
第一个文件是网络的图结构,第二个文件是一个测试图像,第三个是一个映射,从最后1000个节点中的每一个映射到一个编码,第四个也是一个映射,是从编码映射到人能够识别的名词,例如:节点的表示是第234个节点,而这个节点映射到的编码是nb20003,这个编码映射到的名词是熊猫&#x