主頁 >  其他 > 用Python從頭開始構建神經網路

用Python從頭開始構建神經網路

2020-10-24 23:34:45 其他

作者|Rashida Nasrin Sucky
編譯|VK
來源|Medium

神經網路已經被開發用來模擬人腦,雖然我們還沒有做到這一點,但神經網路在機器學習方面是非常有效的,它在上世紀80年代和90年代很流行,最近越來越流行,計算機的速度足以在合理的時間內運行一個大型神經網路,在本文中,我將討論如何實作一個神經網路,

我建議你仔細閱讀“神經網路的思想”部分,但如果你不太清楚,不要擔心,可以轉到實作部分,我把它分解成更小的碎片幫助理解,

神經網路的作業原理

在一個簡單的神經網路中,神經元是基本的計算單元,它們獲取輸入特征并將其作為輸出,以下是基本神經網路的外觀:

這里,“layer1”是輸入特征,“Layer1”進入另一個節點layer2,最后輸出預測的類或假設,layer2是隱藏層,可以使用多個隱藏層,

你必須根據你的資料集和精度要求來設計你的神經網路,

前向傳播

從第1層移動到第3層的程序稱為前向傳播,前向傳播的步驟:

  1. 為每個輸入特征初始化系數θ,比方說,我們有100個訓練例子,這意味著100行資料,在這種情況下,如果假設有10個輸入特征,我們的輸入矩陣的大小是100x10,現在確定\(θ_1\)的大小,行數需要與輸入特征的數量相同,在這個例子中,是10,列數應該是你選擇的隱藏層的大小,

  2. 將輸入特征X乘以相應的θ,然后添加一個偏置項,通過激活函式傳遞結果,

有幾個激活函式可用,如sigmoid,tanh,relu,softmax,swish

我將使用一個sigmoid激活函式來演示神經網路,

這里,“a”代表隱藏層或第2層,b表示偏置,

g(z)是sigmoid激活函式:

  1. 為隱藏層初始化\(\theta_2\),大小將是隱藏層的長度乘以輸出類的數量,在這個例子中,下一層是輸出層,因為我們沒有更多的隱藏層,

  2. 然后我們需要按照以前一樣的流程,將θ和隱藏層相乘,通過sigmoid激活層得到預測輸出,

反向傳播

反向傳播是從輸出層移動到第二層的程序,在這個程序中,我們計算了誤差,

  1. 首先,從原始輸出y減去預測輸出,這就是我們的\(\delta_3\)

  1. 現在,計算\(\theta_2\)的梯度,將\(\delta_3\)乘以\(\theta_2\),乘以“\(a^2\)”乘以“\(1-a^2\)”,在下面的公式中,“a”上的上標2表示第2層,請不要把它誤解為平方,

  1. 用訓練樣本數m計算沒有正則化版本的梯度\(\delta\)

訓練網路

修正\(\delta\),將輸入特征乘以\(\delta_2\)乘以學習速率得到\(\theta_1\),請注意\(\theta_1\)的維度,

重復前向傳播和反向傳播的程序,并不斷更新引數,直到達到最佳成本,這是成本函式的公式,只是提醒一下,成本函式表明,預測離原始輸出變數有多遠,

如果你注意到的話,這個成本函式公式幾乎和邏輯回歸成本函式一樣,

神經網路的實作

我將使用Andrew Ng在Coursera的機器學習課程的資料集,請從以下鏈接下載資料集:

https://github.com/rashida048/Machine-Learning-With-Python/blob/master/ex3d1.xlsx

下面是一個逐步實作的神經網路,我鼓勵你自己運行每一行代碼并列印輸出以更好地理解它,

  1. 首先匯入必要的包和資料集,
import pandas as pd
import numpy as np
xls = pd.ExcelFile('ex3d1.xlsx')
df = pd.read_excel(xls, 'X', header = None)

這是資料集的前五行,這些是數字的像素值,

在這個資料集中,輸入和輸出變數被組織在單獨的excel表格中,讓我們匯入輸出變數:

y = pd.read_excel(xls, 'y', header=None)

