0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

搭建一個(gè)神經(jīng)網(wǎng)絡(luò)的基本思路和步驟

lviY_AI_shequ ? 來(lái)源:未知 ? 作者:李倩 ? 2018-07-26 17:22 ? 次閱讀

筆記1中我們利用 numpy 搭建了神經(jīng)網(wǎng)絡(luò)最簡(jiǎn)單的結(jié)構(gòu)單元:感知機(jī)。筆記2將繼續(xù)學(xué)習(xí)如何手動(dòng)搭建神經(jīng)網(wǎng)絡(luò)。我們將學(xué)習(xí)如何利用 numpy 搭建一個(gè)含單隱層的神經(jīng)網(wǎng)絡(luò)。單隱層顧名思義,即僅含一個(gè)隱藏層的神經(jīng)網(wǎng)絡(luò),抑或是成為兩層網(wǎng)絡(luò)。

繼續(xù)回顧一下搭建一個(gè)神經(jīng)網(wǎng)絡(luò)的基本思路和步驟:

定義網(wǎng)絡(luò)結(jié)構(gòu)(指定輸出層、隱藏層、輸出層的大?。?/p>

初始化模型參數(shù)

循環(huán)操作:執(zhí)行前向傳播/計(jì)算損失/執(zhí)行后向傳播/權(quán)值更新

定義網(wǎng)絡(luò)結(jié)構(gòu)

假設(shè) X 為神經(jīng)網(wǎng)絡(luò)的輸入特征矩陣,y 為標(biāo)簽向量。則含單隱層的神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)如下所示:

網(wǎng)絡(luò)結(jié)構(gòu)的函數(shù)定義如下:

def layer_sizes(X, Y): n_x = X.shape[0] # size of input layer n_h = 4 # size of hidden layer n_y = Y.shape[0] # size of output layer return (n_x, n_h, n_y)

其中輸入層和輸出層的大小分別與 X 和 y 的 shape 有關(guān)。而隱層的大小可由我們手動(dòng)指定。這里我們指定隱層的大小為4。

初始化模型參數(shù)

假設(shè) W1 為輸入層到隱層的權(quán)重?cái)?shù)組、b1 為輸入層到隱層的偏置數(shù)組;W2 為隱層到輸出層的權(quán)重?cái)?shù)組,b2 為隱層到輸出層的偏置數(shù)組。于是我們定義參數(shù)初始化函數(shù)如下:

def initialize_parameters(n_x, n_h, n_y): W1 = np.random.randn(n_h, n_x)*0.01 b1 = np.zeros((n_h, 1)) W2 = np.random.randn(n_y, n_h)*0.01 b2 = np.zeros((n_y, 1)) assert (W1.shape == (n_h, n_x)) assert (b1.shape == (n_h, 1)) assert (W2.shape == (n_y, n_h)) assert (b2.shape == (n_y, 1)) parameters = {"W1": W1, "b1": b1, "W2": W2, "b2": b2} return parameters

其中對(duì)權(quán)值的初始化我們利用了 numpy 中的生成隨機(jī)數(shù)的模塊 np.random.randn ,偏置的初始化則使用了 np.zero 模塊。通過(guò)設(shè)置一個(gè)字典進(jìn)行封裝并返回包含初始化參數(shù)之后的結(jié)果。

前向傳播

在定義好網(wǎng)絡(luò)結(jié)構(gòu)并初始化參數(shù)完成之后,就要開始執(zhí)行神經(jīng)網(wǎng)絡(luò)的訓(xùn)練過(guò)程了。而訓(xùn)練的第一步則是執(zhí)行前向傳播計(jì)算。假設(shè)隱層的激活函數(shù)為 tanh 函數(shù), 輸出層的激活函數(shù)為 sigmoid 函數(shù)。則前向傳播計(jì)算表示為:

定義前向傳播計(jì)算函數(shù)為:

