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

用修改后的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应该会继续下降,最终收敛。

这里写图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值