這也是資料集的前五行,輸出變數是從1到10的數字,這個專案的目標是使用存盤在'df'中的輸入變數來預測數字,

  1. 求輸入輸出變數的維數
df.shape
y.shape

輸入變數或df的形狀為5000 x 400,輸出變數或y的形狀為5000 x 1,

  1. 定義神經網路

為了簡單起見,我們將只使用一個由25個神經元組成的隱藏層,

hidden_layer = 25

得到輸出類,

y_arr = y[0].unique()#輸出:
array([10,  1,  2,  3,  4,  5,  6,  7,  8,  9], dtype=int64)

正如你在上面看到的,有10個輸出類,

  1. 初始化θ和偏置

我們將隨機初始化層1和層2的θ,因為我們有三層,所以會有\(\theta_1\)\(\theta_2\)

\(\theta_1\)的維度:第1層的大小x第2層的大小

\(\theta_2\)的維度:第2層的大小x第3層的大小

從步驟2開始,“df”的形狀為5000 x 400,這意味著有400個輸入特征,所以,第1層的大小是400,當我們指定隱藏層大小為25時,層2的大小為25,我們有10個輸出類,所以,第3層的大小是10,

\(\theta_1\)的維度:400 x 25

\(\theta_2\)的維度:25×10

同樣,會有兩個隨機初始化的偏置b1和b2,

\(b_1\)的維度:第2層的大小(本例中為25)

\(b_1\)的維度:第3層的大小(本例中為10)

定義一個隨機初始化theta的函式:

def randInitializeWeights(Lin, Lout):
    epi = (6**1/2) / (Lin + Lout)**0.5
    w = np.random.rand(Lout, Lin)*(2*epi) -epi
    return w

使用此函式初始化theta

hidden_layer = 25
output =10
theta1 = randInitializeWeights(len(df.T), hidden_layer)
theta2 = randInitializeWeights(hidden_layer, output)
theta = [theta1, theta2]

現在,初始化我們上面討論過的偏置項:

b1 = np.random.randn(25,)
b2 = np.random.randn(10,)
  1. 實作前向傳播

使用前向傳播部分中的公式,

為了方便起見,定義一個函式來乘以θ和X

def z_calc(X, theta):
    return np.dot(X, theta.T)

我們也將多次使用激活函式,同樣定義一個函式

def sigmoid(z):
    return 1/(1+ np.exp(-z))

現在我將逐步演示正向傳播,首先,計算z項:

z1 =z_calc(df, theta1) + b1

現在通過激活函式傳遞這個z1,得到隱藏層

a1 = sigmoid(z1)

a1是隱藏層,a1的形狀是5000 x 25,重復相同的程序來計算第3層或輸出層

z2 = z_calc(a1, theta2) + b2
a2 = sigmoid(z2)

a2的形狀是5000 x 10,10列代表10個類,a2是我們的第3層或最終輸出,如果在這個例子中有更多的隱藏層,在從一個層到另一個層的程序中會有更多的重復步驟,這種利用輸入特征計算輸出層的程序稱為前向傳播,

l = 3  #層數
b = [b1, b2]
def hypothesis(df, theta):
    a = []
    z = []
    for i in range (0, l-1):
        z1 = z_calc(df, theta[i]) + b[i]
        out = sigmoid(z1)
        a.append(out)
        z.append(z1)
        df = out
    return out, a, z
  1. 實作反向傳播

這是反向計算梯度和更新θ的程序,在此之前,我們需要修改'y',我們在“y”有10個類,但我們需要將每個類在其列中分開,例如,針對第10類的列,我們將為10替換1,為其余類替換0,這樣我們將為每個類創建一個單獨的列,

y1 = np.zeros([len(df), len(y_arr)])
y1 = pd.DataFrame(y1)
for i in range(0, len(y_arr)):
    for j in range(0, len(y1)):
        if y[0][j] == y_arr[i]:
            y1.iloc[j, i] = 1
        else: 
            y1.iloc[j, i] = 0
y1.head()

之前我一步一步地演示了向前傳播,然后把所有的都放在一個函式中,我將對反向傳播做同樣的事情,使用上述反向傳播部分的梯度公式,首先計算\(\delta_3\),我們將使用前向傳播實作中的z1、z2、a1和a2,