def forward_propagation(X, parameters): # Retrieve each parameter from the dictionary "parameters" W1 = parameters['W1'] b1 = parameters['b1'] W2 = parameters['W2'] b2 = parameters['b2'] # Implement Forward Propagation to calculate A2 (probabilities) Z1 = np.dot(W1, X) + b1 A1 = np.tanh(Z1) Z2 = np.dot(W2, Z1) + b2 A2 = sigmoid(Z2) assert(A2.shape == (1, X.shape[1])) cache = {"Z1": Z1, "A1": A1, "Z2": Z2, "A2": A2} return A2, cache

從參數(shù)初始化結(jié)果字典里取到各自的參數(shù),然后執(zhí)行一次前向傳播計(jì)算,將前向傳播計(jì)算的結(jié)果保存到 cache 這個(gè)字典中, 其中 A2 為經(jīng)過(guò) sigmoid 激活函數(shù)激活后的輸出層的結(jié)果。

計(jì)算當(dāng)前訓(xùn)練損失

前向傳播計(jì)算完成后我們需要確定以當(dāng)前參數(shù)執(zhí)行計(jì)算后的的輸出與標(biāo)簽值之間的損失大小。與筆記1一樣,損失函數(shù)同樣選擇為交叉熵?fù)p失:

定義計(jì)算損失函數(shù)為:

def compute_cost(A2, Y, parameters): m = Y.shape[1] # number of example # Compute the cross-entropy cost logprobs = np.multiply(np.log(A2),Y) + np.multiply(np.log(1-A2), 1-Y) cost = -1/m * np.sum(logprobs) cost = np.squeeze(cost) # makes sure cost is the dimension we expect. assert(isinstance(cost, float)) return cost

執(zhí)行反向傳播

當(dāng)前向傳播和當(dāng)前損失確定之后,就需要繼續(xù)執(zhí)行反向傳播過(guò)程來(lái)調(diào)整權(quán)值了。中間涉及到各個(gè)參數(shù)的梯度計(jì)算,具體如下圖所示:

根據(jù)上述梯度計(jì)算公式定義反向傳播函數(shù):

def backward_propagation(parameters, cache, X, Y): m = X.shape[1] # First, retrieve W1 and W2 from the dictionary "parameters". W1 = parameters['W1'] W2 = parameters['W2'] # Retrieve also A1 and A2 from dictionary "cache". A1 = cache['A1'] A2 = cache['A2'] # Backward propagation: calculate dW1, db1, dW2, db2. dZ2 = A2-Y dW2 = 1/m * np.dot(dZ2, A1.T) db2 = 1/m * np.sum(dZ2, axis=1, keepdims=True) dZ1 = np.dot(W2.T, dZ2)*(1-np.power(A1, 2)) dW1 = 1/m * np.dot(dZ1, X.T) db1 = 1/m * np.sum(dZ1, axis=1, keepdims=True) grads = {"dW1": dW1, "db1": db1, "dW2": dW2, "db2": db2} return grads

將各參數(shù)的求導(dǎo)計(jì)算結(jié)果放入字典 grad 進(jìn)行返回。

這里需要提一下的是涉及到的關(guān)于數(shù)值優(yōu)化方面的知識(shí)。在機(jī)器學(xué)習(xí)中,當(dāng)所學(xué)問(wèn)題有了具體的形式之后,機(jī)器學(xué)習(xí)就會(huì)形式化為一個(gè)求優(yōu)化的問(wèn)題。不論是梯度下降法、隨機(jī)梯度下降、牛頓法、擬牛頓法,抑或是 Adam 之類的高級(jí)的優(yōu)化算法,這些都需要花時(shí)間掌握去掌握其數(shù)學(xué)原理。

權(quán)值更新

迭代計(jì)算的最后一步就是根據(jù)反向傳播的結(jié)果來(lái)更新權(quán)值了,更新公式如下:

由該公式可以定義權(quán)值更新函數(shù)為:

