上一篇文章我們介紹了通過神經網絡來處理一個非線性回歸的問題,這次我們将采用神經網絡來處理一個多元分類的問題。
這次我們解決這樣一個問題:輸入一個人的身高和體重的資料,程式判斷出這個人的身材狀況,一共三個類别:偏瘦、正常、偏胖。
處理流程如下:
1、收集資料
2、建構神經網絡
3、訓練網絡
4、儲存和消費模型
詳細步驟如下:
對于一個複雜的業務資料,在實際應用時應該是通過收集取得資料,本文的重點不在資料收集,是以我們将制造一批标準資料來進行學習。
關于人體的胖瘦問題,有一個BMI算法,即:BMI=weight / (height * height),當BMI小于18時,認為偏瘦,當BMI大于28時,認為偏胖,18到28之間,認為正常。
首先随機生成身高和體重的資料,然後計算BMI值,并對結果進行标記,其中,偏瘦标記為0,正常标記為1,偏胖标記為2 。代碼如下:
相對于簡單的非線性模型,本次的網絡結構會稍微複雜一些:
// 網絡參數
int num_features = 2; // data features
int num_classes = 3; // total output
首先,本次包含兩層神經網絡,激活函數均采用RELU,輸出層激活函數采用Softmax函數。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5COxUzMwAjM0YTL3cDN1MjM0QTMxIjMxEjMwITLzkzM4EzLcJTMxIDMy8CXzkzM4EzLcd2bsJ2Lc12bj5ycn9Gbi52YuAjMwIzZtl2Lc9CX6MHc0RHaiojIsJye.png)
和上一篇文章中的網絡結構相比看上去複雜很多,但其本質實際上差别不大,隻是多了一個Softmax函數。
請注意觀察3個Output節點,如果隻是看其中一個節點的話,它實際上就是一個普通的非線性模型。
由于1、2、3三個節點的資料之和不一定等于1,Softmax函數的目的就是要使得最終輸出的三個數字之和為1,這樣數字本身就可以表示機率了。其計算方法也非常簡單:
最後我們看一下這個網絡的摘要資訊:
第一層網絡的訓練參數數量:(2+1)*64=192
第二層網絡的訓練參數數量:(64+1)*64=4160
輸出層網絡的訓練參數數量:(64+1)*3=195
這裡注意一點:損失函數采用稀疏分類交叉熵(SparseCategoricalCrossentropy)方法,對于分類任務,大部分時候都是采用分類交叉熵方法作為損失函數。
下面為二值交叉熵的實作公式:
可以不用看公式,簡單了解交叉熵的含義:就是如果标記值為1時預測值接近1 或 标記值為0時預測值接近0 則損失函數的值就會比較小。
比如标記值為[1,0,0],預測值為[0.99,0.01,0],則損失比較小,反之,如果預測值為[0.1,0.1,0.8],則損失比較大。
下面時一個二值交叉熵的實作方法:
稀疏分類交叉熵和二值交叉熵的差別在于:二值交叉熵需要對标記結果進行獨熱編碼(one-hot),而稀疏分類交叉熵則不需要。
前面提到,我們對分類結果進行标記,其中,偏瘦标記為0,正常标記為1,偏胖标記為2;而采用二值交叉熵進行計算時,偏瘦标記為[1,0,0],正常标記為[0,1,0],偏胖标記為[0,0,1] 。
訓練完成後,我們通過消費這個模型來檢查模型的準确性。
下面為測試結果:
随便看兩條資料:當BMI為30.5時,預測結果為[0,0.0016,0.9983];當BMI為12.5時,預測結果為:[1,0,0],可見結果還是準确的。
全部代碼如下:
View Code
【相關資源】
源碼:Git: https://gitee.com/seabluescn/tf_not.git
項目名稱:NN_MultipleClassification_BMI
目錄:檢視TensorFlow.NET機器學習入門系列目錄
簽名區:
如果您覺得這篇部落格對您有幫助或啟發,請點選右側【推薦】支援,謝謝!