del3 = y1-a2

現在使用以下公式計算delta2:

這里是delta2:

del2 = np.dot(del3, theta2) * a1*(1 - a1)

在這里我們需要學習一個新的概念,這是一個sigmoid梯度,sigmoid梯度的公式為:

如果你注意到了,這和delta公式中的a(1-a)完全相同,因為a是sigmoid(z),我們來寫一個關于sigmoid梯度的函式:

def sigmoid_grad(z):
    return sigmoid(z)*(1 - sigmoid(z))

最后,使用以下公式更新θ:

我們需要選擇一個學習率,我選了0.003,我鼓勵你嘗試使用其他學習率,看看它的表現:

theta1 = np.dot(del2.T, pd.DataFrame(a1)) * 0.003
theta2 = np.dot(del3.T, pd.DataFrame(a2)) * 0.003

這就是θ需要更新的方式,這個程序稱為反向傳播,因為它向后移動,在撰寫反向傳播函式之前,我們需要定義成本函式,因為我會把成本的計算也包括在反向傳播方法中,但它是可以添加到前向傳播中,或者可以在訓練網路時將其分開的,

def cost_function(y, y_calc, l):
    return (np.sum(np.sum(-np.log(y_calc)*y - np.log(1-y_calc)*(1-y))))/m

這里m是訓練實體的數量,綜合起來的代碼:

m = len(df)
def backpropagation(df, theta, y1, alpha):
    out, a, z = hypothesis(df, theta)
    delta = []
    delta.append(y1-a[-1])
    i = l - 2
    while i > 0:
        delta.append(np.dot(delta[-i], theta[-i])*sigmoid_grad(z[-(i+1)]))
        i -= 1
    theta[0] = np.dot(delta[-1].T, df) * alpha
    for i in range(1, len(theta)):
        theta[i] = np.dot(delta[-(i+1)].T, pd.DataFrame(a[0])) * alpha
    out, a, z = hypothesis(df, theta)
    cost = cost_function(y1, a[-1], 1)
    return theta, cost
  1. 訓練網路

我將用20個epoch訓練網路,我在這個代碼片段中再次初始化theta,

theta1 = randInitializeWeights(len(df.T), hidden_layer)
theta2 = randInitializeWeights(hidden_layer, output)
theta = [theta1, theta2]
cost_list = []
for i in range(20):
    theta, cost= backpropagation(df, theta, y1, 0.003)
    cost_list.append(cost)
cost_list

我使用了0.003的學習率并運行了20個epoch,但是請看文章末提供的GitHub鏈接,我有試著用不同的學習率和不同的epoch數訓練模型,

我們得到了每個epoch計算的成本,以及最終更新的θ,用最后的θ來預測輸出,

  1. 預測輸出并計算精度

只需使用假設函式并傳遞更新后的θ來預測輸出:

out, a, z = hypothesis(df, theta)

現在計算一下準確率,

accuracy= 0
for i in range(0, len(out)):
    for j in range(0, len(out[i])):
        if out[i][j] >= 0.5 and y1.iloc[i, j] == 1:
            accuracy += 1
accuracy/len(df)

準確率為100%,完美,對吧?但我們并不是一直都能得到100%的準確率,有時獲得70%的準確率是很好的,這取決于資料集,

恭喜!你剛剛開發了一個完整的神經網路!

以下是完整作業代碼的GitHub鏈接:

https://github.com/rashida048/Machine-Learning-With-Python/blob/master/NeuralNetworkFinal.ipynb

原文鏈接:https://medium.com/towards-artificial-intelligence/build-a-neural-network-from-scratch-in-python-f23848b5a7c6

歡迎關注磐創AI博客站:
http://panchuang.net/

sklearn機器學習中文官方檔案:
http://sklearn123.com/

歡迎關注磐創博客資源匯總站:
http://docs.panchuang.net/

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/189514.html

標籤:其他

上一篇:使用RetinaNet構建的人臉口罩探測器

下一篇:TF2目標檢測API

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more