TensorFlowを使ってみた。

TensorFlowのTutorialをやってみたので、そのメモ。

この記事ではIrisデータセットの分類を通して、TensorFlowの基本的な使い方を勉強していきます。

なお、モデルの生成と学習にはTensorFlowの高レベルAPIのtf.kerasを使います。

f:id:pytry3g:20180719160002p:plain

 

環境

インストールはpipでしました。

pip install tensorflow

関連リンク

Basic Tutorial

Sequential Model

損失関数

目的関数

ライブラリのインポート

必要なライブラリをインポートする。

import numpy as np
import tensorflow as tf
from tensorflow import keras
from sklearn import datasets
from sklearn.model_selection import train_test_split

データの用意

sklearnで用意されているIrisデータセットを使います。

データを学習用とテスト用に分けます。

# Prepare Iris dataset
iris = datasets.load_iris()
# Split train set and test one
train_x, test_x, train_t, test_t = train_test_split(iris.data, iris.target, test_size=0.1)

データの中身

Irisデータセットにはアヤメの品種データ150件があり、それぞれ50件ずつSetosa、Versicolor、Virginicaの3品種に分類されています。

それぞれの品種にはSepal Length(がく片の長さ)、Sepal Width(がく片の幅)、Petal Length(花びらの長さ)、Petal Width(花びらの幅)の4つの特徴量があります。

今回、データを学習用とテスト用に分けましたが、その際にtest_size=0.1としたので学習データは135件、テストデータは15件となっています。

train_x.shape
>>> (135, 4)

前処理

以下のコードで前処理をしています。特徴量のなかで最大の値を見つけてきて、学習データとテストデータを最大値で割っています。こうすることで特徴量を0以上1以下にしています。

# Preprocess
maxv = np.max(iris.data)
train_x = train_x / maxv
test_x = test_x / maxv

モデルを作る

データの用意ができたので、ニューラルネットワークのモデルを作り、学習処理に関する設定をします。

ニューラルネットワークの設定

kerasを使って入力層、隠れ層、出力層の3層からなるニューラルネットワークを作ります。

# Build model
model = keras.Sequential([
    keras.layers.Dense(6, input_shape=(4, )),
    keras.layers.Dense(4, activation=tf.nn.relu),
    keras.layers.Dense(3, activation=tf.nn.softmax)
])

学習処理の設定

モデルを作りましたが、学習をする前に、いくつか学習処理に関しての設定をここでします。

ここでは、Loss functionOptimizerMetricsの3つの設定をしています。

# Set up some parameters
model.compile(optimizer=tf.train.AdamOptimizer(),
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

学習する

学習を開始するには、fitを使います。

verbose=0にしてログを非表示にしています。

# Training
model.fit(train_x, train_t, batch_size=20, epochs=100, verbose=0)

テストする

テストデータを使って、モデルの性能を見ます。

# Test
test_loss, test_acc = model.evaluate(test_x, test_t)
print("Test accuracy:", test_acc)

ソースコード

import numpy as np
import tensorflow as tf
from tensorflow import keras
from sklearn import datasets
from sklearn.model_selection import train_test_split

# Prepare Iris dataset
iris = datasets.load_iris()
# Split train set and test one
train_x, test_x, train_t, test_t = train_test_split(iris.data, iris.target, test_size=0.1)

# Preprocess
maxv = np.max(iris.data)
train_x = train_x / maxv
test_x = test_x / maxv

# Build model
model = keras.Sequential([
    keras.layers.Dense(6, input_shape=(4, )),
    keras.layers.Dense(4, activation=tf.nn.relu),
    keras.layers.Dense(3, activation=tf.nn.softmax)
])

# Set up some parameters
model.compile(optimizer=tf.train.AdamOptimizer(),
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

# Training
model.fit(train_x, train_t, batch_size=20, epochs=100, verbose=0)

# Test
test_loss, test_acc = model.evaluate(test_x, test_t)
print("Test accuracy:", test_acc)