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

看板Python作者 (如果狗狗飛上天)時間7年前 (2017/09/22 03:00), 7年前編輯推噓36(36062)
留言98則, 5人參與, 最新討論串2/3 (看更多)
本來用推文的,但越推越長,所以簡單回文好了.沒仔細搞懂你的 程式碼,但看到幾點問題: 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根本就是設計來做後端,他 本來就不該拿來做前端使用,你有需要每次開車都先從組裝輪子 開始?).這就像是你想學開車,你該做的事情是先去上駕訓班,而不 是去學汽車組裝.這不是不行,但那是等你有一天把車玩精了,想 改車的時候在做的事情. 說了這麼多,還是想講一點,機器學習的本質,核心,是那些一個一個 的模型,模型懂了,其實用哪套東西實作反而是次要的了. -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 73.90.201.243 ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1506020401.A.D48.html

09/22 03:08, , 1F
原po的code比較像回歸吧?
09/22 03:08, 1F

09/22 03:08, , 2F
他label這樣softmax下去都是1阿
09/22 03:08, 2F
※ 編輯: pipidog (73.90.201.243), 09/22/2017 03:54:38

09/22 11:01, , 3F
非常感謝您無私的教學!!m(_ _)m
09/22 11:01, 3F

09/22 14:49, , 4F
話說使用softmax真的都是1,就算降低層數也是Q
09/22 14:49, 4F

09/22 15:45, , 5F
呃,沒仔細看code,如果你做的是迴歸那先從linear regression
09/22 15:45, 5F

09/22 15:47, , 6F
下手,先了解什麼是迴歸,什麼是分類.....
09/22 15:47, 6F

09/22 15:49, , 7F
迴歸一般用於輸出為連續資料,分類用於輸出為離散資料...
09/22 15:49, 7F

09/22 15:50, , 8F
另外logistic regression雖然名字是迴歸,但其實在做分類...
09/22 15:50, 8F

09/22 15:52, , 9F
若要玩deep learning,請先花點時間搞懂類神經網路再來...
09/22 15:52, 9F

09/22 15:53, , 10F
冒然越級打怪是很危險的....
09/22 15:53, 10F

09/22 15:55, , 11F
不是所有資料都可以用deep learning 做...
09/22 15:55, 11F

09/22 20:23, , 12F
我做的其實是2元分類,基本上跑出來的數值大於0.5我就視為
09/22 20:23, 12F

09/22 20:24, , 13F
1,小於視為0這樣,sigmoid是為了把數值縮在0~1方便判斷
09/22 20:24, 13F

09/22 20:26, , 14F
跑我程式,看到藍色的點就是正確的答案~
09/22 20:26, 14F

09/22 20:42, , 15F
我的天啊,你完全沒概念....,你先弄懂資料怎麼整理...
09/22 20:42, 15F

09/22 20:44, , 16F
二元分類你要事先就處理好,而不是跑出答案來再分...
09/22 20:44, 16F

09/22 20:47, , 17F
你絕對不要再碰tensorflow,乖乖先學scitkit learn....
09/22 20:47, 17F

09/22 20:49, , 18F
可以的話,看點統計學,先了解什麼名目,順序,等距,等比...
09/22 20:49, 18F

09/22 20:58, , 19F
其實沒有統計學概念的人貿然進入資料科學有點危險....
09/22 20:58, 19F

09/22 20:59, , 20F
最基本的類別資料和連續數值資料的處理,及混合兩者的處理
09/22 20:59, 20F

09/22 21:02, , 21F
觀念要清楚啊, 很多人隨便就把類別資料當數值資料用.
09/22 21:02, 21F

09/22 21:06, , 22F
例如紅綠藍三色編碼為0,1,2,沒有再整理就直接用,觀念整個錯
09/22 21:06, 22F

09/22 21:07, , 23F
這也是python的一大問題,很多類別資料直接用整數編碼,
09/22 21:07, 23F

09/22 21:08, , 24F
很多人根本想都不想就直接用下去.
09/22 21:08, 24F

09/22 21:09, , 25F
R在這方面就好多了,R的類別資料以factor處理,不易和數值
09/22 21:09, 25F

09/22 21:10, , 26F
資料搞混,也讓人比較會注意到要進行轉換..
09/22 21:10, 26F

09/22 21:10, , 27F
其實...我有學過統計阿...我的實驗是參考我學長的正式論文
09/22 21:10, 27F

