TensorFlowのtutorial「tf.contrib.learn Quickstart」を試す 

# はじめに
TensorFlowのtutorial [tf.contrib.learn Quickstart](https://www.tensorflow.org/versions/r0.11/tutorials/tflearn/index.html)を試したので共有します。

なお、2016/10/19現在、tutorial内のサンプルコードはエラーが出て動きませんでしたので、そちらについても共有します。

# コード全体

コードの全体は下記となります。

```sample.py
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import tensorflow as tf
import numpy as np

# Data sets
# 120sample
IRIS_TRAINING = "iris_training.csv"

# 30 sample
IRIS_TEST = "iris_test.csv"

# Load datasets.
# 下記だと動かない。
# load_csvがdeprecatedとのこと。
# training_set = tf.contrib.learn.datasets.base.load_csv(filename=IRIS_TRAINING,target_dtype=np.int)
# test_set = tf.contrib.learn.datasets.base.load_csv(filename=IRIS_TEST,
#                                                    target_dtype=np.int)

# load_csv_with_headerを用いる
training_set = tf.contrib.learn.datasets.base.load_csv_with_header(filename=IRIS_TRAINING,target_dtype=np.int, features_dtype=np.float32, target_column=-1)
test_set = tf.contrib.learn.datasets.base.load_csv_with_header(filename=IRIS_TEST,
                                                   target_dtype=np.int, features_dtype=np.float32, target_column=-1)


# DNNの構築

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

# Build 3 layer DNN with 10, 20, 10 units respectively.
# n_classes は　3つのirisの種類を示す
# checkpoint dataの保存先
classifier = tf.contrib.learn.DNNClassifier(feature_columns=feature_columns,
                                            hidden_units=[10, 20, 10],
                                            n_classes=3,
                                            model_dir="/tmp/iris_model")



# Fit model.
# classifierの中にモデルの状態は保存されているので、
# 下記を2行書けば4000回の試行になる
classifier.fit(x=training_set.data,
               y=training_set.target,
               steps=2000)



# Evaluate accuracy.
accuracy_score = classifier.evaluate(x=test_set.data,
                                     y=test_set.target)["accuracy"]
print('Accuracy: {0:f}'.format(accuracy_score))


# Classify two new flower samples.
# predictというメソッドを使います。
new_samples = np.array(
    [[6.4, 3.2, 4.5, 1.5], [5.8, 3.1, 5.0, 1.7]], dtype=float)
y = classifier.predict(new_samples)
print('Predictions: {}'.format(str(y)))
```

# データセットのダウンロード

本チュートリアルのデータセットはirisデータになります。
featureはsepal length, sepal width, petal length, petal widthの4つで、targetはIris setosa, Iris virginica,Iris versicolorの4つで、irisのどの種類かを判別するモデルを作るチュートリアルになります。
trainデータは120サンプル,testデータは30サンプルになります。

```sample.py
# 120sample
IRIS_TRAINING = "iris_training.csv"

# 30 sample
IRIS_TEST = "iris_test.csv"
```

# データセットの読み込み

ここでつまづきましたが、tutorialのままですと、下記のエラーが出ると思います。

```
AttributeError: 'module' object has no attribute 'load_csv'
```

調べてみると、[load_csvはdeprecatedとなっており、load_csv_with_headerに変更する必要がありました。](http://stackoverflow.com/questions/39859670/error-in-tf-contrib-learn-quickstart-no-attribute-named-load-csv)

```
training_set = tf.contrib.learn.datasets.base.load_csv_with_header(filename=IRIS_TRAINING,target_dtype=np.int, features_dtype=np.float32, target_column=-1)
```
では、target_dtypeでファイル中のtarget(花の種類)の列のフォーマット、features_dtypeでfeatureの各列のフォーマット、target_columnでtargetがどの列に記載されているか（今回は一番後ろなので-1）を指定しています。


```sample.py
# Load datasets.

# 下記だと動かない
# training_set = tf.contrib.learn.datasets.base.load_csv(filename=IRIS_TRAINING,target_dtype=np.int)
# test_set = tf.contrib.learn.datasets.base.load_csv(filename=IRIS_TEST,
#                                                    target_dtype=np.int)

training_set = tf.contrib.learn.datasets.base.load_csv_with_header(filename=IRIS_TRAINING,target_dtype=np.int, features_dtype=np.float32, target_column=-1)
test_set = tf.contrib.learn.datasets.base.load_csv_with_header(filename=IRIS_TEST,target_dtype=np.int, features_dtype=np.float32, target_column=-1)
```

# DNNの構築

今回featuresはsepal length, sepal width, petal length, petal widthの4つなので`4`と指定しています。

また、hidden layerは3つでそれぞれ`10,20,10`。
分類すべき花の種類は3つで`n_classes = 3`
checkpoint dataの保存先を`/tmp/iris_model`と指定します。

```sample.py
# Specify that all features have real-value data
# four features(sepal w,sepal h,petal w,petal h)
feature_columns = [tf.contrib.layers.real_valued_column("", dimension=4)]

# Build 3 layer DNN with 10, 20, 10 units respectively.
# n_classes は　3つのirisの種類を示す
# checkpoint dataの保存先
classifier = tf.contrib.learn.DNNClassifier(feature_columns=feature_columns,
                                            hidden_units=[10, 20, 10],
                                            n_classes=3,
                                            model_dir="/tmp/iris_model")
```

# モデルのフィット

classifierの中にモデルの状態は保存されているので、下記を2行繰り返すと、2000*2=4000回の試行が行われます。

```sample.py
# Fit model.
# classifierの中にモデルの状態は保存されているので、
# 下記を2行書けば4000回の試行になる
classifier.fit(x=training_set.data,
               y=training_set.target,
               steps=2000)
```


# accuracyの計算

`evaluate`というメソッドで、`fit`と同様に検証することができます。

```sample.py
# Evaluate accuracy.
accuracy_score = classifier.evaluate(x=test_set.data,
                                     y=test_set.target)["accuracy"]
print('Accuracy: {0:f}'.format(accuracy_score))
```
おおよそ、0.96程度の数字が帰ってくると思います。

```
Accuracy: 0.966667
```

# 新たなデータの分類
`predict`というメソッドを使うことで、新しいデータが来た時に分類することができます。

```sample.py
# Classify two new flower samples.
# predictというメソッドを使います。
new_samples = np.array(
    [[6.4, 3.2, 4.5, 1.5], [5.8, 3.1, 5.0, 1.7]], dtype=float)
y = classifier.predict(new_samples)
print('Predictions: {}'.format(str(y)))
```

それぞれのデータの予測がarrayで帰ってきます。

```
Predictions: [1 2]
```


# さいごに

簡単にDNNが実装できますね。

ありがとうございました。