ホーム » TensorFlow » TensorFlow : Get Started : tf.contrib.learn クイックスタート

TensorFlow : Get Started : tf.contrib.learn クイックスタート

TensorFlow : Get Started : tf.contrib.learn クイックスタート (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 03/18/2017

* 本ページは、TensorFlow の本家サイトの Get Started – tf.contrib.learn Quickstart を翻訳した上で
適宜、補足説明したものです:
    https://www.tensorflow.org/get_started/tflearn
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

TensorFlow の高位な機械学習 API (tf.contrib.learn) は様々な機械学習モデルを構成し、トレーニングし、そして評価することを容易にします。このチュートリアルでは、花弁 (petal) とガク片 (sepal) の形状をもとに花の種を予測するために、tf.contrib.learn を使用してニューラルネットワーク分類器を構築しそれをアイリス・データセットで訓練します。コードを書いて次の5つのステップを実行します :

  1. アイリス訓練/テストデータを含む CSV を TensorFlow データセットにロードする
  2. ニューラルネットワーク分類器を構築する
  3. 訓練データを使用してモデルを fit する
  4. モデルの精度を評価する
  5. 新しいサンプルを分類する

 

完全なニューラルネットワーク・ソースコード

これがニューラルネットワーク分類器のための full コードです :

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import os
import urllib

import numpy as np
import tensorflow as tf

# Data sets
IRIS_TRAINING = "iris_training.csv"
IRIS_TRAINING_URL = "http://download.tensorflow.org/data/iris_training.csv"

IRIS_TEST = "iris_test.csv"
IRIS_TEST_URL = "http://download.tensorflow.org/data/iris_test.csv"

def main():
  # If the training and test sets aren't stored locally, download them.
  if not os.path.exists(IRIS_TRAINING):
    raw = urllib.urlopen(IRIS_TRAINING_URL).read()
    with open(IRIS_TRAINING, "w") as f:
      f.write(raw)

  if not os.path.exists(IRIS_TEST):
    raw = urllib.urlopen(IRIS_TEST_URL).read()
    with open(IRIS_TEST, "w") as f:
      f.write(raw)

  # Load datasets.
  training_set = tf.contrib.learn.datasets.base.load_csv_with_header(
      filename=IRIS_TRAINING,
      target_dtype=np.int,
      features_dtype=np.float32)
  test_set = tf.contrib.learn.datasets.base.load_csv_with_header(
      filename=IRIS_TEST,
      target_dtype=np.int,
      features_dtype=np.float32)

  # Specify that all features have real-value data
  feature_columns = [tf.contrib.layers.real_valued_column("", dimension=4)]

  # Build 3 layer DNN with 10, 20, 10 units respectively.
  classifier = tf.contrib.learn.DNNClassifier(feature_columns=feature_columns,
                                              hidden_units=[10, 20, 10],
                                              n_classes=3,
                                              model_dir="/tmp/iris_model")
  # Define the training inputs
  def get_train_inputs():
    x = tf.constant(training_set.data)
    y = tf.constant(training_set.target)

    return x, y

  # Fit model.
  classifier.fit(input_fn=get_train_inputs, steps=2000)

  # Define the test inputs
  def get_test_inputs():
    x = tf.constant(test_set.data)
    y = tf.constant(test_set.target)

    return x, y

  # Evaluate accuracy.
  accuracy_score = classifier.evaluate(input_fn=get_test_inputs,
                                       steps=1)["accuracy"]

  print("\nTest Accuracy: {0:f}\n".format(accuracy_score))

  # Classify two new flower samples.
  def new_samples():
    return np.array(
      [[6.4, 3.2, 4.5, 1.5],
       [5.8, 3.1, 5.0, 1.7]], dtype=np.float32)

  predictions = list(classifier.predict(input_fn=new_samples))

  print(
      "New Samples, Class Predictions:    {}\n"
      .format(predictions))

if __name__ == "__main__":
    main()

次のセクションでコードを詳細に通り抜けます。

 

アイリス CSV データを TensorFlow にロードする

アイリス・データセットは 150 行のデータを含み、3つの関連アイリス種 : アイリス・セトサ (setosa)、アイリス・バージニカ (virginica)、アイリス・バージカラー (versicolor) のそれぞれから 50 サンプルから成ります。

左から右へ、アイリス・セトサ (by Radomil, CC BY-SA 3.0)、アイリス・バージカラー (by Dlanglois, CC BY-SA 3.0)、そしてアイリス・バージニカ (by Frank Mayfield, CC BY-SA 2.0) です。

各行は各花のサンプルのための次のデータを含みます : がく片長さ、がく片幅、花弁長さ、花弁幅、そして花の種。花の種は整数で表され、0 はアイリス・セトサを示し、1 はアイリス・バージカラーを示し、そして 2 はアイリス・バージニカを示します。

がく片長さ

がく片幅

花弁長さ

花弁幅

5.1

3.5

1.4

0.2

0

4.9

3.0

1.4

0.2

0

4.7

3.2

1.3

0.2

0

7.0

3.2

4.7

1.4

1

6.4

3.2

4.5

1.5

1

6.9

3.1

4.9

1.5

1

6.5

3.0

5.2

2.0

2

6.2

3.4

5.4

2.3

2

5.9

3.0

5.1

1.8

2

このチュートリアルのために、アイリス・データは無作為に2つの別の CSV に分割されます :

始めるには、最初に全ての必要なモジュールをインポートして、データセットをどこにダウンロードしてストアするかを定義します :

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import os
import urllib

import tensorflow as tf
import numpy as np

IRIS_TRAINING = "iris_training.csv"
IRIS_TRAINING_URL = "http://download.tensorflow.org/data/iris_training.csv"

IRIS_TEST = "iris_test.csv"
IRIS_TEST_URL = "http://download.tensorflow.org/data/iris_test.csv"

そして、訓練とテストセットがまだローカルに保持されていないならば、ダウンロードします。

if not os.path.exists(IRIS_TRAINING):
  raw = urllib.urlopen(IRIS_TRAINING_URL).read()
  with open(IRIS_TRAINING,'w') as f:
    f.write(raw)

if not os.path.exists(IRIS_TEST):
  raw = urllib.urlopen(IRIS_TEST_URL).read()
  with open(IRIS_TEST,'w') as f:
    f.write(raw)

次に、訓練とテストセットを learn.datasets.base の load_csv_with_header() メソッドを使用してデータセットにロードします。load_csv_with_header() は3つの必要な引数を取ります :

  • filename, これは CSV ファイルへのファイルパスを取ります。
  • target_dtype, これはデータセットの目標値 (target value) の numpy データ型を取ります。
  • features_dtype, これはデータセットの特徴値 (feature values) の numpy データ型を取ります。

ここで、目標 (target, モデルを訓練して予測するための値) は花の種で、これは 0-2 の整数ですから、妥当な numpy データ型は np.int です :

# Load datasets.
training_set = tf.contrib.learn.datasets.base.load_csv_with_header(
    filename=IRIS_TRAINING,
    target_dtype=np.int,
    features_dtype=np.float32)
test_set = tf.contrib.learn.datasets.base.load_csv_with_header(
    filename=IRIS_TEST,
    target_dtype=np.int,
    features_dtype=np.float32)

tf.contrib.learn のデータセットは named tuples (名前付きタプル) です; データと目標 (target) フィールドを通して特徴データと目標値にアクセスできます。ここで、training_set.data と training_set.target はトレーニングセットのための特徴データと目標値をそれぞれ含み、そして test_set.data と test_set.target はテストセットのための特徴データと目標値を含みます。

後で、”DNNClassifier をアイリス訓練データに fit させる” でモデルを訓練するために training_set.data と training_set.target を使用して、そして “モデル精度を評価する” では test_set.data と test_set.target を使用します。しかしまずは、次のセクションでモデルを構築します。

 

深層ニューラルネットワーク分類器を構築する

tf.contrib.learn は Estimator と呼ばれる、事前定義されたモデルを各種提供しています、これは貴方のデータ上で訓練と評価演算を実行するために “枠にとらわれない (out of the box)” モデルとして使用できます。 ここで、アイリス・データに fit させるために深層ニューラルネットワーク分類器モデルを構成します。tf.contrib.learn を使用して、2、3行のコードで tf.contrib.learn.DNNClassifier をインスタンス化できます :

# Specify that all features have real-value data
feature_columns = [tf.contrib.layers.real_valued_column("", dimension=4)]

# Build 3 layer DNN with 10, 20, 10 units respectively.
classifier = tf.contrib.learn.DNNClassifier(feature_columns=feature_columns,
                                            hidden_units=[10, 20, 10],
                                            n_classes=3,
                                            model_dir="/tmp/iris_model")

上のコードは最初にモデルの特徴カラムを定義します、これはデータセットの特徴のためのデータ型を指定します。全ての特徴データは連続的ですので、特徴カラムを構成するために使用するのに tf.contrib.layers.real_valued_column が適当な関数になります。データセット (ガク片幅、ガク片長さ、花弁幅、花弁高さ (height)) には4つの特徴があり、従って全てのデータを保持するためには次元は 4 でなければなりません。

それから、コードは次の引数を使用して DNNClassifier モデルを作成します :

  • feature_columns=feature_columns. 上で定義された特徴カラムのセット。
  • hidden_units=[10, 20, 10]. 3つの 隠れ層 で、10, 20, そして 10 ニューロンをそれぞれ含みます。
  • n_classes=3. 3つの目標クラスで、3つのアイリス種を表します。
  • model_dir=/tmp/iris_model. モデル訓練の間に TensorFlow が checkpoint データをセーブするディレクトリ。TensorFlow で更にロギングとモニタリングのためには、Logging and Monitoring Basics with tf.contrib.learn を参照してください。

 

訓練入力パイプラインを記述する

tf.contrib.learn API は入力関数を使用し、これはモデルのためのデータを生成する TensorFlow 演算を作成します。この場合は、データは tf.constant TensorFlow 定数にストアできるほどに小さいです。次のコードは最も単純な可能な入力パイプラインを生成します :

# Define the test inputs
def get_train_inputs():
  x = tf.constant(training_set.data)
  y = tf.constant(training_set.target)

  return x, y

 

DNNClassifier をアイリス訓練データに fit させる

DNN classifier モデルを構成した今、fit メソッドを使用してそれをアイリス訓練データに fit させることができます。input_fn として get_train_inputs と、訓練のためのステップ数 (ここでは、2000) を渡します :

# Fit model.
classifier.fit(input_fn=get_train_inputs, steps=2000)

モデルの状態は classifier に保持されます、これは望むならば繰り返し訓練できることを意味します。例えば、上は次と同値です :

classifier.fit(x=training_set.data, y=training_set.target, steps=1000)
classifier.fit(x=training_set.data, y=training_set.target, steps=1000)

けれども、訓練の間モデルを追跡することに目を向けるならば、代わりにロギング演算を実行するために TensorFlow モニタを使用することを望むでしょう。このトピックについての詳細はチュートリアル “Logging and Monitoring Basics with tf.contrib.learn” を参照してください。

 

モデル精度を評価する

アイリス訓練データで DNNClassifier モデルを fit させました ; 今、evaluate メソッドを使用してアイリス・テストデータでその精度を確認できます。fit のように、evaluate は入力パイプラインを構築する入力関数を取ります。evaluate は評価結果とともに dict を返します。次のコードはアイリス・テストデータ —test_set.data とtest_set.target— を結果からの精度を評価して表示するために渡します :

# Define the test inputs
def get_test_inputs():
  x = tf.constant(test_set.data)
  y = tf.constant(test_set.target)

  return x, y

# Evaluate accuracy.
accuracy_score = classifier.evaluate(input_fn=get_test_inputs,
                                     steps=1)["accuracy"]

print("\nTest Accuracy: {0:f}\n".format(accuracy_score))

[注意] 評価するための steps 引数はここでは重要です。evaluate は通常は入力の終わりに到達するまで実行されます。ファイルのセットに渡り評価するためにはこれは完璧ですが、ここで使用される constants は期待する OutOfRangeError あるいは StopIteration を決して throw しません。

フル・スクリプトを実行した時、次に近いようなものを出力するでしょう :

Test Accuracy: 0.966667

精度結果は様々かもしれませんが、90% より高くなるべきです。比較的小さいデータセットに対しては悪くありません!

 

新しいサンプルを分類する

新しいサンプルを分類するためには estimator の predict メソッドを使用します。例えば、これら2つの新しい花のサンプルがあるとします :

がく片長さ

がく片幅

花弁長

花弁幅

6.4

3.2

4.5

1.5

5.8

3.1

5.0

1.7

predict() メソッドを使用してこれらの種を予測できます。predict は generator を返し、これは簡単にリストに変換されます。次のコードはクラス予測を取得して出力します :

# Classify two new flower samples.
def new_samples():
  return np.array(
    [[6.4, 3.2, 4.5, 1.5],
     [5.8, 3.1, 5.0, 1.7]], dtype=np.float32)

predictions = list(classifier.predict(input_fn=new_samples))

print(
    "New Samples, Class Predictions:    {}\n"
    .format(predictions))

結果は次のように見れるはずです :

New Samples, Class Predictions:    [1 2]

モデルはこうして最初のサンプルはアイリス・バージカラーであることを、そして2つ目のサンプルはアイリス・バージニカであることを予測します。

 

以上

AI導入支援 #2 ウェビナー

スモールスタートを可能としたAI導入支援   Vol.2
[無料 WEB セミナー] [詳細]
「画像認識 AI PoC スターターパック」の紹介
既に AI 技術を実ビジネスで活用し、成果を上げている日本企業も多く存在しており、競争優位なビジネスを展開しております。
しかしながら AI を導入したくとも PoC (概念実証) だけでも高額な費用がかかり取組めていない企業も少なくないようです。A I導入時には欠かせない PoC を手軽にしかも短期間で認知度を確認可能とするサービの紹介と共に、AI 技術の特性と具体的な導入プロセスに加え運用時のポイントについても解説いたします。
日時:2021年10月13日(水)
会場:WEBセミナー
共催:クラスキャット、日本FLOW(株)
後援:働き方改革推進コンソーシアム
参加費: 無料 (事前登録制)
人工知能開発支援
◆ クラスキャットは 人工知能研究開発支援 サービスを提供しています :
  • テクニカルコンサルティングサービス
  • 実証実験 (プロトタイプ構築)
  • アプリケーションへの実装
  • 人工知能研修サービス
◆ お問合せ先 ◆
(株)クラスキャット
セールス・インフォメーション
E-Mail:sales-info@classcat.com