def update_parameters(parameters, grads, learning_rate = 1.2): # Retrieve each parameter from the dictionary "parameters" W1 = parameters['W1'] b1 = parameters['b1'] W2 = parameters['W2'] b2 = parameters['b2'] # Retrieve each gradient from the dictionary "grads" dW1 = grads['dW1'] db1 = grads['db1'] dW2 = grads['dW2'] db2 = grads['db2'] # Update rule for each parameter W1 -= dW1 * learning_rate b1 -= db1 * learning_rate W2 -= dW2 * learning_rate b2 -= db2 * learning_rate parameters = {"W1": W1, "b1": b1, "W2": W2, "b2": b2} return parameters

這樣,前向傳播-計(jì)算損失-反向傳播-權(quán)值更新的神經(jīng)網(wǎng)絡(luò)訓(xùn)練過(guò)程就算部署完成了。當(dāng)前了,跟筆記1一樣,為了更加 pythonic 一點(diǎn),我們也將各個(gè)模塊組合起來(lái),定義一個(gè)神經(jīng)網(wǎng)絡(luò)模型:

def nn_model(X, Y, n_h, num_iterations = 10000, print_cost=False): np.random.seed(3) n_x = layer_sizes(X, Y)[0] n_y = layer_sizes(X, Y)[2] # Initialize parameters, then retrieve W1, b1, W2, b2. Inputs: "n_x, n_h, n_y". Outputs = "W1, b1, W2, b2, parameters". parameters = initialize_parameters(n_x, n_h, n_y) W1 = parameters['W1'] b1 = parameters['b1'] W2 = parameters['W2'] b2 = parameters['b2'] # Loop (gradient descent) for i in range(0, num_iterations): # Forward propagation. Inputs: "X, parameters". Outputs: "A2, cache". A2, cache = forward_propagation(X, parameters) # Cost function. Inputs: "A2, Y, parameters". Outputs: "cost". cost = compute_cost(A2, Y, parameters) # Backpropagation. Inputs: "parameters, cache, X, Y". Outputs: "grads". grads = backward_propagation(parameters, cache, X, Y) # Gradient descent parameter update. Inputs: "parameters, grads". Outputs: "parameters". parameters = update_parameters(parameters, grads, learning_rate=1.2) # Print the cost every 1000 iterations if print_cost and i % 1000 == 0: print ("Cost after iteration %i: %f" %(i, cost)) return parameters

以上便是本節(jié)的主要內(nèi)容,利用 numpy 手動(dòng)搭建一個(gè)含單隱層的神經(jīng)網(wǎng)路。從零開始寫起,打牢基礎(chǔ),待到結(jié)構(gòu)熟練,原理吃透,再去接觸一些主流的深度學(xué)習(xí)框架才是學(xué)習(xí)深度學(xué)習(xí)的最佳途徑。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴

原文標(biāo)題:深度學(xué)習(xí)筆記2:手寫一個(gè)單隱層的神經(jīng)網(wǎng)絡(luò)

