您的位置:首页 > 数据库

工作记录: 在自己数据库上运行TF-SSD——training Debug篇

2017-05-25 10:49 337 查看
用修改后的tf_convert_data.py处理自己的数据库,整理成多个.tfrecord文件之后,便是本篇要讲的部分。

首先,运行以下代码片1:

DATASET_DIR=/home/user9/DATA/OPTIMAL_Z_FINAL
TRAIN_DIR=/home/user9/CODE/TF_SSD/SSD-Tensorflow-master/My_chkp
CHECKPOINT_PATH=/home/user9/CODE/TF_SSD/SSD-Tensorflow-master/checkpoints/ssd_300_vgg.ckpt
python train_ssd_network.py \
--train_dir=${TRAIN_DIR} \
--dataset_dir=${DATASET_DIR} \
--dataset_name=optimal_z_2017 \
--dataset_split_name=train \
--model_name=ssd_300_vgg \
--checkpoint_path=${CHECKPOINT_PATH} \
--save_summaries_secs=60 \
--save_interval_secs=600 \
--weight_decay=0.0005 \
--optimizer=adam \
--learning_rate=0.001 \
--batch_size=32


结果显示:



.tfrecord读取正常;



创建卷积核失败,错误如下(CPU不支持一些东西):

Executor failed to create kernel. Invalid argument: CPU BiasOp only supports NHWC.


查找原因,详见Daniel2333的博客



应该安装gpu版本的TensorFlow;

进入
venv3.4.3/lib/python3.4/site-packages
执行以下命令:

pip uninstall tensorflow
pip install tensorflow-gpu


继续运行代码片1,出现OOM错误,根据该文章提示,应该是没有采用batch或者batch太大导致的问题,设置batch为16:

DATASET_DIR=/home/user9/DATA/OPTIMAL_Z_FINAL
TRAIN_DIR=/home/user9/CODE/TF_SSD/SSD-Tensorflow-master/My_chkp
CHECKPOINT_PATH=/home/user9/CODE/TF_SSD/SSD-Tensorflow-master/checkpoints/ssd_300_vgg.ckpt
python train_ssd_network.py \
--train_dir=${TRAIN_DIR} \
--dataset_dir=${DATASET_DIR} \
--dataset_name=optimal_z_2017 \
--dataset_split_name=train \
--model_name=ssd_300_vgg \
--checkpoint_path=${CHECKPOINT_PATH} \
--save_summaries_secs=60 \
--save_interval_secs=600 \
--weight_decay=0.0005 \
--optimizer=adam \
--learning_rate=0.001 \
--batch_size=16


开始运行:



不过看到loss并没有很快降低,而且始终在10~100之间波动,说明某些参数设置不合适。

(在已经训练好的权重基础上进行fine-tuning.)

DATASET_DIR=/home/user9/DATA/OPTIMAL_Z_FINAL
TRAIN_DIR=/home/user9/CODE/TF_SSD/SSD-Tensorflow-master/My_chkp
CHECKPOINT_PATH=/home/user9/CODE/TF_SSD/SSD-Tensorflow-master/checkpoints/ssd_300_vgg.ckpt
python train_ssd_network.py \
--train_dir=${TRAIN_DIR} \
--dataset_dir=${DATASET_DIR} \
--dataset_name=optimal_z_2017 \
--dataset_split_name=train \
--model_name=ssd_300_vgg \
--checkpoint_path=${CHECKPOINT_PATH} \
--save_summaries_secs=60 \
--save_interval_secs=600 \
--weight_decay=0.0005 \
--optimizer=adam \
--learning_rate=0.01 \
--learning_rate_decay_factor=0.94 \
--batch_size=16


然后被告知数据库中有一条目标框的值为1.005328,要求[0,0.1],因此需要返回检查数据库。

创建test.py,内容如下:

import os

err_list=[]
label=''
for i in range(21761):
t=i+1
filepath=os.path.join('/home/user9/Desktop/OPTIMAL_Z_FINAL/positive_labels','%05d'%t + '.txt')
with open(filepath) as f:
lines=f.readlines()
no=0
for line in lines:
no=no+1
# print(line)
line=line.split()
line=line[1:]
line=[float(k) for k in line]
a=line[0]-line[2]/2.
b=line[1]-line[3]/2.
c=line[0]+line[2]/2.
d=line[1]+line[3]/2.
# print('\tin line %d\t\t in file %05d.txt\n'%(no,t))
try:
label='a=%f'%a
assert(a>=0.0)
label='b=%f'%b
assert(b>=0.0)
label='c=%f'%c
assert(c<=1.0)
label='d=%f'%d
assert(d<=1.0)
except:
err_list.append((label,no,t))
continue
for err in err_list:
print err


打开ipython,输入
run test.py




(出错的值,行数,图片编码)

继续输入以下代码筛选

for err in err_list:
tmp=err[0][2:]
tmp=float(tmp)
if(tmp<=0.0 or tmp>1.0):
print err




打算不采用这些数据,因此,直接在数据库根目录下找到train_tf.txt和valid_tf.txt,删除其中相应的序号即可,然后运行:

python tf_convert_data.py --output_name=voc_train
python tf_convert_data.py --output_name=voc_valid


一定要注意,运行这条命令一定要在Python2环境下,因为Python3已经取消了decode,改用byte替代了,如果用Python3运行会报错.

