风机桨叶故障诊断(六) 利用自编码器进行特征学习
風機槳葉故障診斷(六) 利用自編碼器進行特征學習
? ? ?在之前的工作中,我已經初步構建了三層的BP神經網絡,并已經從樣本集的選取,模型的選擇(隱含層神經元個數),和輸出層神經元閾值選擇這幾個方面對槳葉的識別問題進行了優化。也得到了一些有用的結論:
? ? ?1.我們的算法需要更多的數據,更多的數據對于提高算法的表現是有效的。
? ? ?2.通過人為的控制神經網絡輸出層閾值可以降低誤識率(以增大漏識率為代價)。
? ? ?3.隱含層神經元個數選在25-100之間是最好的,更多的是無意義的反而會更糟,因為算法處于過擬合狀態(換句話說還是缺少樣本)。
? ? ?通過以上分析,我們已經知道了哪些努力可以提升算法的表現。但是當前這個項目還處于在實驗室測試算法的階段,樣本的問題目前是無法獲取更多了,閾值我們也已通過實驗選取了較為合理的數值。那么當前我們還能做些什么,來本質上的優化我們的算法,再之后再配合上更為好的樣本集的選取,以達到理想的識別效果呢?
? ? ?特征提取!!!
? ? ?我思考了許久,發現我們漏掉了一個提升算法的重要途徑,進行更好的特征提取。我之前完全默認在了對于圖像識別的特征選擇的一般方法中了,也就是選取圖像的所有像素點的取值作為輸入特征。雖然這是最普遍的做法,但是我們完全可以對原圖像進行特征提取,用更具代表性的輸入來訓練我們的神經網絡,下面就是思考如何進行特征提取了。
? ? ?首先想到的便是邊緣提取,用邊緣像素信息代替原圖像像素信息。不過我擔心邊緣提取后槳葉的信息只剩下兩條線,很可能受到識別現場輸電線的干擾。而且我們的算法目前已經處于過擬合狀態,能夠勝任較復雜的識別任務,只是還沒提供足夠的樣本,所以邊緣提取后損失大量的像素信息結果也許并不理想。(所有出現在我系列博文中的結論均是在得到實驗的結果后給出的,但是這段我單獨說明一下,只是我的猜測。相當于我在算法的優化上走到了一條多岔路口,有很多選擇,我分析這條路可能走不長久,便選了另一條路,幸運的是恰巧得到了很好的結果,所以就沒有再回過頭來驗證了我的這個想法對不對了)。
? ? ?沒有用邊緣提取進行特征的提取,我想到的是一種自學習特征的方法。前些日子在看Andrew Ng的關于深度學習的教程的過程中,接觸到了一個叫自編碼器或自編碼神經網絡的算法。利用它可以很好的自我學習特征,我將它在深度學習中的一點點思想挪用到了我的算法中,取得了蠻不錯的效果。下面來介紹下自編碼神經網絡:
? ? ?自編碼神經網絡是一種無監督學習算法,它使用了反向傳播算法,并讓目標值等于輸入值,比如??。也就是說,自編碼神經網絡與我們最熟悉的BP的區別僅僅在于它是個無監督學習算法,其實就是將輸出設為與輸入相同,傳播算法與傳遞函數(本問題選sigmoid函數即可)均是一樣的。下圖是一個自編碼神經網絡的拓撲結構示例(圖片來自Andrew Ng教程)。
? ? ?
? ? ?自編碼神經網絡嘗試學習一個??的函數。換句話說,它嘗試逼近一個恒等函數,從而使得輸出??接近于輸入??。恒等函數雖然看上去不太有學習的意義,但是當我們為自編碼神經網絡加入某些限制,比如限定隱藏神經元的數量,我們就可以從輸入數據中發現一些有趣的結構。舉例來說,假設某個自編碼神經網絡的輸入??是一張??圖像(共100個像素)的像素灰度值,于是??,其隱藏層??中有50個隱藏神經元。它必須從50維的隱藏神經元激活度向量??中重構出100維的像素灰度值輸入??。如果輸入數據中隱含著一些特定的結構,比如某些輸入特征是彼此相關的,那么這一算法就可以發現輸入數據中的這些相關性。
? ? 既然自編碼器可以從一些相關的輸入中發現其隱含著的特定結構并提取出來,我就想到用自編碼神經網絡為我們進行特征提取,對圖像像素值輸入進行提取。注意我們由自編碼器的特點可以看出,讓它從具有特定結構的輸入中提取才是有意義的。所以我的做法是,把正樣本集和負樣本集分別放入自編碼器進行訓練(注意是分別訓練)。
? ? 然后我們對于某一個樣本集(比如正樣本集)訓練完的結果,利用訓練得到的模型參數?(分別代表隱含層到輸入層連接權重矩陣,偏置神經元連接權重向量;輸出層到隱含層連接權重矩陣,偏置神經元連接權重向量),給定任意的輸入數據?,可以計算隱藏單元的激活量(activations)?。如前所述,相比原始輸入??來說,?可能是一個更好的特征描述。下圖的神經網絡描述了特征(激活量?)的計算。
? ??
? ? ?這實際上就是之前得到的稀疏自編碼器,在這里去掉了最后一層。對于負樣本集我們可以同樣的訓練完后去掉最后一層。我們是分著進行訓練的,這樣做相當于分別為正樣本和負樣本找到了更好的特征描述。然后我們可以將得到的結果進行整合,也就是將得到的權重矩陣合并到一起,這樣沒有改變任何東西,只是相當于兩個神經網絡整合成了一個,同時擁有了對正負樣本更好的特征表達。按照我的理解,當我們輸入一個正樣本時,用來訓練正樣本得到的那些隱含層神經元會表現的比較活躍,因為它們看到了熟悉的結構熟悉的小伙伴!~反過來負樣本是同理的,我認為這是自編碼器能夠發揮很好效果的所在。在實踐中,我正負樣本集上分別各訓練了含50個神經元的自編碼神經網絡,然后將其合在了一起。這樣,每當我得到了一幅圖片,我可以將其變換為一個100維的輸入向量,并且這個向量對于計算機來說是更好的特征表達。對于所有的樣本都做相同的處理,得到了新的特征提取后的樣本集。最后一步就是將新的樣本集輸入我們原來的算法進行訓練,我們來期待一下效果!
? ? 首先算法隨機展示了100個樣本,顯然人眼已經完全看不出圖像原來的內容和輪廓,但是我們可以明顯的將樣本分為兩類,這說明了我們的自編碼器很好的提取了計算機看起來更好的特征,如下圖所示:
? ? ? ? ?
? ? 然后開始訓練,最大迭代次數設置為1000次。最后的輸出結果如下:
-----------------------------------------------------------------------------
Iteration ? 998 | Cost: 7.793451e-01
Iteration ? 999 | Cost: 7.793416e-01
Iteration ?1000 | Cost: 7.793044e-01
Program paused. Press enter to continue.
Visualizing Neural Network...?
Program paused. Press enter to continue.
Training Set Accuracy: 86.571429
Test Set Accuracy: 80.402010
發生假陽性錯誤的概率(把一個負樣本估計成正樣本的概率): 0.000000
真陽性的概率(把一個正樣本估計成正樣本的概率): 38.095238
-----------------------------------------------------------------------------
? ? 對比之前沒有進行特征提取的結果,算法在訓練樣本集上的準確率有所下降(之前在90%偏上浮動),在測試樣本集上準確率明顯上升(之前的70%-75%)。這說明我們的算法對于輸入特性的更好的理解也一定程度解決了算法過擬合的問題,這確實是意外收獲!此外,我們之前說過,對于我們的具體問題,我們最關心的是發生假陽性錯誤的概率能否很低,而對正樣本的識別率可以放寬。優于神經網絡每次輸出結果都會有差異,為了結果的可靠性,我都是采用多次訓練并記錄結果。我找出了之前記錄的算法的表現記錄,列出如下表格進行對比:
| 普通BP神經網絡訓練結果 | 圖像進行特征提取后的BP神經網絡訓練結果 | ||
| 假陽性錯誤的概率 | 真陽性概率 | 假陽性錯誤的概率 | 真陽性概率 |
| 3.517588 | 14.070352 | 0 | 38.095238 |
| 4.020101 | 19.59799 | 2.068966 | 38.888889 |
| 4.522613 | 21.60804 | 2.919708 | 48.387097 |
| 5.025126 | 14.070352 | 1.41844 | 39.655172 |
| 4.522613 | 19.095477 | 0.675676 | 41.176471 |
? ? 由結果可以看出,由于算法對于輸入有了更好的認識,假陽性錯誤的概率進一步的降低,并且已經到了可以接受的范圍內了。同時正樣本的識別率也明顯的上升了,這也就給了我們通過修改輸出層閾值來減小假陽性錯誤的概率更大的空間(盡管已經很滿意了),因為正樣本的識別率已經遠超我們的預期要求了。
? ? 今天就到這里了,改進后的算法表現真的大超我的預期,真是太興奮了!今天進展很大,收獲很大,加油↖(^ω^)↗
總結
以上是生活随笔為你收集整理的风机桨叶故障诊断(六) 利用自编码器进行特征学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: S3C2440 lds链接脚本解析
- 下一篇: 外设驱动库开发笔记0:EPD总体设计