1. 程式人生 > >TensorFlow-Slim_00 使用介紹

TensorFlow-Slim_00 使用介紹

目錄:

  • 1 安裝和設定
  • 2 準備資料集
  • 3 使用訓練好的模型
  • 4 從頭訓練
  • 5 微調一個新任務
  • 6 評價效能
  • 7 匯出前向圖
  • 8 問題

0 前言

TF-slim是Tensorflow的一個新的輕量級的高階API,用來定義、訓練、評價複雜模型。這個目錄包含了使用tf-slim訓練和評價幾個廣泛使用的CNN影象分類模型的程式碼。它包含了一些指令碼,可以讓你來重新或者從已經訓練好的權重微調來訓練模型。它也包含了以下程式碼:下載標準資料集、轉換資料到tf原生tfrecord格式、從tf-slim’s資料讀取和佇列程式讀取它們。你可以輕鬆地在這些資料集上訓練模型,就像我們如下展示的一樣。我們也提供了一個jupyter notebook, 它提供瞭如何使用tf-slim進行影象分類的示例。為了開發或者修改我們的模型,也可以看tf-slim主頁。

1 安裝和設定

在本節中,我們將介紹安裝相應的必備軟體包所需的步驟。

1.1 安裝最新版本TF-slim

TF-Slim可以通過TensorFlow 1.0作為tf.contrib.slim使用。 要測試您的安裝正在工作,請執行以下命令; 它應該執行沒有提出任何錯誤。

python -c "import tensorflow.contrib.slim as slim; eval = slim.evaluation.evaluate_once"

1.2 安裝 TF-slim 影象模型庫

為了用TF-Slim做影象分類,你也需要安裝TF-Slim image models library,它不是核心TF庫的部分。要做這到這一點,檢出tensorflow/models倉庫:

cd $HOME/workspace
git clone https://github.com/tensorflow/models/

這將把TF-Slim 影象模型庫放在 $HOME/workspace/models/research/slim。(它將建立一個叫models/inception的資料夾,它包含一箇舊版本的slim;你可以放心地忽略它。)

為了驗證一個是不是正常工作,執行如下命令;它將不引發任何錯誤。

cd $HOME/workspace/models/research/slim
python -c "from nets import cifarnet; mynet = cifarnet.cifarnet"

2 準備資料集

作為這個庫的一部分,我們包含了下載幾個常用影象資料集和轉換它們到Slim格式的指令碼。

2.1 下載和轉換到TFRecord格式

對於每個資料集,我們需要下載原資料,並轉成TFRecord格式。每個TFRecord包含一個TF-Example protocol buffer。

2.2 建立TF-Slim 資料描述子

一旦TFRecord 檔案建立好了,你可以很容易定義Slim資料,它儲存了資料檔案的指標,就像多種元資料,例如類的標籤、訓練測試,如何解析TFExample 。我們已經包含了TF-slim資料描述Cifar/ImageNet/Flowers/Mnist。
如何使用一個TF-Slim描述子載入資料如下:

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'])

2.3 處理ImageNet資料的自動指令碼

訓練一個ImageNet資料集的模型是共同的請求。為了解決處理ImageNet資料集的問題,我們提供了一個自動化的指令碼來下載和處理ImageNet資料集,轉成tfrecord格式。

TFRecord包括一組檔案,每個都 是序列化的tf.Example proto。每個tf.Example proto包含了ImageNet圖片,包含label和bounding box資訊。

我們提供了一個指令碼來下載和轉換ImageNet資料。

開始,我們要註冊一個Imagenet的賬戶,來獲取資料許可權。
有了使用者名稱和密碼後,你可以準備執行這個指令碼。確定你的硬碟有500G空間。DATA_DIR=$HOME/imagenet-data作為 一個儲存路徑,可以修改它。

執行下面的指令碼,請輸入USERNAME和PASSWORD。

# 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}"

3 使用預訓練模型

當神經網路有很多引數使它為強有力的逼近函式時,效果很好。

注意這些準確率是通過評價一個crop來計算的。一些學術論文記錄了更高的準確率,通過多crop多尺度。

4 從頭訓練

使用tf-slim dataset從頭訓練一個新模型。

DATASET_DIR=/tmp/imagenet
TRAIN_DIR=/tmp/train_logs
python train_image_classifier.py \
    --train_dir=${TRAIN_DIR} \
    --dataset_name=imagenet \
    --dataset_split_name=train \
    --dataset_dir=${DATASET_DIR} \
    --model_name=inception_v3

5 微調一個新任務

Fine-tuning a model from an existing checkpoint

我們經常想從一個預訓練模型開始微調,而不是從頭開始。為了指出要微調的起始點,我們用--checkpoint_path標誌來呼叫訓練,併為檢查點檔案指定一個絕對路徑。

在微調模型時我們要注意恢復檢查點權重。尤其當我們在一個不同輸出標籤數量的新任務上微調模型時,不能恢復最後的分類層。為此我們要使用--checkpoint_exclude_scopes標誌。這個標誌阻礙某些變數被載入。
當對一個類別數量與訓練好的模型不同的分類模型進行微調時,新模型將有最後的logits層,它的維度不同於預訓練模型。比如,在Flowers資料集上用ImageNet-trained進行微調時,預訓練模型的維度是[2048x1001],但是新的分類層將是[2048x5]。因此,這個標誌表示TF-Slim來避免從檢查點載入這些引數。

--checkpoint_path 用來微調的檢查點
--checkpoint_exclude_scopes 阻礙某些變數被載入
--trainable_scopes 指定被訓練的部分

6 評價效能

7 匯出前向圖

python export_inference_graph.py \
  --alsologtostderr \
  --model_name=inception_v3 \
  --output_file=/tmp/inception_v3_inf_graph.pb

8 問題解決

9 參考資料

TensorFlow-Slim image classification library
tensorflow/tensorflow/contrib/slim/