然后修改optimal_z_2017中的训练集、测试集的数量(因为从数据集中删除了图片,因此数量也应修改):



重复以上代码,进行训练,仍然和以上情况相同,陷入局部最优解。

那么,继续调参。。。

没有任何效果。。。

尝试从头开始训练:

(采用vgg从头开始训练)

DATASET_DIR=/home/user9/DATA/OPTIMAL_Z_FINAL
TRAIN_DIR=/home/user9/CODE/TF_SSD/SSD-Tensorflow-master/My_chkp
CHECKPOINT_PATH=/home/user9/CODE/TF_SSD/SSD-Tensorflow-master/checkpoints/vgg_16.ckpt
python train_ssd_network.py \
--train_dir=${TRAIN_DIR} \
--dataset_dir=${DATASET_DIR} \
--dataset_name=optimal_z_2017 \
--dataset_split_name=train \
--model_name=ssd_300_vgg \
--checkpoint_path=${CHECKPOINT_PATH} \
--checkpoint_model_scope=vgg_16 \
--checkpoint_exclude_scopes=ssd_300_vgg/conv6,ssd_300_vgg/conv7,ssd_300_vgg/block8,ssd_300_vgg/block9,ssd_300_vgg/block10,ssd_300_vgg/block11,ssd_300_vgg/block4_box,ssd_300_vgg/block7_box,ssd_300_vgg/block8_box,ssd_300_vgg/block9_box,ssd_300_vgg/block10_box,ssd_300_vgg/block11_box \
--trainable_scopes=ssd_300_vgg/conv6,ssd_300_vgg/conv7,ssd_300_vgg/block8,ssd_300_vgg/block9,ssd_300_vgg/block10,ssd_300_vgg/block11,ssd_300_vgg/block4_box,ssd_300_vgg/block7_box,ssd_300_vgg/block8_box,ssd_300_vgg/block9_box,ssd_300_vgg/block10_box,ssd_300_vgg/block11_box \
--save_summaries_secs=60 \
--save_interval_secs=600 \
--weight_decay=0.0005 \
--optimizer=adam \
--learning_rate=0.001 \
--learning_rate_decay_factor=0.94 \
--batch_size=16


仍然没有效果

调节batch_size=24,这是目前我的服务器上能够接受的最大batch,再打就OOM了。然而,仍然没有效果。。。

最终,决定切换服务器,到一个更大的服务器上去跑。。。

可以参考服务器批量拷贝命令

scp -r file user@xxx.xxx.xx.xxx:/home/user/filepath


把所有的数据和代码复制到另一个服务器上,并在该服务器上搭建Python3虚拟环境。

仍然选择采用一个在Imagenet基础上训练的权重文件,以及其他部分权重随机初始化,从头开始训练(注意修改了路径,增大了batch_size):

(吐槽一下:然而切换到另一个服务器上,把之前的工作全都搞好之后,运行以下命令发现,这个新服务器上装的是CUDA7,不支持代码,简直哭了。。。于是,又装了一波cuda8,cudnn5)

最后,终于开始运行了:

DATASET_DIR=/home/user8/DATA/OPTIMAL_Z_FINAL
TRAIN_DIR=/home/user8/CODE/TF_SSD/SSD-Tensorflow-master/My_chkp
CHECKPOINT_PATH=/home/user8/CODE/TF_SSD/SSD-Tensorflow-master/checkpoints/vgg_16.ckpt
python train_ssd_network.py \
--train_dir=${TRAIN_DIR} \
--dataset_dir=${DATASET_DIR} \
--dataset_name=optimal_z_2017 \
--dataset_split_name=train \
--model_name=ssd_300_vgg \
--checkpoint_path=${CHECKPOINT_PATH} \
--checkpoint_model_scope=vgg_16 \
--checkpoint_exclude_scopes=ssd_300_vgg/conv6,ssd_300_vgg/conv7,ssd_300_vgg/block8,ssd_300_vgg/block9,ssd_300_vgg/block10,ssd_300_vgg/block11,ssd_300_vgg/block4_box,ssd_300_vgg/block7_box,ssd_300_vgg/block8_box,ssd_300_vgg/block9_box,ssd_300_vgg/block10_box,ssd_300_vgg/block11_box \
--trainable_scopes=ssd_300_vgg/conv6,ssd_300_vgg/conv7,ssd_300_vgg/block8,ssd_300_vgg/block9,ssd_300_vgg/block10,ssd_300_vgg/block11,ssd_300_vgg/block4_box,ssd_300_vgg/block7_box,ssd_300_vgg/block8_box,ssd_300_vgg/block9_box,ssd_300_vgg/block10_box,ssd_300_vgg/block11_box \
--save_summaries_secs=60 \
--save_interval_secs=600 \
--weight_decay=0.0005 \
--optimizer=adam \
--learning_rate=0.001 \
--learning_rate_decay_factor=0.94 \
--batch_size=50


由于gpu容量大,允许batch设置的比较大,于是我设置了50的batch_size,这样产生的效果:

刚刚开始迭代



500次迭代



1000次迭代



2000次迭代



可以看到,虽然仍有波动,但是经过近千次迭代,loss值已经稳定在比较低的值了,随着时间的推移,loss应该会继续下降,最终收敛。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: