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

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

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

使用NumPy實(shí)現(xiàn)前饋神經(jīng)網(wǎng)絡(luò)

CHANBAEK ? 來源:網(wǎng)絡(luò)整理 ? 2024-07-11 16:30 ? 次閱讀

要使用NumPy實(shí)現(xiàn)一個(gè)前饋神經(jīng)網(wǎng)絡(luò)(Feedforward Neural Network),我們需要從基礎(chǔ)開始構(gòu)建,包括初始化網(wǎng)絡(luò)參數(shù)、定義激活函數(shù)及其導(dǎo)數(shù)、實(shí)現(xiàn)前向傳播、計(jì)算損失函數(shù)、以及實(shí)現(xiàn)反向傳播算法來更新網(wǎng)絡(luò)權(quán)重和偏置。這里,我將詳細(xì)介紹一個(gè)包含單個(gè)隱藏層的前饋神經(jīng)網(wǎng)絡(luò)的實(shí)現(xiàn)。

一、引言

前饋神經(jīng)網(wǎng)絡(luò)是一種最基礎(chǔ)的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),其中信息只向前傳播,不形成循環(huán)。它通常由輸入層、若干隱藏層(至少一層)和輸出層組成。在這個(gè)實(shí)現(xiàn)中,我們將構(gòu)建一個(gè)具有一個(gè)隱藏層的前饋神經(jīng)網(wǎng)絡(luò),用于解決二分類問題。

二、準(zhǔn)備工作

首先,我們需要導(dǎo)入NumPy庫(kù),并定義一些基本的函數(shù),如激活函數(shù)及其導(dǎo)數(shù)。

import numpy as np  
  
def sigmoid(x):  
    """Sigmoid激活函數(shù)"""  
    return 1 / (1 + np.exp(-x))  
  
def sigmoid_derivative(x):  
    """Sigmoid激活函數(shù)的導(dǎo)數(shù)"""  
    return x * (1 - x)  
  
def mse_loss(y_true, y_pred):  
    """均方誤差損失函數(shù)"""  
    return np.mean((y_true - y_pred) ** 2)

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

接下來,我們定義網(wǎng)絡(luò)的結(jié)構(gòu),包括輸入層、隱藏層和輸出層的節(jié)點(diǎn)數(shù)。

input_size = 3  # 輸入層節(jié)點(diǎn)數(shù)  
hidden_size = 4  # 隱藏層節(jié)點(diǎn)數(shù)  
output_size = 1  # 輸出層節(jié)點(diǎn)數(shù)  
  
# 初始化權(quán)重和偏置  
np.random.seed(0)  # 為了可重復(fù)性設(shè)置隨機(jī)種子  
weights_input_to_hidden = np.random.randn(input_size, hidden_size) * 0.01  
bias_hidden = np.zeros((1, hidden_size))  
weights_hidden_to_output = np.random.randn(hidden_size, output_size) * 0.01  
bias_output = np.zeros((1, output_size))

四、前向傳播

前向傳播涉及將輸入數(shù)據(jù)通過網(wǎng)絡(luò)傳播到輸出層。

def forward_pass(X):  
    # 輸入層到隱藏層  
    hidden_layer_input = np.dot(X, weights_input_to_hidden) + bias_hidden  
    hidden_layer_output = sigmoid(hidden_layer_input)  
      
    # 隱藏層到輸出層  
    output_layer_input = np.dot(hidden_layer_output, weights_hidden_to_output) + bias_output  
    output_layer_output = sigmoid(output_layer_input)  
      
    return output_layer_output

五、反向傳播

反向傳播用于計(jì)算損失函數(shù)關(guān)于網(wǎng)絡(luò)參數(shù)的梯度,并據(jù)此更新這些參數(shù)。

def backward_pass(X, y_true, y_pred):  
    # 輸出層梯度  
    d_output = y_pred - y_true  
    d_output_wrt_output_input = sigmoid_derivative(y_pred)  
    d_hidden_to_output = d_output * d_output_wrt_output_input  
      
    # 更新輸出層權(quán)重和偏置  
    grad_weights_hidden_to_output = np.dot(hidden_layer_output.T, d_hidden_to_output)  
    grad_bias_output = np.sum(d_hidden_to_output, axis=0, keepdims=True)  
      
    # 隱藏層梯度  
    d_hidden = np.dot(d_hidden_to_output, weights_hidden_to_output.T)  
    d_hidden_wrt_hidden_input = sigmoid_derivative(hidden_layer_output)  
    d_input_to_hidden = d_hidden * d_hidden_wrt_hidden_input  
      
    # 更新輸入層到隱藏層的權(quán)重和偏置  
    grad_weights_input_to_hidden = np.dot(X.T, d_input_to_hidden)  
    grad_bias_hidden = np.sum(d_input_to_hidden, axis=0, keepdims=True)  
      
    return grad_weights_input_to_hidden, grad_bias_hidden, grad_weights_hidden_to_output, grad_bias_output  
  
