用TensorFlow寫個簡單的神經網路

沒錯,又是我,結合帥氣和才智的我,不一樣的煙火,看自己都想發火;這次就用TensorFlow寫個神經網路,這個神經網路寫的很簡單,就三種層,輸入層--隱藏層----輸出層;這個也是我寫過的代碼,這次就一步步講解吧;

首先導入我們要使用的包

# -*- coding: utf-8 -*-import tensorflow as tfimport matplotlib.pyplot as pltimport numpy as npimport matplotlibfrom sklearn import datasetsfrom matplotlib.font_manager import FontProperties

然後在設定一下我們畫圖的時候要顯示中文的字體,因為Python自帶的不支持中文的解釋

#設置中文font = FontProperties(fname=r"c:windowsfontssimsun.ttc", size=14)zhfont1 = matplotlib.font_manager.FontProperties(fname=rc:windowsfontssimsun.ttc)

定義一個會話,因為圖是必須在會話中啟動的

#定義一個圖會話sess=tf.Session()

這裡我選用公開的數據鶯尾花的數據集,這個數據集雖然都被大家 玩爛了,不過這個是一個學習代碼,就不計較那麼多了;

#鶯尾花數據集iris=datasets.load_iris()x_vals=np.array([x[0:3] for x in iris.data])y_vals=np.array([x[3] for x in iris.data])

這裡設置一個隨機種子,為了可以讓大家把結果復現出來

#設置一個種子求結果seed=211tf.set_random_seed(seed)8np.random.seed(seed)

開始有模有樣的劃分數據集了,一個是訓練集,一個是測試集,訓練集佔80%,測試集佔20%

#劃分測試機和訓練集train_indices=np.random.choice(len(x_vals),round(len(x_vals)*0.8),replace=True)test_indices=np.array(list(set(range(len(x_vals)))-set(train_indices)))x_vals_train=x_vals[train_indices]x_vals_test = x_vals[test_indices]y_vals_train = y_vals[train_indices]y_vals_test = y_vals[test_indices]

在這裡我們在將特徵進行一個歸一化,也就是將數值型特徵全部都轉換為0-1之間的數值,用特徵最大距離作為分母;還有一些其他的標準化方法,有興趣可以了解,這個好處就是能夠讓迭代更加快速,還有就是消除量綱,就是單位之間影響;

使用nan_to_num這個函數主要是為了消除None值帶來的計算影響


#歸一化函數def normalize_cols(m): col_max = m.max(axis=0) col_min = m.min(axis=0) return (m - col_min) / (col_max - col_min)#數據歸一化並轉空集x_vals_train=np.nan_to_num(normalize_cols(x_vals_train))x_vals_test=np.nan_to_num(normalize_cols(x_vals_test))

好了,上面已經生成了我們想要的數據集;在這裡我們在設置一次訓練的數據集多大,一般是選擇2^N倍數,因為是計算機是二進位存儲,這樣就快,這裡我就隨意選擇了個25,因為數據集比較小,沒什麼影響

batch_size=25

在這裡定義一下訓練變數Y和X,順便設置為浮點類型

x_data=tf.placeholder(shape=[None,3],dtype=tf.float32)y_target=tf.placeholder(shape=[None,1],dtype=tf.float32)

在這裡我們設置一下隱藏層連接數

#設置隱藏層hidden_layer_nodes=5

開始定義各層的參數變數,因為輸入變數是三個

#定義各層變數,初始變數為3個A1=tf.Variable(tf.random_normal(shape=[3,hidden_layer_nodes]))b1=tf.Variable(tf.random_normal(shape=[hidden_layer_nodes]))A2=tf.Variable(tf.random_normal(shape=[hidden_layer_nodes,1]))b2=tf.Variable(tf.random_normal(shape=[1]))

這裡我們使用relu函數作為激活函數,以及輸出結果也使用relu函數

#定義隱藏層的輸出和輸出層的輸出hidden_output=tf.nn.relu(tf.add(tf.matmul(x_data,A1),b1))final_output = tf.nn.relu(tf.add(tf.matmul(hidden_output, A2),b2))

這裡我們在定義一下損失函數,有用最大似然估計的,這裡我們使用均方誤差方式

loss=tf.reduce_mean(tf.square(y_target-final_output))

定義一下參數的更新方式和學習速率,這裡我們使用梯度下降方法更新,下一次我們講解用其他方式更新,和學習速率隨著迭代次數減少,tfboys就是那麼任性

#聲明演算法初始變數opt=tf.train.GradientDescentOptimizer(0.005)train_step=opt.minimize(loss)#變數進行初始化init=tf.initialize_all_variables()sess.run(init)

定義兩個list,用來存放在訓練中的測試集和訓練集的誤差

#訓練過程loss_vec=[]test_loss=[]

開始迭代,這裡我們設置迭代次數為5000

for i in range(5000): #選取batch_size大小的數據集 rand_index=np.random.choice(len(x_vals_train),size=batch_size) #選取出數據集 rand_x=x_vals_train[rand_index] rand_y=np.transpose([y_vals_train[rand_index]]) #開始訓練步驟 sess.run(train_step,feed_dict={x_data:rand_x,y_target:rand_y}) #保存損失結果 temp_loss=sess.run(loss,feed_dict={x_data:rand_x,y_target:rand_y}) #保存損失函數 loss_vec.append(np.sqrt(temp_loss)) test_temp_loss = sess.run(loss, feed_dict={x_data: x_vals_test, y_target: np.transpose([y_vals_test])}) test_loss.append(np.sqrt(test_temp_loss)) #列印損失函數,沒五十次列印一次 if (i+1)%50==0: print(Generation: + str(i + 1) + . Train_Loss = + str(temp_loss)+ . test_Loss = + str(test_temp_loss))

迭代最後結果為

接下來我們在看看誤差隨著迭代變化的趨勢,下降的還不夠快,這些代碼其實還是很粗糙,太多地方需要優化了;下次在寫個優化版本的

#畫圖plt.plot(loss_vec, , label=訓練 Loss)plt.plot(test_loss, r--, label=測試 Loss)plt.title(均方誤差分布, fontproperties=font)plt.xlabel(迭代步數, fontproperties=font)plt.ylabel(Loss)plt.legend(prop=zhfont1)plt.show()

作者:夏爾康 ,請勿轉載,謝謝。

博客專欄:夏爾康

配套視頻教程:三個月教你從零入門人工智慧!!| 深度學習精華實踐課程 (免費)

edu.hellobi.com/course/

推薦閱讀:

你好2018:你的人工智慧版圖
裝上AI大腦的無人機要當以機制機,還得在這三方面下功夫
利用AWS學習深度學習 For Udacity P5(第一篇:困惑)
【討論】機器人在以後真的能代替人類嗎?
洗車房,無人車的噩夢?

TAG:TensorFlow | 人工智慧 | 深度學習DeepLearning |