最近刷完了莫煩的tensorflow教程,寫個文章總結一下,流量警告,本文圖多,而且很長。
一、tf.Variable和tensorflow線性迴歸
通過tf.Variable定義weights和bias,進行簡單的線性迴歸
二、tf.constant和session
主要學習通過tf.constant定義常量,tf.matmul將兩個tensor相乘,類似於np.dot。還有一點很重要——session,類似於一個指針,可以指向運算,也可以指向變/常量,有兩種使用方法,推薦第二種。
三、tensor初始化
主要學習了參數初始化,在tensorflow中,進行運算前需要將定義的tensor初始化。
四、tf.placeholder
placeholder有點類似佔位符,在sess.run需要傳入具體參數時,通過feed_dict,提供一個字典。
五、激勵函數
激勵函數的作用是給神經網絡提供非線性。有很多函數可以充當激勵函數,例如relu、sigmox、tanh,當然,你也可以自己設計激勵函數,但是,激勵函數必須可微分。一般來說,簡單的神經網絡可以使用任意激勵函數,但是複雜的神經網絡必須精心選擇激活函數,以避免梯度爆炸或梯度消失現象。
六、添加層
主要學習如何定義一個函數表示添加一層神經網絡。
七、搭建簡單的神經網絡
主要學習瞭如何搭建一個簡單的神經網絡(一個隱藏層,一個輸出層)。
八、可視化神經網絡非線性擬合效果
神經網絡的搭建部分和上面一樣,本節主要學習瞭如何可視化神經網絡的非線性擬合效果。
九、優化器
主流的優化器optimizer分為四種,如圖,目前推薦用Adam
十、tensorboard
tensorboard是tensorflow的可視化工具,tensorboard主要有四個功能,查看標量(scalers)、圖(Graph)、參數分佈(Distribution)、參數柱狀圖(Histograms)。主要學習瞭如何用代碼給網絡層和參數命名,然後在Graph中展示。
十一、分類學習
本節主要學習通過搭建神經網絡,完成手寫數據集Mnist的分類任務。
十二、過擬合
對於分類和迴歸任務,經常會碰到過擬合現象,即神經網絡模型在訓練或驗證集上表現很好,在測試集上表現不如人意。說白了, 就是機器學習模型於自信. 已經到了自負的階段了.。機器學習模型的自負又表現在哪些方面呢. 這裡是一些數據. 如果要你畫一條線來描述這些數據, 大多數人都會這麼畫. 對, 這條線也是我們希望機器也能學出來的一條用來總結這些數據的線. 這時藍線與數據的總誤差可能是10. 可是有時候, 機器過於糾結這誤差值, 他想把誤差減到更小, 來完成他對這一批數據的學習使命. 所以, 他學到的可能會變成這樣 . 它幾乎經過了每一個數據點, 這樣, 誤差值會更小 . 可是誤差越小就真的好嗎? 看來我們的模型還是太天真了. 當我拿這個模型運用在現實中的時候, 他的自負就體現出來. 小二, 來一打現實數據 . 這時, 之前誤差大的藍線誤差基本保持不變 .誤差小的 紅線誤差值突然飆高 , 自負的紅線再也驕傲不起來, 因為他不能成功的表達除了訓練數據以外的其他數據. 這就叫做過擬合Overfitting
解決方法:
A、增加數據量。過擬合的原因是模型複雜度和數據量不匹配,也就是數據量太小
B、正則化。WW表示要學習的參數,過擬閤中WW往往變化比較大,為了不讓WW變化太大,在原始誤差集上做些改變,即如果WW變化太大,則讓cost的變化也變大。著名的有L1和L2正則化。
C、Dropout。訓練神經網絡時隨機去掉神經網絡節點和網絡連接,從根本上不讓神經網絡過度依賴某些神經元。
十三、Dropout緩解over-fitting
本節主要學習瞭如何在tensorflow搭建神經網絡時添加dropout。Dropout要添加在激勵函數前。
我們可以看一下帶有dropout和不帶dropout的訓練效果。其中藍線是訓練損失,橙線是測試損失。
閱讀更多 甜筒小哥 的文章