Edited at

[TensorFlow] IRISを3行の変更でTensorBoardに対応させる

More than 3 years have passed since last update.


はじめに

TensorFlowのサンプルプログラムIRISを3行変更してTensorBoard対応してみました。


目次


  • TensorFlowのインストール

  • サンプルプログラム(IRIS)にTensorBoard用コードを3行追加

  • TensorBoardの実行


TensorFlowのインストール

AWS EC2 のUbuntu 14.04に TensorFlowをインストールしました。


AWS EC2

Ubuntu Server 14.04 LTS (HVM), SSD Volume Type


Anaconda

※ AnacondaにはIRISを実行するのに必要なsklearnが含まれています。

・ダウンロード


$ curl https://repo.continuum.io/archive/Anaconda3-4.2.0-Linux-x86_64.sh -o Anaconda3-4.2.0-Linux-x86_64.sh


・インストール


$ bash Anaconda3-4.2.0-Linux-x86_64.sh


・PATHの反映


$ source ~/.bashrc



Tensorflow

・インストール


$ conda install -c conda-forge tensorflow


・動作確認


$ python -m tensorflow.models.image.mnist.convolutional --self_test


・インストールディレクトリの確認


$ python -c 'import os; import inspect; import tensorflow; print(os.path.dirname(inspect.getfile(tensorflow)))'

/home/ubuntu/anaconda3/lib/python3.5/site-packages/tensorflow



サンプルプログラム(IRIS)にTensorBoard用コードを追加

プログラムが簡単なIRIS(リンク)を使ってTensorBord用のコードを追加します。

まず、iris.pyをダウンロードして実行させてみます。

$ python iris.py

WARNING:tensorflow:float64 is not supported by many models, consider casting to float32.
WARNING:tensorflow:Change warning: default value of `enable_centered_bias` will change after 2016-10-09. It will be disabled by default.Instructions for keeping existing behaviour:
Explicitly set `enable_centered_bias` to 'True' if you want to keep existing behaviour.
WARNING:tensorflow:Using default config.
WARNING:tensorflow:float64 is not supported by many models, consider casting to float32.
WARNING:tensorflow:float64 is not supported by many models, consider casting to float32.
Accuracy: 0.966667

多少、WARNINGがでますが、最後に「Accuracy: 0.966667」が表示されます。

続いて、TensorBord用に主に3か所のコードを追加します。


(1) モニターを定義

10ステップごとにモニターすることにします。

    validation_monitor = tf.contrib.learn.monitors.ValidationMonitor(

iris.data,
iris.target,
every_n_steps=10)


(2) モデルのパス、保存間隔を指定

model_dir と config のパラメータを追加します。

    classifier = tf.contrib.learn.DNNClassifier(

feature_columns=feature_columns,
hidden_units=[10, 20, 10],
n_classes=3,
model_dir="tmp/iris_model",
config=tf.contrib.learn.RunConfig(
save_checkpoints_secs=1))


(3) 学習をモニタする指定

monitors のパラメータを追加します。

グラフとしての見栄えをよくするために、200ステップだったところを501ステップに増やしてあげます。

    classifier.fit(x_train, y_train,

steps=501,
monitors=[validation_monitor])

実行してみます。


$ python iris_tensor_board.py


元々でていたWARNINGに追加で下記のWARNINGが出ますが、最後に「Accuracy」が表示されます。

WARNING:tensorflow:float64 is not supported by many models, consider casting to float32.

WARNING:tensorflow:Given features: Tensor("input:0", shape=(?, 4), dtype=float64), required signatures: TensorSignature(dtype=tf.float64, shape=TensorShape([Dimension(None), Dimension(4)]), is_sparse=False).
WARNING:tensorflow:Given targets: Tensor("output:0", shape=(?,), dtype=int64), required signatures: TensorSignature(dtype=tf.int64, shape=TensorShape([Dimension(None)]), is_sparse=False).
WARNING:tensorflow:float64 is not supported by many models, consider casting to float32.
Accuracy: 0.966667

モデル出力ディレクトリを確認してみると、チェックポイントごとにデータが出力されています。

$ ls tmp/iris_model/