09/22 21:13, , 28F
,只是他的分類是用邏輯回歸,而審查委員希望使用DL,所以
09/22 21:13, 28F

09/22 21:14, , 29F
接下來我們就使用DL來進行分類...
09/22 21:14, 29F

09/22 21:15, , 30F
其實也沒有那麼誇張啦用0.5判斷那邊比較像是argmax後的
09/22 21:15, 30F

09/22 21:15, , 31F
prediction 原PO如果續要的話站內給我信相我可以把改
09/22 21:15, 31F

09/22 21:16, , 32F
過的code寄給你
09/22 21:16, 32F

09/22 21:16, , 33F
*需要 *信箱
09/22 21:16, 33F

09/22 21:25, , 34F
基本上如果可以我也希望直接跑出01啦
09/22 21:25, 34F

09/22 21:26, , 35F
https://goo.gl/F8CeB1 但如這篇文說神經元像邏輯回歸,可
09/22 21:26, 35F

09/22 21:27, , 36F
是我看的那篇論文就是在sigmoid後,把0.5以上視為1
09/22 21:27, 36F

09/22 21:32, , 37F
如果v大認為我是紅綠藍三色編碼012那樣的話,其實我不是,
09/22 21:32, 37F

09/22 21:33, , 38F
我輸入的類別資料是經過TF-IDF及NGD計算轉化過的
09/22 21:33, 38F

09/22 22:52, , 39F
loss = tf.reduce_mean(tf.reduce_sum((ys - prediction)))
09/22 22:52, 39F

09/22 22:52, , 40F
這是你執行時的loss function嗎?
09/22 22:52, 40F

09/22 22:53, , 41F
是的,我之後應該會改掉,只是還沒確定怎改
09/22 22:53, 41F

09/22 22:53, , 42F
#loss = tf.reduce_sum( tf.square( ys - prediction ) )
09/22 22:53, 42F

09/22 22:54, , 43F
這個你註解的才是對的...
09/22 22:54, 43F

09/22 22:55, , 44F
loss function 錯掉,整個走鐘...
09/22 22:55, 44F

09/22 22:55, , 45F
嗯,註解是因為範例版是用reduce_mean,但我覺得怪怪的...
09/22 22:55, 45F

09/22 22:56, , 46F
所以刪除用用看,但沒看到明顯改善,所以就先註解了 >///<
09/22 22:56, 46F

09/22 22:59, , 47F
其實不只是沒有明顯改善...是用了根本無法訓練...
09/22 22:59, 47F

09/22 23:00, , 48F
目前看來應該是loss function問題...你用的顯然不對..
09/22 23:00, 48F

09/22 23:03, , 49F

09/22 23:04, , 50F
這是我現在正在嘗試的程式碼,跑成功時有83%準確率,但...
09/22 23:04, 50F

09/22 23:05, , 51F
不知為何常常跑不起來,可能是初始權重問吧...
09/22 23:05, 51F

09/22 23:05, , 52F
再看一下,應該改用對數概似函數當loss function.
09/22 23:05, 52F

09/22 23:07, , 53F
對tensorflow完全不熟,看起來很不習慣...
09/22 23:07, 53F

09/22 23:07, , 54F
好的,我會研究的 <3
09/22 23:07, 54F

