TensorFlow實踐:Iris數據集的多分類問題

實例描述

採用Iris數據集進行多分類問題的訓練,Iris也稱鳶尾花卉數據集,是一類多重變量分析的數據集。數據集包含150個數據集,分爲3類,每類50個數據,每個數據包含4個屬性。可通過花萼長度,花萼寬度,花瓣長度,花瓣寬度4個屬性預測鳶尾花卉屬於(Setosa,Versicolour,Virginica)三個種類中的哪一類。

這裏採用sklearn中的數據集,首先把數據繪製出來。

在把這個數據集在的前三個屬性在三維空間中繪製出來。

實現過程

(1)準備數據

這裏直接導入sklearn庫裏的數據集就可以

def loadData():
    iris = datasets.load_iris()
    #n_samples,n_features=iris.data.shape
    #print("Number of sample:",n_samples)  
    #print("Number of feature",n_features)
    data = iris.data
    label = iris.target
    data,label = normalization(data,label)
    return data,label

這裏爲了方便訓練我對原數據集做了小小的調整,這個調整不調整都可以,看心情。

(2)定義模型

這裏定義了一個添加層的函數,參數分別爲(輸入數據,輸入數據大小,輸出結果大小,激活函數)。這裏激活函數默認是None。我選擇的是softmax作爲激活函數

def add_layer(inputs, in_size, out_size, activation_function=None,):
    Weights = tf.Variable(tf.random_normal([in_size, out_size]))
    biases = tf.Variable(tf.zeros([1, out_size]) + 0.1,)
    Wx_plus_b = tf.matmul(inputs, Weights) + biases
    if activation_function is None:
        outputs = Wx_plus_b
    else:
        outputs = activation_function(Wx_plus_b,)
    return outputs

接下來定義神經網絡的圖結構

xs = tf.placeholder(tf.float32,[None,4])
ys = tf.placeholder(tf.float32,[None,3])

y_ = add_layer(xs,4,3, activation_function=tf.nn.softmax)

損失函數與優化器分別選擇交叉熵和梯度下降優化器

loss = tf.reduce_mean(-tf.reduce_sum(ys * tf.log(y_),reduction_indices=[1])) 

train_step = tf.train.GradientDescentOptimizer(0.5).minimize(loss)

(3)訓練模型

這裏使用了sklearn中的 train_test_split 將數據集分爲測試和訓練集,訓練集包含120組數據,測試集包含30組數據。

train_data,test_data,train_label,test_label = train_test_split(data,label,test_size = 0.2)

開始訓練模型

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

for i in range(50):
    sess.run(train_step,feed_dict={xs:train_data,ys:train_label})
    if i % 5 ==0:
         print(compute_accuracy(test_data, test_label))

這裏用到一個計算準確率的函數 compute_accuracy 

def compute_accuracy(v_xs, v_ys):
    global y_
    y_pre = sess.run(y_, feed_dict={xs: v_xs})
    correct_prediction = tf.equal(tf.argmax(y_pre,1), tf.argmax(v_ys,1))
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
    result = sess.run(accuracy, feed_dict={xs: v_xs, ys: v_ys})
    return result

(4)測試模型

       

可以看到準確率還是比較讓人滿意的。參考代碼下載https://github.com/yaoxunji/tensorflow/tree/master/2

才疏學淺,若有不足,還望指正,萬分感謝。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章