摘要: 純NumPy代碼從頭實現簡單的神經網絡。
Keras、TensorFlow以及PyTorch都是高級別的深度學習框架,可用于快速構建復雜模型。前不久,我曾寫過一篇文章,對神經網絡是如何工作的進行了簡單的講解。該文章側重于對神經網絡中運用到的數學理論知識進行詳解。本文將利用NumPy實現簡單的神經網絡,在實戰中對其進行深層次剖析。最后,我們會利用分類問題對模型進行測試,并與Keras所構建的神經網絡模型進行性能的比較。
Note:源碼可在我的GitHub中查看。
在正式開始之前,需要先對所做實驗進行構思。我們想要編寫一個程序,使其能夠創建一個具有指定架構(層的數量、大小以及激活函數)的神經網絡,如圖一所示。總之,我們需要預先對網絡進行訓練,然后利用它進行預測。
上圖展示了神經網絡在被訓練時的工作流程。從中我們可以清楚的需要更新的參數數量以及單次迭代的不同狀態。構建并管理正確的數據架構是其中最困難的一環。由于時間限制,圖中所示的參數不會一一詳解,有興趣可點擊此處進行了解。
神經網絡層的初始化
首先,對每一層的權重矩陣W及偏置向量b進行初始化。在上圖中,上標[l]表示目前是第幾層(從1開始),n的值表示一層中的神經元數量。描述神經網絡架構的信息類似于Snippet 1中所列內容。每一項都描述了單層神經網絡的基本參數:input_dim,即輸入層神經元維度;output_dim,即輸出層神經元維度;activation,即使用的激活函數。
nn_architecture = [ {"input_dim": 2, "output_dim": 4, "activation": "relu"}, {"input_dim": 4, "output_dim": 6, "activation": "relu"}, {"input_dim": 6, "output_dim": 6, "activation": "relu"}, {"input_dim": 6, "output_dim": 4, "activation": "relu"}, {"input_dim": 4, "output_dim": 1, "activation": "sigmoid"},]
Snippet 1.
從Snippet 1可看出,每一層輸出神經元的維度等于下一層的輸入維度。對權重矩陣W及偏置向量b進行初始化的代碼如下:
def init_layers(nn_architecture, seed = 99): np.random.seed(seed) number_of_layers = len(nn_architecture) params_values = {} for idx, layer in enumerate(nn_architecture): layer_idx = idx + 1 layer_input_size = layer["input_dim"] layer_output_size = layer["output_dim"] params_values['W' + str(layer_idx)] = np.random.randn( layer_output_size, layer_input_size) * 0.1 params_values['b' + str(layer_idx)] = np.random.randn( layer_output_size, 1) * 0.1 return params_values
新聞熱點
疑難解答