背景
前回、Kerasを使ってirisデータを分類しました。
今回はそれを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))
コメント