轉載出處:http://blog.csdn.net/feifei884431/article/details/51429829html
作這件事的初衷有二:
①作完入門級的,天然要進階一下。
②以前作到的準確率只有92%,聽說進階版能夠把準確率作到99.2%
步驟仍是參考TensorFlow的中文教程,天然沒有上次那麼簡單,有些坑掉進去了,好歹最後爬出來了,記錄一下。
此次用的不是一個單純的一層輸入+一層輸出+softmax機率映射層的三層網絡。多加了了兩個隱藏層以及一個全鏈接層,至關於6層CNN了。python
這個照着教程來作的話,感受應該也沒有問題,注意一些變量名的細節好比y_conv替代了原來的y,敲出來通常就能跑通啦。
結果的話,沒有作迭代次數以及cost函數的實驗啦。就簡單的一行。
.9911的準確率,還能夠吧應該。一是沒有跑到2W次循環的訓練,二是教程裏面好像有說過他用GPU跑的結果,CPU的能夠差一些。why?git
碼好以後,設置了2W的循環次數,15:17掛上開始跑,訓練的速度有了明顯變慢,到17:33去吃飯的時候只跑了17100次循環。飯罷回來傻眼啦,好長一串log,摘出主要的問題就是下圖:
ResourceExhaustedError是啥子?
翻譯過來是資源耗盡,不過不太理解,就去搜(認可沒有去TensorFLow官網搜是我蠢,那裏確定有相應的說明),百度沒得,Stack Overflow居然也沒得,後來在一個同窗的吐槽裏看到了這個Error。說他開了8G內存都跑不了海量數據,我這1G的難怪會遇到這種問題。大體計算了一下,這個矩陣的尺寸是10000x28x28x32,每一個元素是一個float64佔用8字節,因此這單個對象就須要佔用1.87g的存儲空間,還不算其餘的系統運行內存和其餘變量。確定崩盤啦。
解決辦法呢?就是拆分呀。其實我發現訓練的時候都是拿batch=50來作,test時一下用10000太大了,個人作法就是把test數據也分了10份,每份batchsize=1000,跑10次結果取accuracy的平均。因爲取數據的接口在input_data.py裏寫好了,剩下的就是熟悉一下TensorFlow的語法就能寫好。github
accuracyResult = list(range(10)) for i in range(10): batch = mnist.test.next_batch(1000) accuResult[i] = accuracy.eval(feed_dict={x:batch[0],y_:batch[1],keep_prob:1.0}) print "Test accuracy:", numpy.mean(accuResult)
雖而後來這個拆分的test能夠跑通了,不過以前訓練的模型隨着那個ResourceExhaustedError一併消失了,心好累。難道又要重跑(這一波必須重跑了TAT。。),難道之後都要這麼傷?那就未必了。TensorFlow提供了Saver()這個類來解決Session參數的存儲與恢復。具體的方法仍是看存取教程吧。
作的時候存模型比較順利,制定5000次迭代就存一下,新的模型也能夠覆蓋以前同名模型,一個模型的大小居然有38M。
讀取模型用於繼續訓練或者測試時須要再說一下:
a.tf.train.Saver()
的定義須要在Session()以前,不然會提示你錯誤。
b.經過tf.train.Saver().restore
進行恢復時,不須要進行變量的初始化,即Session.run(tf.initialize_all_variables())
不用作,不過你的變量必須事先定義好。這一點不像matlab雙擊一下.mat文件就能夠把.mat裏面的全部參數導入當前workspace,不要指望在一個新的.py文件裏導入模型參數就能夠直接test了。
固然這些問題的話,只要按照存取教程作,是不會遇到的,我當時就是嘉祥成matlab,想偷懶。編程
以前還蠢蠢的移位本身的單核1G內存阿里雲服務器能hold住Machine Learning,真的是太天真啦。下面對比一下用時吧,一樣的MNIST庫55000個train_image和10000個test_image:
以前用入門級的3層模型來訓練10000次,每次batch100,只用30s不到。
如今用的6層卷積神經網絡訓練10000次,每次100個batch,用了80分鐘。
差距仍是蠻大的,更多的層數或者更多的數據就崩盤啦。其實相比日常用matlab作的通訊仿真,13W秒跑一個case,這個時間仍是能忍的哈。下次跑的時候也應該像matlab那樣tic,toc一下,省得我本身手錶計時啦。api
這兩天作的也比較匆忙,只是實現了教程裏面的入門內容,完成了個Hello World而已。若是作的有問題歡迎你們批評指正哈。接下來還有挺多須要學習,首要的兩條:
①流程框圖,通訊裏面能夠經過流程框圖來描述一個系統,直觀高效。以前實現的部分頂多算識別的一小塊,真正的一個應用確定還須要其餘模塊,圖片獲取、圖片預處理(定位/size/去噪)、識別信息的轉化及應用等。
②NN,CNN的基礎知識須要再鞏固。服務器
深度學習路線看看大牛怎麼說。
視覺信息介紹,又一個典型的外國大牛寫的深刻淺出的理論分析,我也正在學習。雖然有些知識之前知道,不過看的目的是 鞏固 or 從另外一個角度看待問題。
Stack Overflow 聽說編程過程當中遇到的95%的問題都能在這裏找到。網絡
Tensor的官網,TensorFlow函數介紹文檔,中文社區
另外一個教程,我就是從這兒找到TensorF中文社區的函數