Re: [問題] 深度學習(deep learning)出問題

作者: pipidog (如果狗狗飛上天)   2017-09-22 02:59:57
本來用推文的,但越推越長,所以簡單回文好了.沒仔細搞懂你的
程式碼,但看到幾點問題:
1.正常的情況下,如果你要做的是分類器,你的output應該是softmax,
而不是用sigmoid,這不是正常會採用的輸出層修正.如果要搞懂
softmax,你最好也花點時間搞懂cross entropy.如果你要做的是回
歸器,一般會用均方差.(但我不懂為啥你的程式的loss定義的是
平均差? 除非正負號對誤差有意義,不然這很少用.你最好確定一下)
2.新版的tensorflow,已經把initialize_all_variabel改成
tf.global_variables_initializer,你的範例有點舊了.
3.一般來說,多層感知器(也就是最簡單的全連結神經網路)我們不會
去設定太多層,通常設個一兩層就夠了.如果你覺得結果不好,先試
試看把節點加多,而不是把層加厚.這會讓你的模型簡單一些.如果
還是不好,我們再試試看增加層數.不要一股腦地就就出很多層的
結構.這樣不僅難以分析,也很容易造成過擬合.
4.一個好的機器學習模型,不是不停地增加複雜度,讓問題可以被擬
合的越準越好,而是設計出一個模型,用最低程度的複雜度來回答
出問題最好.因為真實場景下的資料是不會盡如人意的,過於複雜
的模型除了浪費資源外,你也不容易修正模型.所以一看到問題就
先給他來個10層,20層不是好事.
5.看的出來你對機器學習還有神經網路不太懂,其實對於初學者,我是
不推薦一開始就從tensorflow上手的,我建議你應該先學scikit learn
跟Keras. scikit learn集成了很多機器學習的模型,你會比較了解
"分類,迴歸,聚類(clustering),降維"這機器學習中的四大基本觀念.
然後你再進到神經網路裡面,你會發現神經網路看似複雜,其實也就
是換個手段來處理上面這四大類問題而已.本質上差異不大.
6.如果你開始要進到神經網路了,我建議你可以先試著從Keras上手,
Keras是基於tensorflow的高階API,他是以模型導向的方式讓你建
構神經網路.而且Keras已經被收錄到tensorflow中了,之後應該會
從contrib中移到正式的架構內. 從Keras下手可以先幫助你了解
模型,再去深究tensorflow的語法.
如果你對機器學習的模型一無所知就想透過學tensorflow來理解
機器模型,是很容易吃鱉的,模型一個沒搞懂就先被他複雜的架構
給淹沒了(其實我甚至覺得tensorflow根本就是設計來做後端,他
本來就不該拿來做前端使用,你有需要每次開車都先從組裝輪子
開始?).這就像是你想學開車,你該做的事情是先去上駕訓班,而不
是去學汽車組裝.這不是不行,但那是等你有一天把車玩精了,想
改車的時候在做的事情.
說了這麼多,還是想講一點,機器學習的本質,核心,是那些一個一個
的模型,模型懂了,其實用哪套東西實作反而是次要的了.
作者: st1009 (前端攻城師)   2017-09-23 00:03:00
是可以做到上萬筆,我們使用爬蟲每天再網路上抓資料,之後還會架相關實驗網站,那時候確實有機會
作者: vfgce (小兵)   2017-09-23 00:00:00
DL又不是萬靈丹,很多時候也沒比傳統SVM,RF,MLP好...若是有到萬筆以上,倒是可以試看看DL...
作者: vfgce (小兵)   2017-09-22 23:56:00
唉,了解.......
作者: st1009 (前端攻城師)   2017-09-22 23:58:00
每天成長10~80比數據左右,如果改架構,可能一天提升上千到上萬筆數據,不過等熟了才會做大
作者: st1009 (前端攻城師)   2017-09-22 23:39:00
作者: vfgce (小兵)   2017-09-22 23:39:00
可以看一下keras文檔,應該比tensorflow好懂多了...
作者: vfgce (小兵)   2017-09-22 23:37:00
弄錯的話,結果就會有問題...
作者: st1009 (前端攻城師)   2017-09-22 23:37:00
嗯,只要審查委員不要再提奇怪意見,應該不會超過2元分類
作者: st1009 (前端攻城師)   2017-09-22 23:43:00
嗯阿...我剛載好keras...用過有問題再研究sklearn好了>"<
作者: vfgce (小兵)   2017-09-22 23:41:00
你的問題應該用sklearn的MLPClassifier處理就好了...
作者: st1009 (前端攻城師)   2017-09-22 23:54:00
具體我跟教授都不知道,可能是因為我們的數據會慢慢長大吧那個評審委員很奇怪...只要我教授投一次論文,就算跟本實驗無關的論文,他都會特別提到這篇,說要做DL...甚至他還說我們廣而不精,所以...我教授就派我和組員來做DL了...
作者: vfgce (小兵)   2017-09-22 23:51:00
審查委員為何建議deep learning?資料不夠多也無法顯出deep learning的優勢...
作者: st1009 (前端攻城師)   2017-09-22 23:07:00
好的,我會研究的 <3那...我等等多加一些註解(?
作者: vfgce (小兵)   2017-09-22 23:05:00
再看一下,應該改用對數概似函數當loss function.對tensorflow完全不熟,看起來很不習慣...
作者: st1009 (前端攻城師)   2017-09-22 23:03:00
https://pastebin.com/n114yHzZ這是我現在正在嘗試的程式碼,跑成功時有83%準確率,但...不知為何常常跑不起來,可能是初始權重問吧...
作者: vfgce (小兵)   2017-09-22 23:00:00
目前看來應該是loss function問題...你用的顯然不對..
作者: st1009 (前端攻城師)   2017-09-22 22:55:00
嗯,註解是因為範例版是用reduce_mean,但我覺得怪怪的...所以刪除用用看,但沒看到明顯改善,所以就先註解了 >///<其實不只是沒有明顯改善...是用了根本無法訓練...
作者: vfgce (小兵)   2017-09-22 22:53:00
#loss = tf.reduce_sum( tf.square( ys - prediction ) )這個你註解的才是對的...loss function 錯掉,整個走鐘...
作者: st1009 (前端攻城師)   2017-09-22 22:53:00
是的,我之後應該會改掉,只是還沒確定怎改
作者: vfgce (小兵)   2017-09-22 22:52:00
loss = tf.reduce_mean(tf.reduce_sum((ys - prediction)))這是你執行時的loss function嗎?
作者: st1009 (前端攻城師)   2017-09-22 21:25:00
基本上如果可以我也希望直接跑出01啦https://goo.gl/F8CeB1 但如這篇文說神經元像邏輯回歸,可是我看的那篇論文就是在sigmoid後,把0.5以上視為1如果v大認為我是紅綠藍三色編碼012那樣的話,其實我不是,我輸入的類別資料是經過TF-IDF及NGD計算轉化過的
作者: joeyccc1 (Joey)   2017-09-22 21:15:00
其實也沒有那麼誇張啦用0.5判斷那邊比較像是argmax後的prediction 原PO如果續要的話站內給我信相我可以把改過的code寄給你*需要 *信箱
作者: st1009 (前端攻城師)   2017-09-22 21:10:00
其實...我有學過統計阿...我的實驗是參考我學長的正式論文,只是他的分類是用邏輯回歸,而審查委員希望使用DL,所以接下來我們就使用DL來進行分類...
作者: vfgce (小兵)   2017-09-22 23:28:00
我覺得你的問題,在於loss function及activvation function的選擇,剛又看了一下,二元分類的話,activation用relu或sigmoid都可以,但sigmoid易有梯度消失, output用sigmoid,超過二元分類再用softmax, loss 用binary crossentropy這些在keras都有已寫好,直接套用即可,自己寫容易出錯..但是你得研究一下,activation,loss, optimizer怎麼搭才對
作者: st1009 (前端攻城師)   2017-09-22 23:17:00
https://pastebin.com/ZDcwta2g 我加了些註解,說明每個區塊再做甚麼,希望這可以讓您閱讀方便些嗯,等我研究好keras,應該就會用他了>////<
作者: vfgce (小兵)   2017-09-22 23:15:00
你如果做二元分類的話,最簡單就是hidden用relu,ouput用softmax,loss 用cross entrophy....你不用自己寫loss的細節,很容易出錯...
作者: st1009 (前端攻城師)   2017-09-22 23:13:00
我跟組員討論過,可以,但還沒找到範例>"<
作者: vfgce (小兵)   2017-09-22 23:09:00
可以改用keras做嗎?這些細節它會代處理...
作者: vfgce (小兵)   2017-09-22 20:42:00
我的天啊,你完全沒概念....,你先弄懂資料怎麼整理...二元分類你要事先就處理好,而不是跑出答案來再分...你絕對不要再碰tensorflow,乖乖先學scitkit learn....可以的話,看點統計學,先了解什麼名目,順序,等距,等比...其實沒有統計學概念的人貿然進入資料科學有點危險....最基本的類別資料和連續數值資料的處理,及混合兩者的處理觀念要清楚啊, 很多人隨便就把類別資料當數值資料用.例如紅綠藍三色編碼為0,1,2,沒有再整理就直接用,觀念整個錯這也是python的一大問題,很多類別資料直接用整數編碼,很多人根本想都不想就直接用下去.R在這方面就好多了,R的類別資料以factor處理,不易和數值資料搞混,也讓人比較會注意到要進行轉換..
作者: st1009 (前端攻城師)   2017-09-22 20:23:00
我做的其實是2元分類,基本上跑出來的數值大於0.5我就視為1,小於視為0這樣,sigmoid是為了把數值縮在0~1方便判斷跑我程式,看到藍色的點就是正確的答案~
作者: vfgce (小兵)   2017-09-22 15:45:00
呃,沒仔細看code,如果你做的是迴歸那先從linear regression下手,先了解什麼是迴歸,什麼是分類.....迴歸一般用於輸出為連續資料,分類用於輸出為離散資料...另外logistic regression雖然名字是迴歸,但其實在做分類...若要玩deep learning,請先花點時間搞懂類神經網路再來...冒然越級打怪是很危險的....不是所有資料都可以用deep learning 做...
作者: st1009 (前端攻城師)   2017-09-22 11:01:00
非常感謝您無私的教學!!m(_ _)m話說使用softmax真的都是1,就算降低層數也是Q
作者: joeyccc1 (Joey)   2017-09-22 03:08:00
原po的code比較像回歸吧?他label這樣softmax下去都是1阿
作者: f496328mm (為什麼會流淚)   2017-09-23 10:02:00
最近 DL 很紅,很多教授都想做這塊,什麼都要搭上 AI,DL 不是萬靈丹,其實 ML 也很強,
作者: st1009 (前端攻城師)   2017-09-23 10:17:00
其實DL就是一種ML不是嘛?
作者: sean50301 ( (づ′・ω・)づ)   2017-09-23 13:26:00
由此例看到ML不能只會看範例程式碼照搬XD機統的基礎還是很重要的
作者: f496328mm (為什麼會流淚)   2017-09-23 13:30:00
ML 很多概念都跟迴歸有關 機統的基礎蠻重要的

Links booklink

Contact Us: admin [ a t ] ucptt.com