1. 程式人生 > >[TensorFlow深度學習入門]實戰四·邏輯迴歸鳶尾花進行分類(對比均方根誤差與softmax交叉熵誤差區別)

[TensorFlow深度學習入門]實戰四·邏輯迴歸鳶尾花進行分類(對比均方根誤差與softmax交叉熵誤差區別)

[TensorFlow深度學習入門]實戰四·邏輯迴歸鳶尾花進行分類

  • 問題描述
    資料集
    鳶尾花資料集下載地址
    鳶尾花資料集包含四個特徵和一個標籤。這四個特徵確定了單株鳶尾花的下列植物學特徵:
    1、花萼長度
    2、花萼寬度
    3、花瓣長度
    4、花瓣寬度

該標籤確定了鳶尾花品種,品種必須是下列任意一種:

山鳶尾 (0)
變色鳶尾 (1)
維吉尼亞鳶尾 (2)

  • 程式碼
    使用均方根誤差
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import tensorflow as
tf file_path = "iris.csv" df_iris = pd.read_csv(file_path, sep=",", header="infer") np_iris = df_iris.values np.random.shuffle(np_iris) def normalize(temp): temp = 2*(temp - np.mean(temp,axis = 0))/(np.max(temp,axis = 0)-np.min(temp,axis = 0)) return(temp) def convert2onehot(data): # covert data to onehot representation
return pd.get_dummies(data) xs = normalize(np_iris[:,1:5]).astype(np.double) ys = convert2onehot(np_iris[:,-1]).values x = tf.placeholder(tf.float32,[None,4]) y_ = tf.placeholder(tf.float32,[None,3]) w1 = tf.get_variable("w1",initializer=tf.random_normal([4,64])) w2 = tf.get_variable("w2",initializer=
tf.random_normal([64,3])) b1 = tf.get_variable("b1",initializer=tf.zeros([1,64])) b2 = tf.get_variable("b2",initializer=tf.zeros([1,3])) l1 = tf.matmul(x,w1)+b1 l1 = tf.nn.elu(l1) y = tf.matmul(l1,w2)+b2 loss = tf.reduce_mean(tf.square(y-y_)) opt = tf.train.GradientDescentOptimizer(0.05).minimize(loss) with tf.Session() as sess: srun = sess.run init = tf.global_variables_initializer() srun(init) for e in range(6001): loss_val,_ = srun([loss,opt],{x:xs[:90,:],y_:ys[:90,:]}) if(e%400 ==0): print("%d steps loss is %f"%(e,loss_val)) ys_pre = srun(y,{x:xs[90:,:]}) result = (np.argmax(ys_pre,axis=1) == np.argmax(ys[90:,:],axis=1)) print(np.sum(result)/60)
  • 結果
    log
0 steps loss is 62.941807
400 steps loss is 0.056762
800 steps loss is 0.039173
1200 steps loss is 0.032764
1600 steps loss is 0.029213
2000 steps loss is 0.026903
2400 steps loss is 0.025220
2800 steps loss is 0.023925
3200 steps loss is 0.022888
3600 steps loss is 0.022027
4000 steps loss is 0.021291
4400 steps loss is 0.020648
4800 steps loss is 0.020077
5200 steps loss is 0.019560
5600 steps loss is 0.019088
6000 steps loss is 0.018654
0.9933333333333333
  • 使用softmax
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import tensorflow as tf


file_path = "./0DNN/iris.csv"
df_iris = pd.read_csv(file_path, sep=",", header="infer")
np_iris = df_iris.values
np.random.shuffle(np_iris)

def normalize(temp):
    temp = 2*(temp - np.mean(temp,axis = 0))/(np.max(temp,axis = 0)-np.min(temp,axis = 0))
    return(temp)

def convert2onehot(data):
    # covert data to onehot representation
    return pd.get_dummies(data)

xs = normalize(np_iris[:,1:5]).astype(np.double)
ys = convert2onehot(np_iris[:,-1]).values

x = tf.placeholder(tf.float32,[None,4])
y_ = tf.placeholder(tf.float32,[None,3])

w1 = tf.get_variable("w1",initializer=tf.random_normal([4,64],stddev=1))
w2 = tf.get_variable("w2",initializer=tf.random_normal([64,3],stddev=1))
b1 = tf.get_variable("b1",initializer=tf.zeros([1,64])+0.01)
b2 = tf.get_variable("b2",initializer=tf.zeros([1,3])+0.01)
l1 = tf.nn.elu(tf.matmul(x,w1)+b1)


"""y = tf.matmul(l1,w2)+b2

loss = tf.reduce_mean(tf.square(y-y_))
opt = tf.train.GradientDescentOptimizer(0.05).minimize(loss)"""

y = tf.nn.softmax(tf.matmul(l1,w2)+b2)

y = tf.clip_by_value(y,1e-4,10)
cross_entropy = -tf.reduce_mean(tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))
loss = cross_entropy
opt = tf.train.GradientDescentOptimizer(0.05).minimize(loss)


with tf.Session() as sess:
    srun = sess.run
    init = tf.global_variables_initializer()
    srun(init)
    
    for e in range(6001):
        loss_val,_ = srun([loss,opt],{x:xs[:,:],y_:ys[:,:]})
        if(e%400 ==0):
            print("%d steps loss is %f"%(e,loss_val))
    ys_pre = srun(y,{x:xs[:,:]})
    result = (np.argmax(ys_pre,axis=1) == np.argmax(ys[:,:],axis=1))
    print(np.sum(result)/150)


  • 輸出結果
    log:
0 steps loss is 3.956946
400 steps loss is 0.049743
800 steps loss is 0.043666
1200 steps loss is 0.041287
1600 steps loss is 0.039875
2000 steps loss is 0.038858
2400 steps loss is 0.038027
2800 steps loss is 0.037303
3200 steps loss is 0.036683
3600 steps loss is 0.036195
4000 steps loss is 0.035810
4400 steps loss is 0.035505
4800 steps loss is 0.035253
5200 steps loss is 0.035039
5600 steps loss is 0.034851
6000 steps loss is 0.034681
0.9866666666666667