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