09/22 23:08, , 55F
那...我等等多加一些註解(?
09/22 23:08, 55F

09/22 23:09, , 56F
可以改用keras做嗎?這些細節它會代處理...
09/22 23:09, 56F

09/22 23:13, , 57F
我跟組員討論過,可以,但還沒找到範例>"<
09/22 23:13, 57F

09/22 23:15, , 58F
你如果做二元分類的話,最簡單就是hidden用relu,ouput用
09/22 23:15, 58F

09/22 23:16, , 59F
softmax,loss 用cross entrophy....你不用自己寫loss的細
09/22 23:16, 59F

09/22 23:16, , 60F
節,很容易出錯...
09/22 23:16, 60F

09/22 23:17, , 61F
https://pastebin.com/ZDcwta2g 我加了些註解,說明每個
09/22 23:17, 61F

09/22 23:17, , 62F
區塊再做甚麼,希望這可以讓您閱讀方便些
09/22 23:17, 62F

09/22 23:21, , 63F
嗯,等我研究好keras,應該就會用他了>////<
09/22 23:21, 63F

09/22 23:28, , 64F
我覺得你的問題,在於loss function及activvation function
09/22 23:28, 64F

09/22 23:30, , 65F
的選擇,剛又看了一下,二元分類的話,activation用relu或
09/22 23:30, 65F

09/22 23:32, , 66F
sigmoid都可以,但sigmoid易有梯度消失, output用sigmoid,
09/22 23:32, 66F

09/22 23:33, , 67F
超過二元分類再用softmax, loss 用binary crossentropy
09/22 23:33, 67F

09/22 23:35, , 68F
這些在keras都有已寫好,直接套用即可,自己寫容易出錯..
09/22 23:35, 68F

09/22 23:36, , 69F
但是你得研究一下,activation,loss, optimizer怎麼搭才對
09/22 23:36, 69F

09/22 23:37, , 70F
嗯,只要審查委員不要再提奇怪意見,應該不會超過2元分類
09/22 23:37, 70F

09/22 23:37, , 71F
弄錯的話,結果就會有問題...
09/22 23:37, 71F

09/22 23:37, , 72F
,因為目前實驗只需要做是否的判斷
09/22 23:37, 72F

09/22 23:38, , 73F
P.S我已經載好keras了 -////-
09/22 23:38, 73F

09/22 23:39, , 74F
可以看一下keras文檔,應該比tensorflow好懂多了...
09/22 23:39, 74F


09/22 23:39, , 76F
目前正在讀這個>////<
09/22 23:39, 76F

09/22 23:41, , 77F
你的問題應該用sklearn的MLPClassifier處理就好了...
09/22 23:41, 77F

09/22 23:43, , 78F
嗯阿...我剛載好keras...用過有問題再研究sklearn好了>"<
09/22 23:43, 78F

09/22 23:51, , 79F
審查委員為何建議deep learning?
09/22 23:51, 79F

09/22 23:51, , 80F
資料不夠多也無法顯出deep learning的優勢...
09/22 23:51, 80F

09/22 23:54, , 81F
具體我跟教授都不知道,可能是因為我們的數據會慢慢長大吧
09/22 23:54, 81F

09/22 23:54, , 82F
那個評審委員很奇怪...只要我教授投一次論文,就算跟本實
09/22 23:54, 82F

09/22 23:55, , 83F
驗無關的論文,他都會特別提到這篇,說要做DL...
09/22 23:55, 83F

09/22 23:56, , 84F
甚至他還說我們廣而不精,所以...我教授就派我和組員來做
09/22 23:56, 84F

09/22 23:56, , 85F
DL了...
09/22 23:56, 85F

09/22 23:56, , 86F
唉,了解.......
09/22 23:56, 86F

09/22 23:58, , 87F
每天成長10~80比數據左右,如果改架構,可能一天提升上千
09/22 23:58, 87F

09/22 23:58, , 88F
到上萬筆數據,不過等熟了才會做大
09/22 23:58, 88F

09/23 00:00, , 89F
DL又不是萬靈丹,很多時候也沒比傳統SVM,RF,MLP好...
09/23 00:00, 89F

09/23 00:01, , 90F
若是有到萬筆以上,倒是可以試看看DL...
09/23 00:01, 90F

09/23 00:03, , 91F
是可以做到上萬筆,我們使用爬蟲每天再網路上抓資料,之後
09/23 00:03, 91F

09/23 00:04, , 92F
還會架相關實驗網站,那時候確實有機會
09/23 00:04, 92F

09/23 10:02, , 93F
最近 DL 很紅,很多教授都想做這塊,什麼都要搭上 AI,
09/23 10:02, 93F

09/23 10:02, , 94F
DL 不是萬靈丹,其實 ML 也很強,
09/23 10:02, 94F

09/23 10:17, , 95F
其實DL就是一種ML不是嘛?
09/23 10:17, 95F

09/23 13:26, , 96F
由此例看到ML不能只會看範例程式碼照搬XD機統的基礎還
09/23 13:26, 96F

09/23 13:26, , 97F
是很重要的
09/23 13:26, 97F

09/23 13:30, , 98F
ML 很多概念都跟迴歸有關 機統的基礎蠻重要的
09/23 13:30, 98F
文章代碼(AID): #1Pn0mnr8 (Python)
文章代碼(AID): #1Pn0mnr8 (Python)