文章出處:【微信號(hào):AI_shequ,微信公眾號(hào):人工智能愛好者社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    【PYNQ-Z2試用體驗(yàn)】基于PYNQ的神經(jīng)網(wǎng)絡(luò)自動(dòng)駕駛小車 - 項(xiàng)目規(guī)劃

    ` 本帖最后由 楓雪天 于 2019-3-2 23:12 編輯 本次試用PYNQ-Z2的目標(biāo)作品是“基于PYNQ的神經(jīng)網(wǎng)絡(luò)自動(dòng)駕駛小車”。在之前的一個(gè)多月內(nèi),已經(jīng)完成了整個(gè)項(xiàng)目初步實(shí)現(xiàn),在接下來(lái)
    發(fā)表于 03-02 23:10

    卷積神經(jīng)網(wǎng)絡(luò)如何使用

    卷積神經(jīng)網(wǎng)絡(luò)(CNN)究竟是什么,鑒于神經(jīng)網(wǎng)絡(luò)在工程上經(jīng)歷了曲折的歷史,您為什么還會(huì)在意它呢? 對(duì)于這些非常中肯的問(wèn)題,我們似乎可以給出相對(duì)簡(jiǎn)明的答案。
    發(fā)表于 07-17 07:21

    【案例分享】ART神經(jīng)網(wǎng)絡(luò)與SOM神經(jīng)網(wǎng)絡(luò)

    今天學(xué)習(xí)了兩個(gè)神經(jīng)網(wǎng)絡(luò),分別是自適應(yīng)諧振(ART)神經(jīng)網(wǎng)絡(luò)與自組織映射(SOM)神經(jīng)網(wǎng)絡(luò)。整體感覺不是很難,只不過(guò)些最基礎(chǔ)的概念容易理解不
    發(fā)表于 07-21 04:30

    如何移植個(gè)CNN神經(jīng)網(wǎng)絡(luò)到FPGA中?

    訓(xùn)練個(gè)神經(jīng)網(wǎng)絡(luò)并移植到Lattice FPGA上,通常需要開發(fā)人員既要懂軟件又要懂?dāng)?shù)字電路設(shè)計(jì),是個(gè)不容易的事。好在FPGA廠商為我們提供了許多工具和IP,我們可以在這些工具和IP的
    發(fā)表于 11-26 07:46

    如何構(gòu)建神經(jīng)網(wǎng)絡(luò)?

    原文鏈接:http://tecdat.cn/?p=5725 神經(jīng)網(wǎng)絡(luò)種基于現(xiàn)有數(shù)據(jù)創(chuàng)建預(yù)測(cè)的計(jì)算系統(tǒng)。如何構(gòu)建神經(jīng)網(wǎng)絡(luò)神經(jīng)網(wǎng)絡(luò)包括:輸入層:根據(jù)現(xiàn)有數(shù)據(jù)獲取輸入的層隱藏層:使用反
    發(fā)表于 07-12 08:02

    如何使用Keras框架搭建個(gè)小型的神經(jīng)網(wǎng)絡(luò)多層感知器

    本文介紹了如何使用Keras框架,搭建個(gè)小型的神經(jīng)網(wǎng)絡(luò)-多層感知器,并通過(guò)給定數(shù)據(jù)進(jìn)行計(jì)算訓(xùn)練,最好將訓(xùn)練得到的模型提取出參數(shù),放在51單片機(jī)上進(jìn)行運(yùn)行。
    發(fā)表于 11-22 07:00

    輕量化神經(jīng)網(wǎng)絡(luò)的相關(guān)資料下載

    視覺任務(wù)中,并取得了巨大成功。然而,由于存儲(chǔ)空間和功耗的限制,神經(jīng)網(wǎng)絡(luò)模型在嵌入式設(shè)備上的存儲(chǔ)與計(jì)算仍然是個(gè)巨大的挑戰(zhàn)。前面幾篇介紹了如何在嵌入式AI芯片上部署神經(jīng)網(wǎng)絡(luò):【嵌入式AI
    發(fā)表于 12-14 07:35

    圖像預(yù)處理和改進(jìn)神經(jīng)網(wǎng)絡(luò)推理的簡(jiǎn)要介紹

    為提升識(shí)別準(zhǔn)確率,采用改進(jìn)神經(jīng)網(wǎng)絡(luò),通過(guò)Mnist數(shù)據(jù)集進(jìn)行訓(xùn)練。整體處理過(guò)程分為兩步:圖像預(yù)處理和改進(jìn)神經(jīng)網(wǎng)絡(luò)推理。圖像預(yù)處理主要根據(jù)圖像的特征,將數(shù)據(jù)處理成規(guī)范的格式,而改進(jìn)神經(jīng)網(wǎng)絡(luò)推理主要用于輸出結(jié)果。 整個(gè)過(guò)程分為兩
    發(fā)表于 12-23 08:07

    神經(jīng)網(wǎng)絡(luò)移植到STM32的方法

    神經(jīng)網(wǎng)絡(luò)移植到STM32最近在做的個(gè)項(xiàng)目需要用到網(wǎng)絡(luò)進(jìn)行擬合,并且將擬合得到的結(jié)果用作控制,就在想能不能直接在單片機(jī)上做神經(jīng)網(wǎng)絡(luò)計(jì)算,這
    發(fā)表于 01-11 06:20

    如何使用numpy搭建個(gè)卷積神經(jīng)網(wǎng)絡(luò)詳細(xì)方法和程序概述

    內(nèi)容將繼續(xù)秉承之前 DNN 的學(xué)習(xí)路線,在利用Tensorflow搭建神經(jīng)網(wǎng)絡(luò)之前,先嘗試?yán)胣umpy手動(dòng)搭建卷積神經(jīng)網(wǎng)絡(luò),以期對(duì)卷積神經(jīng)網(wǎng)絡(luò)
    的頭像 發(fā)表于 10-20 10:55 ?5980次閱讀

    用Python從頭實(shí)現(xiàn)個(gè)神經(jīng)網(wǎng)絡(luò)來(lái)理解神經(jīng)網(wǎng)絡(luò)的原理3

    個(gè)事情可能會(huì)讓初學(xué)者驚訝:神經(jīng)網(wǎng)絡(luò)模型并不復(fù)雜!『神經(jīng)網(wǎng)絡(luò)』這個(gè)詞讓人覺得很高大上,但實(shí)際上神經(jīng)網(wǎng)絡(luò)算法要比人們想象的簡(jiǎn)單。 這篇文章完全是為新手準(zhǔn)備的。我們會(huì)通過(guò)用Pytho
    的頭像 發(fā)表于 02-27 15:06 ?615次閱讀
    用Python從頭實(shí)現(xiàn)<b class='flag-5'>一</b><b class='flag-5'>個(gè)</b><b class='flag-5'>神經(jīng)網(wǎng)絡(luò)</b>來(lái)理解<b class='flag-5'>神經(jīng)網(wǎng)絡(luò)</b>的原理3

    卷積神經(jīng)網(wǎng)絡(luò)模型訓(xùn)練步驟

    模型訓(xùn)練是將模型結(jié)構(gòu)和模型參數(shù)相結(jié)合,通過(guò)樣本數(shù)據(jù)的學(xué)習(xí)訓(xùn)練模型,使得模型可以對(duì)新的樣本數(shù)據(jù)進(jìn)行準(zhǔn)確的預(yù)測(cè)和分類。本文將詳細(xì)介紹 CNN 模型訓(xùn)練的步驟。 CNN 模型結(jié)構(gòu) 卷積神經(jīng)網(wǎng)絡(luò)的輸入是
    的頭像 發(fā)表于 08-21 16:42 ?1498次閱讀

    卷積神經(jīng)網(wǎng)絡(luò)模型搭建

    卷積神經(jīng)網(wǎng)絡(luò)模型搭建 卷積神經(jīng)網(wǎng)絡(luò)模型是種深度學(xué)習(xí)算法。它已經(jīng)成為了計(jì)算機(jī)視覺和自然語(yǔ)言處理等各種領(lǐng)域的主流算法,具有很大的應(yīng)用前景。本篇文章將詳細(xì)介紹卷積
    的頭像 發(fā)表于 08-21 17:11 ?835次閱讀

    建立神經(jīng)網(wǎng)絡(luò)模型的三個(gè)步驟

    建立神經(jīng)網(wǎng)絡(luò)模型是個(gè)復(fù)雜的過(guò)程,涉及到多個(gè)步驟和細(xì)節(jié)。以下是對(duì)建立神經(jīng)網(wǎng)絡(luò)模型的三個(gè)主要
    的頭像 發(fā)表于 07-02 11:20 ?325次閱讀

    如何編寫個(gè)BP神經(jīng)網(wǎng)絡(luò)

    傳播過(guò)程,即誤差從輸出層反向傳播回輸入層,并據(jù)此調(diào)整網(wǎng)絡(luò)參數(shù)。本文將詳細(xì)闡述如何編寫個(gè)BP神經(jīng)網(wǎng)絡(luò),包括網(wǎng)絡(luò)結(jié)構(gòu)設(shè)計(jì)、前向傳播、損失函數(shù)計(jì)
    的頭像 發(fā)表于 07-11 16:44 ?245次閱讀