前言
Slim是一个小巧、微型基于Tensor Flow的训练框架,它支持许多轻量级的神经网络,如:Mobilenet,能够快速训练在微型低功耗的设备上运算的神经网络,在MCU上一般运算赫兹都在百兆上,与一般的CPU几G赫兹的运算能力来说相差甚远,所以如果神经网络里的卷积函数与全连接层里的神经元代码与激活函数代码过于复杂的情况下对运算能力要求也就更高,不然比如我们识别一个人脸分类在CPU上几十毫秒给出结果,但是在MCU上要三秒以上这样的话就太慢了,无法达到某些实时业务需求。
为了解决这个问题我们可以使用一些轻量级的CNN神经网络,它的网格结构不会很复杂,神经元数量也控制较少,一般在轻量级的神经网络中最后一层的全连接层里一般最多只有4096个神经元,比起其它的神经网络动不动就是上万个神经元来说要轻量很多,神经元的增加会增加连接复杂度,算法回归迭代次数增加,那么就会让时间复杂度提高,但是好处是精准,神经元里的权重会相互叠加提高更高的精准度,但是神经元连接越少那么意味着权重迭代次数会过少,结果并不会很准确。
配置环境
需要注意的是,Slim是基于Tensor FlowV1框架实现的,所以我们需要安装Tensor Flow V1,这里我建议安装Tensor Flow 1.14版本,这个是我测试过的版本,可以正常使用的,其它版本会报一些语法错误,如果去修改的话还是比较多的麻烦,所以建议安装这个版本。
这个版本在Python3.7的仓库源中可以直接安装,所以我们先安装Python3.7
安装Python3.7
首先使用wget命令从官网下载到3.7的源码包
wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz
然后解压
tar -xvf Python-3.7.0.tgz
在进入到解压目录
cd Python-3.7.0
配置生成makefile文件:
--prefix是指定安装目录,如果你不指定默认安装到/usr/local/bin目录下,这里我指定是因为我电脑上已经有一个Python了,我不想弄混淆的,这个Python只是用来编译Slim框架的,--enable-optimizations是为了编译一个稳定的发布版,其实这个选项就是在编译期间进行Test测试Python功能,确保编译出来的Python所有的功能都能正常使用,但是编译时间会很久。
./configure --prefix=/usr/local/python3.7.0 --enable-optimizations
然后直接make与install
make
sudo make install
然后将bin目录添加到bashrc文件中
vim ~/.bashrc
在最后添加如下一行:
export PATH=$PATH:/usr/local/python3.7.0/bin
在source
source ~/.bashrc
然后使用python3.7 --version看下版本
python3.7 --version
输出结果:
Python 3.7.0
然后使用pip3.7安装tensorflow1.14,--user是安装到当前用户下home/.local目录下,如果有多个用户的情况下容易起冲突
pip3.7 install tensorflow==1.14.0 --user
报了一个错误:
You are using pip version 10.0.1, however version 21.3.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
这个是我们的pip的版本太老了,更新一下就可以了,更新之后pip会默认使用3.7的源
pip3.7 install --upgrade pip --user
然后在执行一下安装命令就可以了,就会开始正常安装
安装完成之后我们的Tensor Flow环境就配置好了
下载Slim框架
创建一个目录,然后进入到这个目录里,使用如下命令拉取Github仓库
git clone https://github.com/tensorflow/models
slim框架在models/research/slim里
测试
环境已经搭好了,这里我们可以进行测试,Slim训练使用的是TFrecord格式存储训练集,有标准要求,如果要训练自己的训练集需要实现对应的框架代码,这个后期我会写文章来教大家,目前先教大家使用它自带的几个TFrecord文件
下载训练集
首先执行download_and_convert_data.py这个文件来下载训练集
dataset_name:训练集名称
dataset_dir:训练集存放路径
python3.7 models/research/slim/download_and_convert_data.py --dataset_name=flowers --dataset_dir=/home/xxx/test/dataset_flowers
报了一个错误:
ModuleNotFoundError: No module named 'contextlib2'
contextlib2是Python里一个上下文管理模块,类似C语言的Switch,我们直接使用Pip3.7进行安装就可以了
pip3.7 install contextlib2 --user
然后在执行又报了一个错误:
ModuleNotFoundError: No module named 'PIL'
PIL是Python上图像处理库,我们依然使用pip3.7可以直接安装,注意安装包是:pillow
pip3.7 install pillow --user
然后再次执行就会正常安装
在我们的下载目录里就可以看到刚刚下载的文件
flowers_train_00000-of-00005.tfrecord flowers_train_00004-of-00005.tfrecord flowers_validation_00003-of-00005.tfrecord
flowers_train_00001-of-00005.tfrecord flowers_validation_00000-of-00005.tfrecord flowers_validation_00004-of-00005.tfrecord
flowers_train_00002-of-00005.tfrecord flowers_validation_00001-of-00005.tfrecord labels.txt
flowers_train_00003-of-00005.tfrecord flowers_validation_00002-of-00005.tfrecord
其中labels就是标签,打开看一下:
0:daisy
1:dandelion
2:roses
3:sunflowers
4:tulips
对应不同的花,它们分别对应不停的训练集
开始训练
这里我们有了训练集以后就可以开始训练了,使用train_image_classifier.py这个可以开始训练
先新建一个文件夹用于保存训练文件:
mkdir train
然后输入如下命令
python3.7 models/research/slim/train_image_classifier.py \
--train_dir=/home/xxx/test/train/ \
--dataset_name=flowers \
--dataset_split_name=train \
--dataset_dir=/home/xxx/test/dataset_flowers/ \
--model_name=mobilenet_v1_025 \
--preprocessing_name=mobilenet_v1 \
--train_image_size=96 \
--use_grayscale=True \
--save_summaries_secs=300 \
--learning_rate=0.045 \
--lebel_smoothing=0.1 \
--learning_rate_decay_factor=0.98 \
--num_epochs_per_decay=2.5 \
--moving_average_decay=0.9999 \
--batch_size=96 \
--max_number_of_steps=10000
命令参数很多,我一一给大家介绍一下
参数 | 作用 |
--train_dir | 存放生成的训练文件目录 |
--dataset_name | 训练框架解析TFrecord的模块名,这个后期会教大家怎么写自己的训练集 |
--dataset_split_name | 学习集分割名,如:flowers_train_00000-of-00005.tfrecord这个训练集文件中间是以train做分割的,这个是Slim训练命名框架要求,这个后期教大家写训练集的时会教大家这个怎么写 |
--dataset_dir | 训练集存放路径 |
--model_name | 选择使用的神经网络 |
--preprocessing_name | 预处理名称,这个是对图像进行预处理的过程,如输入图像时候的卷积操作提取特征等等这些都算预处理,这里创建这一层的名字就是这个,可以后期用于验证等等 |
--train_image_size | 训练集里的图像尺寸 |
--use_grayscale | 使用图像灰度图模式,将图像转化为灰度图 |
--save_summaries_secs | 保存步数,如训练多少次保存一次文件 |
--learning_rate | 学习率 |
--lebel_smoothing | 标签平滑 |
--learning_rate_decay_factor | 学习率衰减因子 |
--num_epochs_per_decay | 学习率衰减周期因子 |
--moving_average_decay | 移动平均衰减 |
--batch_size | 批尺寸大小 |
--max_number_of_steps | 训练多少次 |
执行之后出现如下错误:
ModuleNotFoundError: No module named 'tf_slim'
使用如下命令安装:
pip3.7 install tf_slim --user
继续执行后出现了如下错误:
Errors may have originated from an input operation.
Input Source operations connected to node MobilenetV1/MobilenetV1/Conv2d_0/kernel/Regularizer/l2_regularizer/L2Loss:
MobilenetV1/Conv2d_0/weights/read (defined at /home/yongde1x/.local/lib/python3.7/site-packages/tf_slim/ops/variables.py:256)
ERROR:tensorflow:==================================
Object was never used (type <class 'tensorflow.python.framework.ops.Tensor'>):
<tf.Tensor 'init_ops/report_uninitialized_variables/boolean_mask/GatherV2:0' shape=(?,) dtype=string>
If you want to mark it as used call its "mark_used()" method.
It was originally created here:
File "models/research/slim/train_image_classifier.py", line 607, in <module>
tf.app.run() File "/home/yongde1x/.local/lib/python3.7/site-packages/tensorflow/python/platform/app.py", line 40, in run
_run(main=main, argv=argv, flags_parser=_parse_flags_tolerate_undef) File "/home/yongde1x/.local/lib/python3.7/site-packages/absl/app.py", line 334, in run
raise File "/home/yongde1x/.local/lib/python3.7/site-packages/absl/app.py", line 258, in _run_main
sys.exit(main(argv)) File "models/research/slim/train_image_classifier.py", line 603, in main
sync_optimizer=optimizer if FLAGS.sync_replicas else None) File "/home/yongde1x/.local/lib/python3.7/site-packages/tf_slim/learning.py", line 788, in train
should_retry = True File "/home/yongde1x/.local/lib/python3.7/site-packages/tensorflow/python/util/tf_should_use.py", line 193, in wrapped
return _add_should_use_warning(fn(*args, **kwargs))
这个问题参考我的这篇文章:train_image_classifier.py:Cannot assign a device for operation CifarNet/conv1/Conv2D: node CifarNet_17岁boy的博客-CSDN博客
然后就可以看到它开始训练了:
训练完成之后你可以在你存放训练文件夹中看到输出的训练文件:
checkpoint model.ckpt-0.data-00000-of-00001 model.ckpt-0.meta
graph.pbtxt model.ckpt-0.index
其中model.ckpt-0.data-00000-of-00001就是我们需要的文件,它就是最终生成的模型文件,Slim以ckpt格式进行存储的,这个格式是tensor flow里的一种通用格式,用于存储模型的权重、全连接层信息等等,可以量化为其它格式,它非常方便在于加载它时不需要重新构建全连接层,然后读取里面的变量信息到全连接层里,它里面已经包含了网格、预处理结构等等。
评估模型
当训练完成之后我们可以评估一下模型,使用:eval_image_classifier.py进行评估
python3.7 models/research/slim/eval_image_classifier.py \
--alsologtostderr \
--checkpoint=model.ckpt-0 \
--dataset_dir=/home/yongde1x/test/dataset_flowers \
--dataset_name=flowers \
--dataset_split_name=validation \
--model_name=mobilenet_v1_025 \
--preprocessing_name=mobilenet_v1 \
--use_grayscale=True \
--train_image_size=96
有些参数已经介绍过了,可以参考上面的表格:
参数 | 作用 |
--alsologtostder | log日志输出到标准stderr里 |
--checkpoint | 检查的模型文件前缀,这里的前缀是<model.ckpt-0>.data-00000-of-00001,被<>包含起来的部分,-0这个0就是训练次数的模型文件,最终这个数字应该是你训练最大的次数 |
--dataset_split_name | 这个与train相反,它是验证集的分割中间字符 |
执行时报了个错:
tensorflow.python.framework.errors_impl.NotFoundError: /tmp/tfmodel; No such file or directory
我们在tmp下新建一个目录就可以了
mkdir /tmp/tfmodel
最终输出:
INFO:tensorflow:Evaluation [1/4]
I0119 11:45:16.696446 140457061495168 evaluation.py:167] Evaluation [1/4]
INFO:tensorflow:Evaluation [2/4]
I0119 11:45:17.006847 140457061495168 evaluation.py:167] Evaluation [2/4]
INFO:tensorflow:Evaluation [3/4]
I0119 11:45:17.327047 140457061495168 evaluation.py:167] Evaluation [3/4]
INFO:tensorflow:Evaluation [4/4]
I0119 11:45:17.571879 140457061495168 evaluation.py:167] Evaluation [4/4]
eval/Recall_5[1]
eval/Accuracy[0.25]
输出了:Recall(查全率),Accuracy(精准率),这两个评估标准可以参考我的这篇文章:一文详解人工智能分类方面的KPI评价标准:混淆矩阵、TP、FP、FN、TN、P-R曲线图、ROC曲线图_17岁boy的博客-CSDN博客
相关
CKPT转PB文件
Slim生成的ckpt文件转PB文件_17岁boy的博客-CSDN博客