【ディープラーニング】【TensorFlow】TensorFlowで多クラス分類

背景

前回、Kerasを使ってirisデータを分類しました。

www.tcom242242.net

今回はそれをTensorFlowでやってみました。

やりたいこと

前回と同じですが

irisデータセットをsklearnから取得して分類する。

irisデータセット

sklearnのirisデータセットには3種類の花の萼の長さと幅、花弁の長さと幅のデータがある

iris = datasets.load_iris()
x = iris.data
y = iris.target 

print(x[0]) # => array([ 5.1,  3.5,  1.4,  0.2]) 0番目の花の情報
print(y[0]) # => 0 # 0番目の花は0クラス

ソースコード

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

# データの用意
iris = datasets.load_iris() # データを取得
x = iris.data   # 花の特徴量、長さなど
y = iris.target # 0, 1, 2のラベル
x = preprocessing.scale(x)  # 標準化

y = np_utils.to_categorical(y)  # one-hotエンコード.例) 1 => [0, 1, 0]
x_train, x_test, y_train, y_test= train_test_split(x, y, train_size=0.8)    # 教師データとテストデータに分割

# モデルの作成
inputs = tf.placeholder(dtype=tf.float32, shape=[None,]+[len(x_train[0])], name="input")    # 入力
layer = tf.layers.dense(inputs, 16, activation=tf.nn.relu)  # 中間層
layer = tf.layers.dense(layer, 16, activation=tf.nn.relu)   # 中間層

outputs = tf.layers.dense(x , len(y_train[0]))  # 出力

teacher = tf.placeholder(dtype=tf.float32, shape=(None, 3)) # 正解データ用

softmax = tf.losses.softmax_cross_entropy(onehot_labels=y, logits=outputs)  # クロスエントロピー
loss = tf.reduce_mean(softmax)
optimizer = tf.train.AdamOptimizer(learning_rate=1e-3)  # 最適化アルゴリズムの設定
train = optimizer.minimize(loss)

sess = tf.Session()
sess.run(tf.initialize_all_variables())

# 学習
nb_epoch = 1000
for epoch in range(nb_epoch):
    sess.run(train, feed_dict={inputs:x_train,  teacher:y_train})

print("==============TEST====================")
for x, y in zip(x_test, y_test):
    answer = np.argmax(y)
    prediction = np.argmax(sess.run(outputs, feed_dict={inputs:[x]}))
    print("正解:{}, 予測値:{}".format(answer,prediction))

コメント

タイトルとURLをコピーしました