http://c.biancheng.net/view/1924.html
Hornik 等人的工作(http://www.cs.cmu.edu/~bhiksha/courses/deeplearning/Fall.2016/notes/Sonia_Hornik.pdf)證明了一句話,“只有一個隱藏層的多層前饋網絡足以逼近任何函數,同時還可以保證很高的精度和令人滿意的效果。”
本節將展示如何使用多層感知機(MLP)進行函數逼近,具體來說,是預測波士頓的房價。第2章使用回歸技術對房價進行預測,現在使用 MLP 完成相同的任務。
准備工作
對於函數逼近,這里的損失函數是 MSE。輸入應該歸一化,隱藏層是 ReLU,輸出層最好是 Sigmoid。
下面是如何使用 MLP 進行函數逼近的示例:
- 導入需要用到的模塊:sklearn,該模塊可以用來獲取數據集,預處理數據,並將其分成訓練集和測試集;pandas,可以用來分析數據集;matplotlib 和 seaborn 可以用來可視化:
- 加載數據集並創建 Pandas 數據幀來分析數據:
- 了解一些關於數據的細節:
- 找到輸入的不同特征與輸出之間的關聯:
- 從前面的代碼中,可以看到三個參數 RM、PTRATIO 和 LSTAT 在幅度上與輸出之間具有大於 0.5 的相關性。選擇它們進行訓練。將數據集分解為訓練數據集和測試數據集。使用 MinMaxScaler 來規范數據集。
需要注意的一個重要變化是,由於神經網絡使用 Sigmoid 激活函數(Sigmoid 的輸出只能在 0~1 之間),所以還必須對目標值 Y 進行歸一化:
- 定義常量和超參數:
- 創建一個單隱藏層的多層感知機模型:
- 聲明訓練數據的占位符並定義損失和優化器:
- 執行計算圖:
解讀分析
在只有一個隱藏層的情況下,該模型在訓練數據集上預測房價的平均誤差為 0.0071。下圖顯示了房屋估價與實際價格的關系:

在這里,使用 TensorFlow 操作層(Contrib)來構建神經網絡層。這使得工作稍微容易一些,因為避免了分別為每層聲明權重和偏置。如果使用像 Keras 這樣的 API,工作可以進一步簡化。
下面是 Keras 中以 TensorFlow 作為后端的代碼:
前面的代碼給出了預測值和實際值之間的結果。可以看到,通過去除異常值(一些房屋價格與其他參數無關,比如最右邊的點),可以改善結果:
