Tensorflow-slim 学习笔记(二)- 图像分类模型库
TensorFlow-Slim image classification model library
T F − s l i m TF-slim TF−slim是 T e n s o r F l o w ( t e n s o r f l o w . c o n t r i b . s l i m ) TensorFlow(tensorflow.contrib.slim) TensorFlow(tensorflow.contrib.slim)的一个新的轻量级高级 A P I API API,用于定义,训练和评估复杂的模型。 该目录包含用于训练和评估使用 T F − s l i m TF-slim TF−slim的几个广泛使用的卷积神经网络 ( C N N ) (CNN) (CNN)图像分类模型的代码。 它包含的脚本将允许您从头开始训练模型,或者从预先训练好的网络权重中对其进行微调。 它还包含下载标准图像数据集的代码,将下载的数据集转换为 T e n s o r F l o w TensorFlow TensorFlow的原生 T F R e c o r d TFRecord TFRecord格式,并使用 T F − S l i m TF-Slim TF−Slim的数据读取和排队实用程序读取它们。 您可以轻松地在任何这些数据集上训练任何模型,如下所示。 我们还包括一个 J u p y t e r Jupyter Jupyter N o t e b o o k Notebook Notebook,提供了使用 T F − S l i m TF-Slim TF−Slim进行图像分类的实例。 如果需要开发或修改自己的模型,请参阅主 T F − S l i m TF-Slim TF−Slim官方主页。
安装
安装最新版本的TF-slim:
TF-Slim可以通过TensorFlow 1.0中的 tf.contrib.slim 使用。 要测试安装的环境是否可用,可以执行以下命令; 不报错即可。
python -c "import tensorflow.contrib.slim as slim; eval = slim.evaluation.evaluate_once"
安装TF-slim图像模型库:
如果要使用TF-slim来做图像分类,还需要安装 TF-Slim image models library ,这不是TF库的核心部分。 所以需要检查 tensorflow/models 如下:
cd $HOME/workspace
git clone https://github.com/tensorflow/models/
这样的话将会将 TF-Slim image models library 下载到 $HOME/workspace/models/research/slim(它会创建一个名为models / inception的目录,其中包含一个较旧版本的slim;可以忽略。)
要验证是否可以用的话,可以执行以下命令; 没有报错的话即可。
cd $HOME/workspace/models/research/slim
python -c "from nets import cifarnet; mynet = cifarnet.cifarnet"
准备数据集
作为这个库的一部分,我们已经提供了下载几个流行的图像数据集(下面列出)的脚本,并将其转换为 s l i m slim slim 格式。
Dataset | Training Set Size | Testing Set Size | Number of Classes | Comments |
---|---|---|---|---|
Flowers | 2500 | 2500 | 5 | Various sizes (source: Flickr) |
Cifar10 | 60k | 10k | 10 | 32x32 color |
MNIST | 60k | 10k | 10 | 28x28 gray |
ImageNet | 1.2M | 50k | 1000 | Various sizes |
下载数据集并将其转换为 T F R e c o r d TFRecord TFRecord 格式
对于每个数据集,我们需要下载原始数据并将其转换为 T e n s o r F l o w TensorFlow TensorFlow的原生 T F R e c o r d TFRecord TFRecord格式。 每个 T F R e c o r d TFRecord TFRecord包含一个 T F − E x a m p l e TF-Example TF−Example协议缓冲区。 下面我们演示如何为 F l o w e r s Flowers Flowers数据集执行此操作。
$ DATA_DIR=/tmp/data/flowers
$ python download_and_convert_data.py \
--dataset_name=flowers \
--dataset_dir="${DATA_DIR}"
当执行结束之后,您会发现创建了几个 T F R e c o r d TFRecord TFRecord文件:
$ ls ${DATA_DIR}
flowers_train-00000-of-00005.tfrecord
...
flowers_train-00004-of-00005.tfrecord
flowers_validation-00000-of-00005.tfrecord
...
flowers_validation-00004-of-00005.tfrecord
labels.txt
这些分别为训练和验证数据,每一类都有5个文件。 其中还有一个$ DATA_DIR / labels.txt文件,这个文件中包含从整型标签到类名称的映射。
您可以使用相同的脚本来创建 m n i s t mnist mnist 和 c i f a r 10 cifar10 cifar10 数据集。 但是,对于 I m a g e N e t ImageNet ImageNet,您必须按照下面的说明进行操作。 您首先必须在 i m a g e − n e t . o r g image-net.org image−net.org注册一个帐户。 另外,下载可能需要几个小时,数据集大小为 500 G B 500GB 500GB左右。
创建TF数据集描述符.
当TFRecord格式的数据集创建完成之后,就可以很容易的就定义一个Slim 数据集了,Slim 数据集存储的是指向数据文件的指针以及各种其他元数据,例如类标签,火车/测试拆分以及如何解析 TFExample原型等。 官网上已经发布了Cifar10,ImageNet,Flowers和MNIST的TF-Slim数据集描述符。 下面是一个TF-Slim中使用DatasetDataProvider的据集描述符加载数据的例子:
import tensorflow as tf
from datasets import flowers
slim = tf.contrib.slim
# Selects the 'validation' dataset.
dataset = flowers.get_split('validation', DATA_DIR)
# Creates a TF-Slim DataProvider which reads the dataset in the background
# during both training and testing.
provider = slim.dataset_data_provider.DatasetDataProvider(dataset)
[image, label] = provider.get(['image', 'label'])
处理ImageNet数据的自动化脚本
使用ImageNet数据集来训练模型是一个常见的需求。 为了便于使用ImageNet数据集,官网上提供了一个自动化脚本,用于将ImageNet数据集下载并处理为本地TFRecord格式。
TFRecord格式由一组分片文件组成,其中每个条目是序列化的tf.Example原型。 每个tf.Example原型包含ImageNet图像(JPEG编码)以及元数据(如标签和边界框信息)。
官网上提供一个脚本来下载和转换ImageNet数据到TFRecord格式。 根据您的网络和计算机的速度,下载和预处理数据可能需要几个小时(最多半天)。 请耐心等待。
首先,需要在[ImageNet](http://image-net.org)上注册一个帐户才能访问数据。(记住用户名和密码)
运行脚本之前,大家要确保自己的硬盘的可用空间大于500G。 官网上选择 DATA_DIR = $ HOME/imagenet-data 作为存储位置。
运行下列脚本的时候,会提示输入用户名和密码,(就是上ImageNet的那个网站上注册的),之后只要等就可以了。
脚本如下:
# location of where to place the ImageNet data
DATA_DIR=$HOME/imagenet-data
# build the preprocessing script.
bazel build slim/download_and_preprocess_imagenet
# run it
bazel-bin/slim/download_and_preprocess_imagenet "${DATA_DIR}"
脚本的最后一句输出是这样的话,就证明完成了:
2016-02-17 14:30:17.287989: Finished writing all 1281167 images in data set.
当脚本结束时,您将在DATA_DIR中找到1024和128个训练和验证文件。 这些文件将分别与1024的模式和102412的模式相匹配。
之后在DATA_DIR中会有1024个训练集,128个验证集,这些文件将按照 train-???-of-1024 和 validation-???-of-00128 的模式进行匹配。
这样就已经准备好使用ImageNet数据集进行训练或评估了。