摘要: 純NumPy代碼從頭實(shí)現(xiàn)簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò)。

Keras、TensorFlow以及PyTorch都是高級(jí)別的深度學(xué)習(xí)框架,可用于快速構(gòu)建復(fù)雜模型。前不久,我曾寫(xiě)過(guò)一篇文章,對(duì)神經(jīng)網(wǎng)絡(luò)是如何工作的進(jìn)行了簡(jiǎn)單的講解。該文章側(cè)重于對(duì)神經(jīng)網(wǎng)絡(luò)中運(yùn)用到的數(shù)學(xué)理論知識(shí)進(jìn)行詳解。本文將利用NumPy實(shí)現(xiàn)簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò),在實(shí)戰(zhàn)中對(duì)其進(jìn)行深層次剖析。最后,我們會(huì)利用分類問(wèn)題對(duì)模型進(jìn)行測(cè)試,并與Keras所構(gòu)建的神經(jīng)網(wǎng)絡(luò)模型進(jìn)行性能的比較。
Note:源碼可在我的GitHub中查看。

在正式開(kāi)始之前,需要先對(duì)所做實(shí)驗(yàn)進(jìn)行構(gòu)思。我們想要編寫(xiě)一個(gè)程序,使其能夠創(chuàng)建一個(gè)具有指定架構(gòu)(層的數(shù)量、大小以及激活函數(shù))的神經(jīng)網(wǎng)絡(luò),如圖一所示??傊?,我們需要預(yù)先對(duì)網(wǎng)絡(luò)進(jìn)行訓(xùn)練,然后利用它進(jìn)行預(yù)測(cè)。

上圖展示了神經(jīng)網(wǎng)絡(luò)在被訓(xùn)練時(shí)的工作流程。從中我們可以清楚的需要更新的參數(shù)數(shù)量以及單次迭代的不同狀態(tài)。構(gòu)建并管理正確的數(shù)據(jù)架構(gòu)是其中最困難的一環(huán)。由于時(shí)間限制,圖中所示的參數(shù)不會(huì)一一詳解,有興趣可點(diǎn)擊此處進(jìn)行了解。

神經(jīng)網(wǎng)絡(luò)層的初始化
首先,對(duì)每一層的權(quán)重矩陣W及偏置向量b進(jìn)行初始化。在上圖中,上標(biāo)[l]表示目前是第幾層(從1開(kāi)始),n的值表示一層中的神經(jīng)元數(shù)量。描述神經(jīng)網(wǎng)絡(luò)架構(gòu)的信息類似于Snippet 1中所列內(nèi)容。每一項(xiàng)都描述了單層神經(jīng)網(wǎng)絡(luò)的基本參數(shù):input_dim,即輸入層神經(jīng)元維度;output_dim,即輸出層神經(jīng)元維度;activation,即使用的激活函數(shù)。
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可看出,每一層輸出神經(jīng)元的維度等于下一層的輸入維度。對(duì)權(quán)重矩陣W及偏置向量b進(jìn)行初始化的代碼如下:
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
新聞熱點(diǎn)
疑難解答
圖片精選