天天看點

TensorFlow.NET機器學習入門【4】采用神經網絡處理分類問題

 上一篇文章我們介紹了通過神經網絡來處理一個非線性回歸的問題,這次我們将采用神經網絡來處理一個多元分類的問題。

這次我們解決這樣一個問題:輸入一個人的身高和體重的資料,程式判斷出這個人的身材狀況,一共三個類别:偏瘦、正常、偏胖。

處理流程如下:

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函數。

TensorFlow.NET機器學習入門【4】采用神經網絡處理分類問題

和上一篇文章中的網絡結構相比看上去複雜很多,但其本質實際上差别不大,隻是多了一個Softmax函數。 

請注意觀察3個Output節點,如果隻是看其中一個節點的話,它實際上就是一個普通的非線性模型。

由于1、2、3三個節點的資料之和不一定等于1,Softmax函數的目的就是要使得最終輸出的三個數字之和為1,這樣數字本身就可以表示機率了。其計算方法也非常簡單:

TensorFlow.NET機器學習入門【4】采用神經網絡處理分類問題

最後我們看一下這個網絡的摘要資訊:

TensorFlow.NET機器學習入門【4】采用神經網絡處理分類問題

第一層網絡的訓練參數數量:(2+1)*64=192

第二層網絡的訓練參數數量:(64+1)*64=4160

輸出層網絡的訓練參數數量:(64+1)*3=195

這裡注意一點:損失函數采用稀疏分類交叉熵(SparseCategoricalCrossentropy)方法,對于分類任務,大部分時候都是采用分類交叉熵方法作為損失函數。

下面為二值交叉熵的實作公式:

TensorFlow.NET機器學習入門【4】采用神經網絡處理分類問題

可以不用看公式,簡單了解交叉熵的含義:就是如果标記值為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] 。

訓練完成後,我們通過消費這個模型來檢查模型的準确性。

下面為測試結果:

TensorFlow.NET機器學習入門【4】采用神經網絡處理分類問題

  随便看兩條資料:當BMI為30.5時,預測結果為[0,0.0016,0.9983];當BMI為12.5時,預測結果為:[1,0,0],可見結果還是準确的。

全部代碼如下:

TensorFlow.NET機器學習入門【4】采用神經網絡處理分類問題
TensorFlow.NET機器學習入門【4】采用神經網絡處理分類問題

View Code

【相關資源】

 源碼:Git: https://gitee.com/seabluescn/tf_not.git

項目名稱:NN_MultipleClassification_BMI

目錄:檢視TensorFlow.NET機器學習入門系列目錄

簽名區:

如果您覺得這篇部落格對您有幫助或啟發,請點選右側【推薦】支援,謝謝!

繼續閱讀