checkpoint model.ckpt-441.meta model.ckpt-491-00000-of-00001
eval model.ckpt-463-00000-of-00001 model.ckpt-491.meta
events.out.tfevents.1477847211.ip-172-31-18-181 model.ckpt-463.meta model.ckpt-501-00000-of-00001
graph.pbtxt model.ckpt-484-00000-of-00001 model.ckpt-501.meta
model.ckpt-441-00000-of-00001 model.ckpt-484.meta


TensorBoardの実行

モデル出力ディレクトリを指定してTensorBoardを実行させてみます。

最初、ひとしきり、リソースが見つからずにエラーが発生しますが、その後、200でOKな状態になります。

$ tensorboard --logdir=tmp/iris_model/

Starting TensorBoard b'29' on port 6006
(You can navigate to http://172.31.18.181:6006)
WARNING:tensorflow:Found more than one graph event per run. Overwriting the graph with the newest event.
122.135.65.50 - - [30/Oct/2016 15:12:37] "GET / HTTP/1.1" 200 -
122.135.65.50 - - [30/Oct/2016 15:12:37] "GET /lib/css/global.css HTTP/1.1" 200 -
WARNING:tensorflow:IOError [Errno 2] No such file or directory: '/home/ubuntu/anaconda3/lib/python3.5/site-packages/tensorflow/tensorboard/webcomponentsjs/webcomponents-lite.min.js' on path /home/ubuntu/anaconda3/lib/python3.5/site-packages/tensorflow/tensorboard/webcomponentsjs/webcomponents-lite.min.js
122.135.65.50 - - [30/Oct/2016 15:12:37] "GET /webcomponentsjs/webcomponents-lite.min.js HTTP/1.1" 200 -
122.135.65.50 - - [30/Oct/2016 15:12:37] "GET /dist/tf-tensorboard.html HTTP/1.1" 200 -
WARNING:tensorflow:IOError [Errno 2] No such file or directory: '/home/ubuntu/anaconda3/lib/python3.5/site-packages/tensorflow/tensorboard/dist/bazel-html-imports.html' on path /home/ubuntu/anaconda3/lib/python3.5/site-packages/tensorflow/tensorboard/dist/bazel-html-imports.html
WARNING:tensorflow:IOError [Errno 2] No such file or directory: '/home/ubuntu/anaconda3/lib/python3.5/site-packages/external/dist/bazel-html-imports.html' on path /home/ubuntu/anaconda3/lib/python3.5/site-packages/external/dist/bazel-html-imports.html
122.135.65.50 - - [30/Oct/2016 15:12:37] code 404, message Not Found

...

122.135.65.50 - - [30/Oct/2016 15:16:09] "GET /data/runs HTTP/1.1" 200 -
122.135.65.50 - - [30/Oct/2016 15:16:10] "GET /data/runs HTTP/1.1" 200 -
122.135.65.50 - - [30/Oct/2016 15:16:19] "GET /data/scalars?run=eval&tag=accuracy HTTP/1.1" 200 -
122.135.65.50 - - [30/Oct/2016 15:16:25] "GET /data/scalars?run=eval&tag=loss HTTP/1.1" 200 -
122.135.65.50 - - [30/Oct/2016 15:16:25] "GET /data/scalars?run=.&tag=loss HTTP/1.1" 200 -
122.135.65.50 - - [30/Oct/2016 15:17:29] "GET /data/scalars?run=.&tag=centered_bias%200 HTTP/1.1" 200 -
122.135.65.50 - - [30/Oct/2016 15:17:33] "GET /data/scalars?run=.&tag=centered_bias%201 HTTP/1.1" 200 -
122.135.65.50 - - [30/Oct/2016 15:17:36] "GET /data/scalars?run=.&tag=centered_bias%202 HTTP/1.1" 200 -
122.135.65.50 - - [30/Oct/2016 15:17:39] "GET /data/scalars?run=.&tag=dnn%2Fhiddenlayer_0%3Afraction_of_zero_values HTTP/1.1" 200 -
122.135.65.50 - - [30/Oct/2016 15:17:39] "GET /data/scalars?run=.&tag=dnn%2Fhiddenlayer_1%3Afraction_of_zero_values HTTP/1.1" 200 -
122.135.65.50 - - [30/Oct/2016 15:17:39] "GET /data/scalars?run=.&tag=dnn%2Fhiddenlayer_2%3Afraction_of_zero_values HTTP/1.1" 200 -
122.135.65.50 - - [30/Oct/2016 15:17:39] "GET /data/scalars?run=.&tag=dnn%2Flogits%3Afraction_of_zero_values HTTP/1.1" 200 -
122.135.65.50 - - [30/Oct/2016 15:17:47] "GET /data/scalars?run=.&tag=global_step%2Fsec HTTP/1.1" 200 -
122.135.65.50 - - [30/Oct/2016 15:17:55] "GET /data/scalars?run=.&tag=loss HTTP/1.1" 200 -
122.135.65.50 - - [30/Oct/2016 15:17:55] "GET /data/scalars?run=eval&tag=loss HTTP/1.1" 200 -
122.135.65.50 - - [30/Oct/2016 15:18:10] "GET /data/runs HTTP/1.1" 200 -

200でOKな状態になってから、ブラウザで6006ポートにアクセスします。

無事に表示されました。

tensorboard1.png

tensorboard2.png


プログラム

プログラム全体はこのようになっています。


iris_tensor_board.py

#  Copyright 2016 The TensorFlow Authors. All Rights Reserved.

#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""Example of DNNClassifier for Iris plant dataset."""

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from sklearn import cross_validation
from sklearn import metrics
import tensorflow as tf
from tensorflow.contrib import learn

def main(unused_argv):
# Load dataset.
iris = learn.datasets.load_dataset('iris')
x_train, x_test, y_train, y_test = cross_validation.train_test_split(
iris.data, iris.target, test_size=0.2, random_state=42)

validation_monitor = tf.contrib.learn.monitors.ValidationMonitor(
iris.data,
iris.target,
every_n_steps=10)

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

# Fit and predict.
classifier.fit(x_train, y_train,
steps=501,
monitors=[validation_monitor])

predictions = list(classifier.predict(x_test, as_iterable=True))
score = metrics.accuracy_score(y_test, predictions)
print('Accuracy: {0:f}'.format(score))

if __name__ == '__main__':
tf.app.run()



tf.contrib.learn.monitors.ValidationMonitorクラス

Nステップごとに与えた推定量を評価します。

評価は保存されたチェックポイントに対して行われます。通常、チェックポイントは、現在のステップよりも古いです。

early_stopping_rounds を指定すると検証を早目に停止させることができます。

パラメータ
デフォルト
意味

x
None

y
None

input_fn
None

batch_size
None

eval_steps
None

every_n_steps
100
nステップごとにチェックします

metrics
None

early_stopping_rounds
None
数ステップにわたって変化が小さければ停止させるための値

early_stopping_metric
'loss'
停止メトリクスの名前

early_stopping_metric_minimize
True
True:メトリクスは減っていって停止(例:平均事情誤差)、False:メトリクスは増えていって停止(例:正解率)

name
None


tf.contrib.learn.DNNClassifierクラス

パラメータ
デフォルト
意味

hidden_units

隠れ層

feature_columns

特徴カラム

model_dir
None
モデルパラメータ、グラフを保存するディレクトリ

n_classes
2
ターゲットクラス数

weight_column_name
None
重み、カラム名

optimizer
None
最適化.Noneの場合はAdagard.

activation_fn
relu
活性関数

dropout
None
ドロップアウト

gradient_clip_norm
None
float > 0 : 勾配のノルムが閾値以下になるように補正

enable_centered_bias
None
True:各クラスの中心閾値を学習

config
None
RunConfig:実行用の設定値


tf.contrib.learn.RunConfigクラス

パラメータ
デフォルト
隠れ層

master
None(local)
TensorFlowマスター

task
None(0)
訓練実行中のレプリカ数

num_ps_replicas
None(0)
パラメータサーバタスク数

num_cores
0
使用するコア数.0の場合は自動判定.

log_device_placement
False
ログデバイスを配置

gpu_memory_fraction
1
GPUメモリの配分

cluster_spec
None
ClusterSpec クラスター仕様

tf_random_seed
None
初期化用の乱数シード

save_summary_steps
100
サマリーをセーブするステップ間隔

save_checkpoints_secs
600
チェックポイントをセーブする時間間隔(秒)

keep_checkpoint_max
5
チェックポイントファイルを保持する最大数.None, 0を指定した場合はすべて保存

keep_checkpoint_every_n_hours
10000
チェックポイントを保持する最大時間

job_name
None
ジョブ名

is_chief
None
チーフタスクかどうか

evaluation_master
''
評価マスター