def update_parameters(def update_parameters(learning_rate, grad_weights_input_to_hidden, grad_bias_hidden, grad_weights_hidden_to_output, grad_bias_output):  
    """  
    根據(jù)梯度更新網(wǎng)絡(luò)的權(quán)重和偏置。  
      
    Parameters:  
    - learning_rate: 浮點(diǎn)數(shù),學(xué)習(xí)率。  
    - grad_weights_input_to_hidden: 輸入層到隱藏層的權(quán)重梯度。  
    - grad_bias_hidden: 隱藏層的偏置梯度。  
    - grad_weights_hidden_to_output: 隱藏層到輸出層的權(quán)重梯度。  
    - grad_bias_output: 輸出層的偏置梯度。  
    """  
    global weights_input_to_hidden, bias_hidden, weights_hidden_to_output, bias_output  
      
    weights_input_to_hidden -= learning_rate * grad_weights_input_to_hidden  
    bias_hidden -= learning_rate * grad_bias_hidden  
    weights_hidden_to_output -= learning_rate * grad_weights_hidden_to_output  
    bias_output -= learning_rate * grad_bias_output  
  
# 示例數(shù)據(jù)  
X = np.array([[0.1, 0.2, 0.3], [0.4, 0.5, 0.6], [0.7, 0.8, 0.9]])  # 示例輸入  
y_true = np.array([[0], [1], [0]])  # 示例真實(shí)輸出(二分類問題,使用0和1表示)  
  
# 訓(xùn)練過程  
epochs = 10000  # 訓(xùn)練輪次  
learning_rate = 0.1  # 學(xué)習(xí)率  
  
for epoch in range(epochs):  
    # 前向傳播  
    y_pred = forward_pass(X)  
      
    # 計(jì)算損失  
    loss = mse_loss(y_true, y_pred)  
      
    # 如果需要,可以在這里打印損失值以監(jiān)控訓(xùn)練過程  
    if epoch % 1000 == 0:  
        print(f'Epoch {epoch}, Loss: {loss}')  
      
    # 反向傳播  
    grad_weights_input_to_hidden, grad_bias_hidden, grad_weights_hidden_to_output, grad_bias_output = backward_pass(X, y_true, y_pred)  
      
    # 更新參數(shù)  
    update_parameters(learning_rate, grad_weights_input_to_hidden, grad_bias_hidden, grad_weights_hidden_to_output, grad_bias_output)  
  
# 訓(xùn)練結(jié)束后,可以使用訓(xùn)練好的網(wǎng)絡(luò)進(jìn)行預(yù)測(cè)  
# ...

六、評(píng)估與預(yù)測(cè)

在上面的代碼中,我們僅打印了訓(xùn)練過程中的損失值來監(jiān)控訓(xùn)練過程。在實(shí)際應(yīng)用中,你還需要在訓(xùn)練結(jié)束后對(duì)模型進(jìn)行評(píng)估,并使用它來對(duì)新數(shù)據(jù)進(jìn)行預(yù)測(cè)。評(píng)估通常涉及在一個(gè)與訓(xùn)練集獨(dú)立的測(cè)試集上計(jì)算模型的性能指標(biāo),如準(zhǔn)確率、召回率、F1分?jǐn)?shù)等。

七、擴(kuò)展與改進(jìn)

  1. 增加隱藏層 :可以通過增加更多的隱藏層來擴(kuò)展網(wǎng)絡(luò),構(gòu)建更深的神經(jīng)網(wǎng)絡(luò)。
  2. 使用不同的激活函數(shù) :除了Sigmoid外,還可以使用ReLU、Tanh等激活函數(shù),它們?cè)诓煌膽?yīng)用場(chǎng)景中可能表現(xiàn)更好。
  3. 引入正則化 :為了防止過擬合,可以在損失函數(shù)中加入正則化項(xiàng),如L1正則化、L2正則化或Dropout(雖然在這里我們手動(dòng)實(shí)現(xiàn)了網(wǎng)絡(luò),但NumPy本身不提供內(nèi)置的Dropout支持,通常需要使用其他庫(kù)如TensorFlow或PyTorch來實(shí)現(xiàn))。
  4. 優(yōu)化算法 :除了基本的梯度下降法外,還可以使用更高效的優(yōu)化算法,如Adam、RMSprop等。
  5. 批處理與數(shù)據(jù)增強(qiáng) :為了進(jìn)一步提高模型的泛化能力,可以使用批處理來加速訓(xùn)練過程,并使用數(shù)據(jù)增強(qiáng)技術(shù)來增加訓(xùn)練數(shù)據(jù)的多樣性。

