深度学习随笔
深度學習中 number of training epochs 中的,epoch 到底指什么?
首先復習下神經網絡的概念。 神經網絡由一些相互鏈接的“神經元”組成。每個“神經元”有相應的權重。 神經網絡的神奇之處就在于權重是通過訓練自動得出的。所謂訓練,就是讓神經網絡在訓練 數據集上跑一遍,看看損失函數的值怎么樣。如果損失函數的值足夠小,小到符合我們的需 求,那就說明神經網絡擬合得很好了,訓練大功告成了(實際上并非如此,因為僅僅知道擬 合得很好并不夠,我們還要知道神經網絡是不是擬合得太好了,也就是過擬合。所以還需要 用測試數據集來測試是否過擬合。不過這里就姑且就當訓練完成了把。)反之,如果損失函 數的值不夠小,那就還需要繼續訓練。 神經網絡在訓練數據集上跑一遍,稱為一次迭代(iteration)。 那么 epoch 又是怎么回事? 我們知道,簡單來說,深度學習就是很深很深的神經網絡(這一說法并不準確,但姑且 讓我們這么說),也就是說,有很多層,每層可能有很多神經元,結構也可能比較復雜。然 后相應的,數據集也可能比較大。那跑一遍(迭代)會比較慢。所以人們就想出了一個變通 的辦法,就是每次只使用數據集中的部分樣本,這個數目就稱為 batch size。 雖然只使用了部分樣本,但很多時候已經足以優化權重,降低損失函數了。這樣訓練效率高 很多,訓練時間也能縮短不少。 不過這樣一來,一次迭代就不一定完整跑遍數據集中的所有樣本了。那在比較的時候, 就不太方便直接比較迭代次數了。 比如,假設深度神經網絡 A 經過 32 次迭代損失函數的值足夠低了,而深度神經網絡 B 經過 16 次迭代損失函數的值足夠低了,但實際上,A 的 batch size 可能是 256,而 B 的 batch size 可能是 2048。所以直接比較 A 和 B 的迭代次數并沒有什么意義。 所以就又提出了 epoch 這個概念,指數據集中的所有樣本都跑過一遍。 那對于每次迭代都跑遍數據集中的樣本的情況,epoch 和迭代是一樣的。否則的話, epoch 就要換算。上面的例子中,假設數據集的樣本總數是 4096,那 A 的 1 個 epoch 就需 要 16 次迭代,而 B 的 1 個 epoch 只需要 2 次。也就是說,A 經過 2 個 epoch 就訓練好了, 而 B 需要 8 個 epoch。
參考-------http://www.360doc.com/content/18/0417/18/47852988_746429309.shtml-------
工程化開發
1.拿到深度學習項目需要考慮些什么?
圖片數據的處理(獲取數據、分析數據)
選擇模型、模型調優
●上線效果
●從系統吐出的錯誤中查找問題
●人臉識別問題。總不能識別的場景。燈光太強?太暗?人臉不正?
●圖片分類問題。把分類錯誤的圖片收集到,仔細觀察圖片,看是不是標簽了?過于模糊? .
●目標檢測問題。某些物體總是識別不出來。是不是目標太小了,太大了,太長了?
2.1數據預處理
去掉錯誤數據,采集數據通常可能采集回來錯誤的值,人工標注也容易標注錯誤,寧肯漏標也不要錯標,去除有爭議的數據(貓和hello kitty的對比),人類也無法處理的數據(有些圖像的預測概率在0.5-0.6之間,理論上可能是這個圖像表現出不止一個類別,所以模型給他們分配了相同的概率),訓練的時候盡量多選擇特征明顯的圖片,偶爾加入一些不好分類的圖片也可以。如果數據集中大部分數據都是肉眼都不好分類的圖片的話,模型訓練的效果應該就是不好的。
2.2數據擴充
為什要數據擴充,就是數據量不夠。
數據是深度學習的糧食
數據量不夠—數據增強
數據分布不均衡----數據均衡
2.2.1簡單的數據擴充方式
1.水平翻轉(horizontally flipping):會使原數據集擴充-倍。
2.隨機摳取(random crops): -般用較大(約0.8-0.9倍原圖大小)的正方形在原圖隨機位置摳取圖像(image patch/crop),每張圖像摳取的次數決定了數據集擴充的倍數。
3.旋轉(rotating):將原圖旋轉一-定角度(-30°, 30°), 將經旋轉變換后的圖像作為擴充的訓練樣本加入原訓練集。
4.色彩抖動(color jittering):在RGB顏色空間對原有RGB色彩分布進行輕微的擾動,或在HSV顏色控件隨機改變原有圖像飽和度和明度或對色調進行微調。
在實踐中,往往會將上述幾種方式疊加使用。如此,便可將圖像數據擴充至原有數量的數倍甚至數十倍。
5.色彩抖動的其他預處理
●當我們獲取了足夠的訓練樣本后,在訓練前,還有些操作是必不可少的一步。
●比如:減均值操作。
●具體這樣操作:計算數據集的像素均值,然后讓訓練集、驗證集、測試集分別減去該均值。
●減均值操作的原理是,我們默認自然圖象是一類平穩的數據分布,此時從每個樣本.上減去數據的統計平均值可以移除共同部分,凸顯個體差異。
2.2.2其他的數據預處理方法
●對輸入特征做歸一化處理(normal ization)也是常見的預處理操作,同樣在圖像處理中可以將圖像的每個像素信息看作–種特征。
●在實踐中,對每個特征減去平均值來中心化數據的歸- -化處理方式稱為“中心式歸一化”(mean normal ization)。
●需要注意的是,實際操作中應首先劃分好訓練集,驗證集和測試集,該均值僅針對劃分后的訓練集計算,不可再未劃分的所有圖上計算,如此會違背機器學習的基本原理,即“在模型訓練過程中能且僅能從訓練集中獲取信息”。
樣本不均衡的弊端
●經典算法通常假設各類數據是均衡(平衡)的,即每個類別的樣本數量是-樣多的●然而,實際工程多數情況樣本是不均衡的
●不均衡導致泛化能力弱:
●訓練出的模型只會重視樣本多的類別
●輕視樣本少數的類別
●比喻:
●上高中偏科,總數學,偶爾學英語
●高考的時候英語也是要考的
●極端的例子:
●二分類問題:訓練集中,正例( 99個少, 負例:/1個
●分類器只要放棄負例的預測就可以獲得99%的正確率●二分類問題:訓練集中,正例: 1個,負例: 99個
●分類器只有1%的正確率,這個分類器沒法用
樣本不均衡的應對—把數據數量拉平
●樣本數量過少的想辦法擴充數量(_上采樣)
●直接復制類別較少的圖片
●數據擴充的方式
●樣本數量過多的想辦法減少數量(下采樣)
●有針對性的挑選圖片進行訓練
下采樣
下采樣不是丟棄圖片(數據是寶貴的資源,仍數據就像扔錢)
正例和負例的比例為5:1
那么不是簡單的丟棄4張正例,使得圖片比例變為1:1而是每輪訓練的時候從5個中隨機抽取一張貓,多輪訓練
遷移學習
Layer Normalization 與Batch Normalization的區別:LN是在輸入神經元之前就計算了均值和方差,BN是對同一批的數據計算均值和方差。
簡單的來說就是BN和LN進行處理的方向不同。對于BN來說,batch_size大小不同,那么它對應的BN出來的mean和std都是變化的,上圖中batch_size=3,均值是mean=3,std=3(第0維度),當batch_size不是3的時候,那么均值和方差就會改變;而LN隨著batch_size的不同對應單條樣本的均值和方差不同——————BN對batch比較敏感,batch_size不能太小;LN則是獨立于batch_size的———就可以這么理解。參考:關于batch normalization和layer normalization的理解
如果前面有學過Batch Normalization,則會發現其實Layer Normalization并沒有什么新奇的地方,只是兩者計算均值和標準差的對象不一樣。最后還是總結一下:
Layer Normalization可以提高模型的訓練速度和精度,使得模型更加穩健。
Layer Normalization可以適用于單樣本的情況,在RNN中效果比Batch Normalization更優。
參考:Layer Normalization原理介紹
總結
- 上一篇: 数据库ER图怎么画
- 下一篇: 如何在Python中删除字符串中的所有反