8.2 TensorFlow实现KNN与TensorFlow中的损失函数,优化函数
前言
8.1 mnist_soft,TensorFlow構建回歸模型中對主要對計算圖的概念與公式與計算圖的轉化進行了介紹,8.2則主要介紹一下TensorFlow中自帶的幾個算子,與優化函數,損失函數的定義,并以KNN的例子進行整體的串聯.
加載數據,依舊使用mnist手寫數字的數據
# 導入數據 from tensorflow.contrib.learn.python.learn.datasets import mnist FLAGS = Nonedata_sets = mnist.read_data_sets('/home/fonttian/Data/MNIST_data/',one_hot=True)# 我們對mnist的數據集做一個數量限制 Xtrain,Ytrain = data_sets.train.next_batch(5000) # 5000 用于訓練 Xtest,Ytest = data_sets.test.next_batch(200) # 200 用于測試 print('Xtrain.shape: ',Xtrain.shape,'Xtest.shape: ',Xtest.shape) print('Ytrain.shape: ',Ytrain.shape,'Ytest.shape: ',Ytest.shape)KNN的實現
由上可知,我們僅僅實現了一個幾乎算是最原始的KNN算法,但是無妨于我們的演示,你要是想練習的話可以寫的復雜一點,但是實際使用還是使用skleran吧.
核心代碼如下:
- tf.negative() :取相反數
- tf.abs():取絕對值
- tf.argmin():返回最小值的索引
啟動session并運行
# 啟動會話 with tf.Session() as sess:# 初始化節點tf.global_variables_initializer().run()Ntest = len(Xtest) # 測試樣本的數據# 在測試集上進行循環for i in range(Ntest):# 獲取當前測試樣本的最近鄰nn_index = sess.run(pred,feed_dict={xtrain:Xtrain,xtest:Xtest[i,:]})# 獲取最近鄰預測標簽,然后與真實的類標簽比較pred_class_label = np.argmax(Ytrain[nn_index])true_class_label = np.argmax(Ytest[i])print('Test',i,'Predicted Class Label:',pred_class_label,'True Class label:',true_class_label)# 計算準確率if pred_class_label == true_class_label:accuracy += 1print('Done!')accuracy /= Ntestprint('Accuracy:',accuracy)中場休息
由上我們已經實現了一個TensorFlow版本的KNN,但是KNN本來就簡單到了很多類庫可以很隨意的實現,那么TensorFlow的特殊之處又在哪里呢?有二
1. 計算圖式的計算方式,
2. 因為是計算圖的形式運算,所以必須使用TensorFlow自帶的函數進行運算,還在TensorFlow還提供了部分基礎運算符號,比如”+”,”-“等運算符號,其也可以代替TensorFlow的運算函數tf.add(),和tf.subtract()
但是其實我們真正經常使用的TensorFlow自帶的運算函數并不多,除了上面的幾個函數外,最常用的恐怕就是tf.matmul()了吧,這個函數是乘法的函數,在神經網絡的全連接中我們經常用到這個函數.其他的函數因為運用并不多,所以此處不在過多敘述.
KNN所沒有用到的
KNN相較于其它很多算法一個很不明顯不同的地方就是可以通過已有數據計算出結果,而無需進行訓練和降低預測誤差的反向傳播過程,但是在現在的深度學習中這個過程則是必然存在的,所以反向傳播的過程則是必然的.而TensorFlow的一個強大之處,就在于此處,對反向傳播的自動求導,依靠計算圖的機制,在我們使用TensorFlow進行深度學習的開發之時,只需要簡單的定義損失函數以及通過一行簡簡單單的代碼,選擇要進行優化的損失函數之后,TensorFlow就可以對損失函數進行自動求導,訓練我們所構建的計算圖.
定義損失函數與優化損失函數
我們以之前8.1 中的代碼為例子:
# 此處就是定義我們的損失函數, # Define loss and optimizercross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y))# 我們通過下面的代碼添加我們的損失函數 train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)另外一個BP神經網絡的例子
# 接下來構建損失函數: 計算輸出層的預測值和真是值間的誤差,對于兩者差的平方求和,再取平均,得到損失函數.運用梯度下降法,以0.1的效率最小化損失 loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys - prediction), reduction_indices=[1]))train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss) # 優化算法選取SGD,隨機梯度下降至此,通過TensorFlow基礎篇前八章的例子,你已經基本上手了TensorFlow
而在8.3 TensorFlow BP神經網絡構建與超參數的選取中我將會給出上面的BP神經網絡的完整代碼.其實現在,你可以試著用TensorFlow自己構建一個自己的神經網絡了,祝好遠.
總結
以上是生活随笔為你收集整理的8.2 TensorFlow实现KNN与TensorFlow中的损失函数,优化函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 8.3 TensorFlow BP神经网
- 下一篇: Hadoop集群扩展子节点