Ubuntu18.04+2070s+TF2.x环境,单卡训练PointNet++实战
- 1. 编译tf_ops文件夹下的三个动态库
- 2. 修改Python版本、TF版本不一致带来的差异
- 3. 下载训练数据
- 4. 模型训练
1. 编译tf_ops文件夹下的三个动态库
该文件夹下定义了一些pointnet++模型中需要使用的cuda核函数,如FPS(最远点采样)、grouping等,所以在训练模型前,需要先编译这些自定义的op
具体操作:
在每一个子文件夹中,运行sh tf_xxx.sh
(每个子文件夹中不一样,tab一下就出来了)。
有可能需要根据自己的环境,对sh文件进行修改,例如我的环境中,cuda、tensorflow的版本、安装位置和作者都不一样,因此进行了一些头文件、库文件的路径修改,如下:
#/bin/bash
/usr/local/cuda/bin/nvcc tf_sampling_g.cu -o tf_sampling_g.cu.o -c -O2 -DGOOGLE_CUDA=1 -x cu -Xcompiler -fPIC
# 原命令 /usr/local/cuda-8.0/bin/nvcc tf_sampling_g.cu -o tf_sampling_g.cu.o -c -O2 -DGOOGLE_CUDA=1 -x cu -Xcompiler -fPIC# TF1.2
g++ -std=c++11 tf_sampling.cpp tf_sampling_g.cu.o -o tf_sampling_so.so -shared -fPIC -I /home/hikai/.local/lib/python3.6/site-packages/tensorflow_core/include/ -I /usr/local/cuda/include -lcudart -L /usr/local/cuda/lib64/ -L /home/hikai/.local/lib/python3.6/site-packages/tensorflow_core/ -ltensorflow_framework -O2 -D_GLIBCXX_USE_CXX11_ABI=0#原命令
## TF1.2
## g++ -std=c++11 tf_sampling.cpp tf_sampling_g.cu.o -o tf_sampling_so.so -shared -fPIC -I /usr/local/lib/python2.7/dist-packages/tensorflow/include -I /usr/local/cuda-8.0/include -lcudart -L /usr/local/cuda-8.0/lib64/ -O2 -D_GLIBCXX_USE_CXX11_ABI=0# TF1.4
# g++ -std=c++11 tf_sampling.cpp tf_sampling_g.cu.o -o tf_sampling_so.so -shared -fPIC -I /usr/local/lib/python2.7/dist-packages/tensorflow/include -I /usr/local/cuda-8.0/include -I /usr/local/lib/python2.7/dist-packages/tensorflow/include/external/nsync/public -lcudart -L /usr/local/cuda-8.0/lib64/ -L/usr/local/lib/python2.7/dist-packages/tensorflow -ltensorflow_framework -O2 -D_GLIBCXX_USE_CXX11_ABI=0
(这里我增加了-ltensorflow_framework,是因为我编译时报错 undefined symbol: _ZTIN10tensorflow8OpKernelE
了。)
也可以使用作者的全英ReadMe文档中推荐的方式:
To compile the operators in TF version >=1.4, you need to modify the compile scripts slightly.First, find Tensorflow include and library paths.TF_INC=$(python -c 'import tensorflow as tf; print(tf.sysconfig.get_include())')TF_LIB=$(python -c 'import tensorflow as tf; print(tf.sysconfig.get_lib())')Then, add flags of `-I$TF_INC/external/nsync/public -L$TF_LIB -ltensorflow_framework` to the `g++` commands.
编译完成
编译完成后,每个子文件夹中会有对应的.so文件,如下图所示:
2. 修改Python版本、TF版本不一致带来的差异
由于原作者用的python版本为2, 我用的是3, 因此所有print后面需要加括号, xrange也要改为range
原作者使用的是TF1.x,我用的是TF2.X, 因此直接在开头import tensorflow.compat.v1 as tf了
(或许还有其他差异,如果编译或运行报错,也可以优先考虑一下是不是版本差异导致的问题)
3. 下载训练数据
我是用normal数据训练的,用wget下载一下就好,
wget https://shapenet.cs.stanford.edu/media/modelnet40_normal_resampled.zip
4. 模型训练
最后,使用python train.py --normal ,就可以训练了。
我直接进行训练时,由于使用normal的数据,维度是6的, 在shape方面报了个不匹配的错,于是做了如下修改,保障代码可运行
# cur_batch_data = np.zeros((BATCH_SIZE,NUM_POINT,TRAIN_DATASET.num_channel()))cur_batch_data = np.zeros((BATCH_SIZE,NUM_POINT,3))# 略去...# 改为只取前3列cur_batch_data[0:bsize,...] = batch_data[:,:,0:3]# cur_batch_data[0:bsize,...] = batch_data
(改的比较暴力,还没来得及细看,有可能其实是应该指定其他参数来解决这个问题的,后续如果发现了,再来矫正。)
最后,模型就可以训起来啦,如下~