赞
踩
我一直对机器学习充满兴趣,但苦于环境的安装困难,并且我自己的机器性能比较低,跑机器学习代码,很低效,而且这个活动不需要自己配置环境,直接用官方提供的环境进行非常方便。转而将时间聚焦于学习与内容。经过多方努力和账户互通,InnoCamp 社区实现了 EducationCloud 系统的直接使用,这是一个开箱即用的 TensorFlow 学习云平台,能够在活动期间运行和支持 TensorFlow Boost。“个人电脑吃不消模型的长时间高算力运行”、“模型所需数据集庞大,小水管传输缓慢”,这些问题都将在 TFBoost 活动中不复存在!
下面记录详细步骤:
本 Codelab 采用图像分类的方式来进行车标识别,因此需要收集的数据集很简单,只需要拍摄各种的车标图片即可。本 Codelab 提供了已拍摄完毕的演示用数据集,可以搭配自己拍摄的数据集使用。
在拍摄数据集时,需要注意以下几点。
新建名为 Codelab 的目录,并在该目录下新建名为 data 的目录。新建 Terminal 界面,进入 Codelab 目录,将 Tools/datasets目录下的图片复制到该目录下。
cp -r ../Tools/datasets/* data
在 Codelab/data 目录下上传自己拍摄的图片并解压。(以 image.zip 为例)
unzip image.zip
rm image.zip
在图像分类模型的训练过程中,模型需要知道训练的标签以及每个标签所对应的图片,因此需要将上一步中拍摄的图片按照车标种类分类。
本 Codelab 所采用的训练程序基于 tensorflow-for-poets 项目,该项目的训练程序只需要将相同的车标归类到一个目录下即可,即在训练时传入的标签名即为归类的目录名。
本 Codelab 提供的数据集已经按照名称归类,在 Codelab/data 目录下分别新建名为 BUICK、CHANGAN、BMW、NISSAN、GM 的目录,切换到 Terminal 界面并进入 Codelab/data 目录,将对应名称段的图片分别移动到这些目录中。
mv 1521121* BUICK
mv 1521171* CHANGAN
mv 1521187* BMW
mv 1521189* NISSAN
mv 1521257* GM
能实现图像分类的模型有很多,比如 MobileNet、Inception、GoogleNet等等,每种模型都有各自的特点,下图为 Google 的 Codelab 提供的各图像分类模型对比图,本 Codelab 中选择的是 MobileNet 模型。
MobileNet V1 模型目前支持 2 种分辨率的图像,分别为 128*128 和 224*224,不过提供的训练程序会自动将传入的图片转换成指定的分辨率。
在 Terminal 界面下声明环境变量,即训练时所要用到的模型以及图像参数。在当前步骤中,我们选择使用 MobileNet 模型,训练图像分辨率为 128*128。
IMAGE_SIZE=128
ARCHITECTURE="MobileNet_1.0_${IMAGE_SIZE}"
在codelab目录下进行声明环境变量
车标识别的训练基于 Google 提供的 tensorflow-for-poets 项目,切换到 Terminal 界面,在 Codelab 目录下新建名为 scripts 的目录,进入 Codelab 目录,将 Tools/project 目录下提供的程序复制到该目录下。
cp -r ../Tools/project/* .
在 Terminal 界面下进入 Codelab目录,参照下面的做法执行训练,该项目在训练时会自动把数据集分类成三种数据集,一种是训练集,一种是测试集,一种是验证集,在默认情况下,这三种数据集的比例分别为 80%、10%、10%。
python3 -m scripts.retrain \
--bottleneck_dir=tmp/bottlenecks \
--how_many_training_steps=5000 \
--model_dir=model \
--summaries_dir=tmp/training_summaries/"${ARCHITECTURE}" \
--output_graph=output/retrained_graph_128_0_01.pb \
--output_labels=output/retrained_labels_128_0_01.txt \
--architecture="${ARCHITECTURE}" \
--testing_percentage=10 \
--validation_percentage=10 \
--image_dir=data \
--learning_rate=0.001
在执行训练后,程序会自动下载模型文件并进行训练,并且训练结束后在 output_graph 目录下生成 retrained_graph_128_0_01.pb 文件,在 output_labels 目录下生成 retrained_labels_128_0_01.txt 文件。
有两种评估训练结果的方式,一种是通过 Tensorboard 查看训练过程中各个参数的值,一种是执行评估程序直接查看识别准确率。
切换到 jupyter 界面,进入 Codelab/tmp/training_summaries 目录,选择在当前目录下进入 Tensorboard 界面。
Tensorboard 中的 accuracy_1 的曲线图即为识别的准确率随着训练步数的增加的变化情况。
如果想直接查看最终的准确率,先编辑 Codelab/scripts/evaluate.py 文件,根据下面的提示找到并修改程序。
# 找到这段代码
with load_graph(graph_file_name).as_default() as graph:
ground_truth_input = tf.placeholder(
tf.float32, [None, 5], name='GroundTruthInput')
# 修改为这段代码
with load_graph(graph_file_name).as_default() as graph:
ground_truth_input = tf.placeholder(
tf.float32, [None, ('替换为训练用标签的种类数')], name='GroundTruthInput')
# --------------------------------------------------------------------
# 找到这段代码
image_dir = 'tf_files/flower_photos'
# 修改为这段代码
image_dir = 'data'
# --------------------------------------------------------------------
# 找到这段代码
with tf.Session(graph=graph) as sess:
for filename, ground_truth in zip(filenames, ground_truths):
image = Image.open(filename).resize((224,224),Image.ANTIALIAS)
# 修改为这段代码
with tf.Session(graph=graph) as sess:
for filename, ground_truth in zip(filenames, ground_truths):
image = Image.open(filename).resize((128,128),Image.ANTIALIAS)
切换到 Terminal 界面,进入 Codelab 目录,执行评估程序。
python3 -m scripts.evaluate output/retrained_graph_128_0_01.pb
输出值中 Accuracy 即为训练的准确率。
决定最终识别率的因素有三种,一种是训练的模型,一种是数据集的完整性和干净性,另一种是训练的超参数的合理性。
超参数即不会在训练过程中随着训练的进行而发生变化的训练参数,在本 Codelab
中,选择 learning_rate
为超参数并将其调整为 0.1
、0.001
、0.0001
、0.00001
再次训练。切换到 Terminal
界面,进入 Codelab
目录,选择不同的 Learning Rate
开始训练。
Learning Rate
为 0.1
时:
python3 -m scripts.retrain \
--bottleneck_dir=tmp/bottlenecks \
--how_many_training_steps=5000 \
--model_dir=model \
--summaries_dir=tmp/training_summaries/"${ARCHITECTURE}" \
--output_graph=output/retrained_graph_128_0_1.pb \
--output_labels=output/retrained_labels_128_0_1.txt \
--architecture="${ARCHITECTURE}" \
--testing_percentage=10 \
--validation_percentage=10 \
--image_dir=data \
--learning_rate=0.1
Learning Rate
为 0.001
时:
python3 -m scripts.retrain \
--bottleneck_dir=tmp/bottlenecks \
--how_many_training_steps=5000 \
--model_dir=model \
--summaries_dir=tmp/training_summaries/"${ARCHITECTURE}" \
--output_graph=output/retrained_graph_128_0_001.pb \
--output_labels=output/retrained_labels_128_0_001.txt \
--architecture="${ARCHITECTURE}" \
--testing_percentage=10 \
--validation_percentage=10 \
--image_dir=data \
--learning_rate=0.001
Learning Rate
为 0.0001
时:
python3 -m scripts.retrain \
--bottleneck_dir=tmp/bottlenecks \
--how_many_training_steps=5000 \
--model_dir=model \
--summaries_dir=tmp/training_summaries/"${ARCHITECTURE}" \
--output_graph=output/retrained_graph_128_0_0001.pb \
--output_labels=output/retrained_labels_128_0_0001.txt \
--architecture="${ARCHITECTURE}" \
--testing_percentage=10 \
--validation_percentage=10 \
--image_dir=data \
--learning_rate=0.0001
Learning Rate
为 0.00001
时:
python3 -m scripts.retrain \
--bottleneck_dir=tmp/bottlenecks \
--how_many_training_steps=5000 \
--model_dir=model \
--summaries_dir=tmp/training_summaries/"${ARCHITECTURE}" \
--output_graph=output/retrained_graph_128_0_00001.pb \
--output_labels=output/retrained_labels_128_0_00001.txt \
--architecture="${ARCHITECTURE}" \
--testing_percentage=10 \
--validation_percentage=10 \
--image_dir=data \
--learning_rate=0.00001
切换到 Terminal
界面,进入 Codelab
目录,执行评估程序。
python3 -m scripts.evaluate output/retrained_graph_128_0_1.pb
python3 -m scripts.evaluate output/retrained_graph_128_0_001.pb
python3 -m scripts.evaluate output/retrained_graph_128_0_0001.pb
python3 -m scripts.evaluate output/retrained_graph_128_0_00001.pb
输出值中 Accuracy
即为训练的准确率。
训练时所使用的图像分辨率也是训练的超参数之一,不同的分辨率同样会影响模型的训练结果。在 Learning Rate
为 0.01
的情况下,测试训练图像分辨率为 224*224
时的结果。
测试图像分辨率为 224*224*
:
IMAGE_SIZE=224
ARCHITECTURE="MobileNet_1.0_${IMAGE_SIZE}"
python3 -m scripts.retrain \
--bottleneck_dir=tmp/bottlenecks \
--how_many_training_steps=5000 \
--model_dir=model \
--summaries_dir=tmp/training_summaries/"${ARCHITECTURE}" \
--output_graph=output/retrained_graph_224_0_01.pb \
--output_labels=output/retrained_labels_224_0_01.txt \
--architecture="${ARCHITECTURE}" \
--testing_percentage=10 \
--validation_percentage=10 \
--image_dir=data \
--learning_rate=0.001
编辑 Codelab/scripts/evaluate.py
文件,根据下面的提示找到并修改程序。
# 找到这段代码
with tf.Session(graph=graph)
as sess:
for filename, ground_truth
in zip(filenames, ground_truths):
image = Image.open(filename).resize((
128,
128),Image.ANTIALIAS)
# 修改为这段代码
with tf.Session(graph=graph)
as sess:
for filename, ground_truth
in zip(filenames, ground_truths):
image = Image.open(filename).resize((
224,
224),Image.ANTIALIAS)
Terminal
界面,进入 Codelab
目录,执行评估程序。
python3 -m scripts.evaluate output/retrained_graph_224_0_01.pb
输出值中 Accuracy
即为训练的准确率。
在训练完成之后,可能结果会显示准确率 100%
,貌似不太可信啊,我们可以使用另外的交通标志图片进行测试。
切换到 jupyter
项目树界面,在 Codelab
目录下新建名为 test
的目录。从网上寻找对应的车标图片,放在 test
目录下,这里寻找的照片不需要特别注意分辨率,测试程序中内置了统一分辨率的功能。
参考下面的程序执行在线测试,测试结果会显示在输出中,每次执行会选择目录中的一张图片预测。
graph
表示训练后生成的 PB
文件所在的路径image
表示要预测的图片所在的路径python3 -m scripts.label_image \
--graph=output/retrained_graph_224_0_01.pb \
--labels=output/retrained_labels_224_0_01.txt \
--input_height=224 \
--input_width=224 \
--image=test/image.jpg
说一下这次的学习的收获
Linux常用的命令行
rm-rf +目录名 强制删除目录名
mkdir -m 777 创建一个允许文件属主,同组人员和其他人员进行读写执行的操作
cd ..返回上一级目录
ls 展示目录下的文件
下面是相关的图
这是 模型准确率
修改 python文件在命令行下查看模型准确率
学习速率0.001
学习速率0.1
学习速率0.001
学习速率0.0001
0.00001
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。