八、結(jié)論

通過上面的介紹,我們了解了如何使用NumPy從頭開始實(shí)現(xiàn)一個(gè)具有單個(gè)隱藏層的前饋神經(jīng)網(wǎng)絡(luò)。雖然這個(gè)實(shí)現(xiàn)相對(duì)簡(jiǎn)單,但它為理解更復(fù)雜的深度學(xué)習(xí)模型和框架(如TensorFlow和PyTorch)奠定了基礎(chǔ)。在實(shí)際應(yīng)用中,我們通常會(huì)使用這些框架來構(gòu)建和訓(xùn)練神經(jīng)網(wǎng)絡(luò),因?yàn)樗鼈兲峁┝烁嗟墓δ芎蛢?yōu)化。然而,了解底層的實(shí)現(xiàn)原理對(duì)于深入理解深度學(xué)習(xí)仍然是非常重要的。

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

    評(píng)論

    相關(guān)推薦

    神經(jīng)網(wǎng)絡(luò)教程(李亞非)

    神經(jīng)元  第3章 EBP網(wǎng)絡(luò)(反向傳播算法)  3.1 含隱層的網(wǎng)絡(luò)的學(xué)習(xí)規(guī)則  3.2 Sigmoid激發(fā)函數(shù)下的BP算法  3.3
    發(fā)表于 03-20 11:32

    【案例分享】基于BP算法的神經(jīng)網(wǎng)絡(luò)

    `BP神經(jīng)網(wǎng)絡(luò)首先給出只包含一個(gè)隱層的BP神經(jīng)網(wǎng)絡(luò)模型(兩層神經(jīng)網(wǎng)絡(luò)): BP神經(jīng)網(wǎng)絡(luò)其實(shí)由兩部分組成:
    發(fā)表于 07-21 04:00

    基于三層BP神經(jīng)網(wǎng)絡(luò)的圖像壓縮算法解析

    本文介紹了基于三層BP神經(jīng)網(wǎng)絡(luò)的圖像壓縮算法,提出了基于FPGA的實(shí)現(xiàn)驗(yàn)證方案,詳細(xì)討論了實(shí)現(xiàn)該壓縮
    發(fā)表于 05-06 07:01

    懲罰函數(shù)優(yōu)化的神經(jīng)網(wǎng)絡(luò)盲多用戶檢測(cè)

    提出一種神經(jīng)網(wǎng)絡(luò)盲多用戶檢測(cè)算法,利用神經(jīng)網(wǎng)絡(luò)替代原有檢測(cè)器中的濾波器,通過懲罰函數(shù)對(duì)約
    發(fā)表于 04-22 08:41 ?29次下載

    基于遞歸神經(jīng)網(wǎng)絡(luò)神經(jīng)網(wǎng)絡(luò)的深度學(xué)習(xí)預(yù)測(cè)算法

    蛋白質(zhì)二級(jí)結(jié)構(gòu)預(yù)測(cè)是結(jié)構(gòu)生物學(xué)中的一個(gè)重要問題。針對(duì)八類蛋白質(zhì)二級(jí)結(jié)構(gòu)預(yù)測(cè),提出了一種基于遞歸神經(jīng)網(wǎng)絡(luò)神經(jīng)網(wǎng)絡(luò)的深度學(xué)習(xí)預(yù)測(cè)算法。該算法通過雙向遞歸
    發(fā)表于 12-03 09:41 ?9次下載

    基于Numpy實(shí)現(xiàn)同態(tài)加密神經(jīng)網(wǎng)絡(luò)

    在分布式AI環(huán)境下,同態(tài)加密神經(jīng)網(wǎng)絡(luò)有助于保護(hù)商業(yè)公司知識(shí)產(chǎn)權(quán)和消費(fèi)者隱私。本文介紹了如何基于Numpy實(shí)現(xiàn)同態(tài)加密神經(jīng)網(wǎng)絡(luò)。
    的頭像 發(fā)表于 03-27 14:52 ?7847次閱讀
    基于<b class='flag-5'>Numpy</b><b class='flag-5'>實(shí)現(xiàn)</b>同態(tài)加密<b class='flag-5'>神經(jīng)網(wǎng)絡(luò)</b>

    基于Numpy實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò):反向傳播

    和DeepMind數(shù)據(jù)科學(xué)家、Udacity深度學(xué)習(xí)導(dǎo)師Andrew Trask一起,基于Numpy手寫神經(jīng)網(wǎng)絡(luò),更深刻地理解反向傳播這一概念。
    的頭像 發(fā)表于 04-01 09:29 ?5061次閱讀
    基于<b class='flag-5'>Numpy</b><b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>神經(jīng)網(wǎng)絡(luò)</b>:反向傳播

    BP神經(jīng)網(wǎng)絡(luò)概述

    BP 神經(jīng)網(wǎng)絡(luò)是一類基于誤差逆向傳播 (BackPropagation, 簡(jiǎn)稱 BP) 算法的多層神經(jīng)網(wǎng)絡(luò),BP算法是迄今最成功的神經(jīng)網(wǎng)絡(luò)
    的頭像 發(fā)表于 06-19 15:17 ?4.4w次閱讀
    BP<b class='flag-5'>神經(jīng)網(wǎng)絡(luò)</b>概述

    如何使用Numpy搭建神經(jīng)網(wǎng)絡(luò)

    很多同學(xué)入門機(jī)器學(xué)習(xí)之后,直接用TensorFlow調(diào)包實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò),對(duì)于神經(jīng)網(wǎng)絡(luò)內(nèi)在機(jī)理知之甚少。
    的頭像 發(fā)表于 05-18 11:02 ?3540次閱讀
    如何使用<b class='flag-5'>Numpy</b>搭建<b class='flag-5'>神經(jīng)網(wǎng)絡(luò)</b>

    bp神經(jīng)網(wǎng)絡(luò)還是反饋

    BP神經(jīng)網(wǎng)絡(luò),即反向傳播(Backpropagation)神經(jīng)網(wǎng)絡(luò),是一種神經(jīng)網(wǎng)絡(luò)(Feedforward Neural Network
    的頭像 發(fā)表于 07-03 10:16 ?410次閱讀

    人工神經(jīng)網(wǎng)絡(luò)模型的分類有哪些

    詳細(xì)介紹人工神經(jīng)網(wǎng)絡(luò)的分類,包括神經(jīng)網(wǎng)絡(luò)、卷積神經(jīng)網(wǎng)絡(luò)、循環(huán)神經(jīng)網(wǎng)絡(luò)、深度
    的頭像 發(fā)表于 07-05 09:13 ?759次閱讀

    神經(jīng)網(wǎng)絡(luò)的工作原理和應(yīng)用

    神經(jīng)網(wǎng)絡(luò)(Feedforward Neural Network, FNN),作為最基本且應(yīng)用廣泛的一種人工神經(jīng)網(wǎng)絡(luò)模型,其工作原理和結(jié)構(gòu)對(duì)于理解深度學(xué)習(xí)及人工智能領(lǐng)域至關(guān)重要。本文
    的頭像 發(fā)表于 07-08 11:28 ?1163次閱讀

    深度神經(jīng)網(wǎng)絡(luò)中的過程

    深度神經(jīng)網(wǎng)絡(luò)(Deep Neural Networks,DNNs)中的過程是其核心操作之一,它描述了數(shù)據(jù)從輸入層通過隱藏層最終到達(dá)輸出層的過程,期間不涉及任何反向傳播或權(quán)重調(diào)整。這一過程是
    的頭像 發(fā)表于 07-08 17:29 ?249次閱讀

    全連接神經(jīng)網(wǎng)絡(luò)神經(jīng)網(wǎng)絡(luò)的比較

    Neural Network, FCNN)和神經(jīng)網(wǎng)絡(luò)(Feedforward Neural Network, FNN)因其結(jié)構(gòu)簡(jiǎn)單、易于理解和實(shí)現(xiàn),成為了研究者們關(guān)注的熱點(diǎn)。本文
    的頭像 發(fā)表于 07-09 10:31 ?7768次閱讀

    神經(jīng)網(wǎng)絡(luò)的基本結(jié)構(gòu)和常見激活函數(shù)

    神經(jīng)網(wǎng)絡(luò)(Feedforward Neural Network, FNN)是人工神經(jīng)網(wǎng)絡(luò)中最基本且廣泛應(yīng)用的一種結(jié)構(gòu),其結(jié)構(gòu)簡(jiǎn)單、易于理解,是深度學(xué)習(xí)領(lǐng)域中的基石。FNN通過多層節(jié)
    的頭像 發(fā)表于 07-09 10:31 ?348次閱讀