自己要搞深度學習,正好手上有本keras之父寫的深度學習書,於是就從keras入手吧。看了一個電影的二分類問題,確實很簡單,可以熟悉深度學習的流程。首先熟悉了結果keras的模塊,如model,Sequential等,這和numpy有什么區別嗎?沒有啊
有了keras框架,預處理圖片數據,構建網絡都很快,就像搭樂高積木一樣。但是我在做一個貓狗識別network時,准確率一直在50%,數據和參數和書上的差不多,但是人家是70%,這是為什么?如何提高准確率,這也是深度學習領域的一個重要問題,如何發現問題?數據預處理?網絡結構,網絡參數?可以觀察的數據只有loss和acc,所以設計神經網絡有時候還真是一個技術活,多多練習,掌握一些基本的經驗。
為什么很隨意的一個dnn網絡或者cnn網絡,mnist數據集的識別精度可以達到90%,而這樣區別明顯的二分類問題效果卻很差?看了數據集標注,沒什么問題。網絡結構也正常,不知道應該在哪里改進?然后看了kaggle上的一些競賽代碼,發現自己訓練的數據太少(或者說迭代次數太少),吧epoch和steps_per_epoch調整了一下,損失函數慢慢降低,但是任然很慢,之前的訓練都不到10分鍾,現在看得一上午時間。
在看到keras的高級深度學習實踐的過程中,有一個Embeding層對象沒有看懂,看了官網的api文檔也沒弄明白是什么意思。但是今天看了教科書的一些講解,有點一知半解。現在想來它就是一個自然語言處理中,將文本轉換為詞向量的一個工具,如果你的重點是cnn,cv方面,懂到這個程度就行了,畢竟效率很重要,不能荒廢了,做無用功,這就是一種學習能力的體現,不在無用的地方浪費自己的時間。
keras中一個好用的地方就是集成了已經訓練好的網絡,比如vgg16,可以看一下源碼和相關論文。
神經網絡原理:
1、神經網絡最基本的原理也是函數擬合,所以lose function就顯得非常重要了,我們訓練的目的之一就是減小損失函數,常用的損失函數參考:https://www.cnblogs.com/hypnus-ly/p/8047214.html,比如entropy_cross,比較兩個概率分布的差異,同時又使得反向傳播時好計算。
2、神經網絡訓練都是以一個batch為訓練單位,即一批一批的訓練,那么反向傳播時怎么計算導數呢?可以體會,這個batch軸對於w沒有什么影響,對於b有一些影響。只不過反向傳播時,loss function取均值。