91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

【連載】深度學(xué)習(xí)筆記1:利用numpy從零搭建一個(gè)神經(jīng)網(wǎng)絡(luò)

人工智能實(shí)訓(xùn)營(yíng) ? 2018-08-06 17:36 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群


很多人說(shuō)深度學(xué)習(xí)就是個(gè)黑箱子,把圖像預(yù)處理之后丟進(jìn) tensorflow 就能出來(lái)預(yù)測(cè)結(jié)果,簡(jiǎn)單有效又省時(shí)省力。但正如我在上一篇推送中所說(shuō),如果你已是一名功力純厚的深度學(xué)習(xí)工程師,這么做當(dāng)然沒(méi)問(wèn)題。但我想大多數(shù)人也和我一樣,都是走在學(xué)習(xí)深度學(xué)習(xí)的路上,一上來(lái)就上框架并沒(méi)有什么特別不妥之處,但總歸是對(duì)你理解深度學(xué)習(xí)的黑箱機(jī)制是了無(wú)裨益的。所以,我建議在學(xué)習(xí)深度學(xué)習(xí)的路上,從最簡(jiǎn)單的感知機(jī)開始寫起,一步一步捋清神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu),以至于激活函數(shù)怎么寫、采用何種損失函數(shù)、前向傳播怎么寫、后向傳播又怎么寫,權(quán)值如何迭代更新,都需要你自己去實(shí)現(xiàn)。若在一開始就直接調(diào)用框架,小的 demo 可以跑起來(lái),糊弄一時(shí),看起來(lái)就像是鳩摩智在內(nèi)力未到的情形下強(qiáng)行練習(xí)少林寺的 72 絕技,最后走火入魔。

無(wú)論你是在看那本深度學(xué)習(xí)的書,還是在學(xué)習(xí) Adrew NG 的 deeplearningai,或者是在cs231n ,對(duì)神經(jīng)網(wǎng)絡(luò)的基本理論了如指掌的你一定想親手用 python 來(lái)實(shí)現(xiàn)它。在不借助任何深度學(xué)習(xí)框架的基礎(chǔ)上,利用 python 的科學(xué)計(jì)算庫(kù) numpy 由最初級(jí)的感知機(jī)開始,從零搭建一個(gè)神經(jīng)網(wǎng)絡(luò)模型。

640?wx_fmt=png

感知機(jī)結(jié)構(gòu)


對(duì)于感知機(jī)模型、神經(jīng)網(wǎng)絡(luò)理論這里就不再敘述,相信在精通深度學(xué)習(xí)的你對(duì)此一定很熟練了。至于對(duì)于神經(jīng)網(wǎng)絡(luò)中的輸入層、隱藏層、輸出層、權(quán)重與偏置、激活函數(shù)、損失函數(shù)、前向傳播、反向傳播、權(quán)值更新、梯度下降、微積分中的鏈?zhǔn)角髮?dǎo)、方向梯度等概念,我也假設(shè)你很熟練了。所以,接下來(lái)就讓我們從零搭建一個(gè)最初級(jí)的神經(jīng)網(wǎng)絡(luò)模型。

在寫代碼前,必須先捋一下思路,咱們先要什么,然后再寫什么,你心中必須有個(gè)數(shù)。要從零開始寫一個(gè)神經(jīng)網(wǎng)絡(luò),通常的方法是:

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

  • 初始化模型參數(shù)

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


有了上面這個(gè)思路,我們就可以開始寫了。當(dāng)然了,本節(jié)是寫一個(gè)最簡(jiǎn)單的感知機(jī)模型,所以網(wǎng)絡(luò)結(jié)構(gòu)就無(wú)需特別定義。首先來(lái)定義我們的激活函數(shù),激活函數(shù)有很多種,這里我們使用大名鼎鼎的 sigmoid 函數(shù):


直接利用 numpy 進(jìn)行定義 sigmoid()

import numpy as np
def sigmoid(x): return 1 / (1 + np.exp(-x))

在無(wú)需定義網(wǎng)絡(luò)結(jié)構(gòu)的情形下,第二步我們就可以直接對(duì)模型參數(shù)進(jìn)行初始化。模型參數(shù)主要包括權(quán)值 w 和偏置 b ,這也是神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)過(guò)程要學(xué)的東西。繼續(xù)利用 numpy 對(duì)參數(shù)進(jìn)行初始化:

definitilize_with_zeros(dim):
w=np.zeros((dim,1))
b=0.0
#assert(w.shape==(dim,1))
#assert(isinstance(b,float)orisinstance(b,int))
returnw,b

接下來(lái)就要進(jìn)入模型的主體部分,執(zhí)行最后一步那個(gè)大的循環(huán)操作,這個(gè)循環(huán)中包括前向傳播和計(jì)算損失、反向傳播和權(quán)值更新。這也是神經(jīng)網(wǎng)絡(luò)訓(xùn)練過(guò)程中每一次需要迭代的部分。這里簡(jiǎn)單說(shuō)一下,很多初學(xué)者容易被這兩個(gè)概念繞住,前向傳播簡(jiǎn)單而言就是計(jì)算預(yù)測(cè) y 的過(guò)程,而后向傳播則是根據(jù)預(yù)測(cè)值和實(shí)際值之間的誤差不斷往回推更新權(quán)值和偏置的過(guò)程。

640?wx_fmt=jpeg

前后傳播與后向傳播

下面我們來(lái)定義一個(gè)大的前向傳播函數(shù),預(yù)測(cè)值y為模型從輸入到經(jīng)過(guò)激活函數(shù)處理后的輸出的結(jié)果。損失函數(shù)我們采用交叉熵?fù)p失,利用 numpy 定義如下函數(shù):

def propagate(w, b, X, Y):
  m = X.shape[1]
  A = sigmoid(np.dot(w.T, X) + b)
  cost = -1/m * np.sum(Y*np.log(A) + (1-Y)*np.log(1-A))

  dw = np.dot(X, (A-Y).T)/m
  db = np.sum(A-Y)/m  
assert(dw.shape == w.shape)
assert(db.dtype == float) cost = np.squeeze(cost)
assert(cost.shape == ()) grads = { 'dw': dw,
'db': db }

return grads, cost

在上面的前向傳播函數(shù)中,我們先是通過(guò)激活函數(shù)直接表示了感知機(jī)輸出的預(yù)測(cè)值,然后通過(guò)定義的交叉熵?fù)p失函數(shù)計(jì)算了損失,最后根據(jù)損失函數(shù)計(jì)算了權(quán)值 w 和偏置 b的梯度,將參數(shù)梯度結(jié)果以字典和損失一起作為函數(shù)的輸出進(jìn)行返回。這就是前向傳播的編寫思路。

接下來(lái)循環(huán)操作的第二步就是進(jìn)行反向傳播操作,計(jì)算每一步的當(dāng)前損失根據(jù)損失對(duì)權(quán)值進(jìn)行更新。同樣定義一個(gè)函數(shù) backward_propagation :

def backward_propagation(w, b, X, Y, num_iterations, learning_rate, print_cost=False):
  cost = []  
for i in range(num_iterations): grad, cost = propagate(w, b, X, Y) dw = grad['dw'] db = grad['db'] w = w - learing_rate * dw b = b - learning_rate * db
if i % 100 == 0: cost.append(cost)
if print_cost and i % 100 == 0: print("cost after iteration %i: %f" %(i, cost)) params
= {"dw": w,
"db": b } grads = {"dw": dw,
"db": db }

return params, grads, costs

在上述函數(shù)中,我們先是建立了一個(gè)損失列表容器,然后將前一步定義的前向傳播函數(shù)放進(jìn)去執(zhí)行迭代操作,計(jì)算每一步的當(dāng)前損失和梯度,利用梯度下降法對(duì)權(quán)值進(jìn)行更新,并用字典封裝迭代結(jié)束時(shí)的參數(shù)和梯度進(jìn)行返回。

如上所示,一個(gè)簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò)模型(感知機(jī))就搭建起來(lái)了。通常模型建好之后我們還需要對(duì)測(cè)試數(shù)據(jù)進(jìn)行預(yù)測(cè),所以我們也定義一個(gè)預(yù)測(cè)函數(shù) predict,將模型的概率輸出轉(zhuǎn)化為0/1值。

def predict(w, b, X):
  m = X.shape[1]
  Y_prediction = np.zeros((1, m))
  w = w.reshape(X.shape[0], 1)

  A = sigmoid(np.dot(w.T, X)+b)  
for i in range(A.shape[1]):
if A[:, i] > 0.5: Y_prediction[:, i] = 1 else: Y_prediction[:, i] = 0 assert(Y_prediction.shape == (1, m))
return Y_prediction

到這里整個(gè)模型算是寫完了,但是我們定義了這么多函數(shù),調(diào)用起來(lái)太麻煩,所以致力于要寫出 pythonic的代碼的你們肯定想對(duì)這些函數(shù)進(jìn)行一下簡(jiǎn)單的封裝:

def model(X_train, Y_train, X_test, Y_test, num_iterations = 2000, learning_rate = 0.5, print_cost = False):  # initialize parameters with zeros (≈ 1 line of code)
  w, b = initialize_with_zeros(X_train.shape[0])  # Gradient descent (≈ 1 line of code)
  parameters, grads, costs = backwize(w, b, X_train, Y_train, num_iterations, learning_rate, print_cost)  # Retrieve parameters w and b from dictionary "parameters"
  w = parameters["w"]
  b = parameters["b"]  # Predict test/train set examples (≈ 2 lines of code)
  Y_prediction_train = predict(w, b, X_train)
  Y_prediction_test = predict(w, b, X_test)  # Print train/test Errors
  print("train accuracy: {} %".format(100 - np.mean(np.abs(Y_prediction_train - Y_train)) * 100))
  print("test accuracy: {} %".format(100 - np.mean(np.abs(Y_prediction_test - Y_test)) * 100))

  d = {"costs": costs,    
"Y_prediction_test": Y_prediction_test, "Y_prediction_train" : Y_prediction_train, "w" : w, "b" : b,
"learning_rate" : learning_rate,
"num_iterations": num_iterations}
return d

如此這般一個(gè)簡(jiǎn)易的神經(jīng)網(wǎng)絡(luò)就被你用 numpy就寫出來(lái)了。現(xiàn)在社會(huì)浮躁,很多人學(xué)習(xí)都沒(méi)有耐心,總是抱著鳩摩智的心態(tài)想要一步登天。學(xué)習(xí)機(jī)器學(xué)習(xí)和深度學(xué)習(xí)方法很多,但我相信,只有對(duì)基本的算法原理每一步都捋清楚,每一步都用最基礎(chǔ)的庫(kù)去實(shí)現(xiàn),你成為一名優(yōu)秀的機(jī)器學(xué)習(xí)工程師只是時(shí)間問(wèn)題。加油吧各位!




聲明:本文內(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)投訴
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    神經(jīng)網(wǎng)絡(luò)的初步認(rèn)識(shí)

    日常生活中的智能應(yīng)用都離不開深度學(xué)習(xí),而深度學(xué)習(xí)則依賴于神經(jīng)網(wǎng)絡(luò)的實(shí)現(xiàn)。什么是神經(jīng)網(wǎng)絡(luò)?
    的頭像 發(fā)表于 12-17 15:05 ?323次閱讀
    <b class='flag-5'>神經(jīng)網(wǎng)絡(luò)</b>的初步認(rèn)識(shí)

    自動(dòng)駕駛中常提的卷積神經(jīng)網(wǎng)絡(luò)個(gè)啥?

    在自動(dòng)駕駛領(lǐng)域,經(jīng)常會(huì)聽到卷積神經(jīng)網(wǎng)絡(luò)技術(shù)。卷積神經(jīng)網(wǎng)絡(luò),簡(jiǎn)稱為CNN,是種專門用來(lái)處理網(wǎng)格狀數(shù)據(jù)(比如圖像)的深度學(xué)習(xí)模型。CNN在圖像
    的頭像 發(fā)表于 11-19 18:15 ?2072次閱讀
    自動(dòng)駕駛中常提的卷積<b class='flag-5'>神經(jīng)網(wǎng)絡(luò)</b>是<b class='flag-5'>個(gè)</b>啥?

    NMSIS神經(jīng)網(wǎng)絡(luò)庫(kù)使用介紹

    NMSIS NN 軟件庫(kù)是組高效的神經(jīng)網(wǎng)絡(luò)內(nèi)核,旨在最大限度地提高 Nuclei N 處理器內(nèi)核上的神經(jīng)網(wǎng)絡(luò)的性能并最??大限度地減少其內(nèi)存占用。 該庫(kù)分為多個(gè)功能,每個(gè)功能涵蓋特定類別
    發(fā)表于 10-29 06:08

    構(gòu)建CNN網(wǎng)絡(luò)模型并優(yōu)化的般化建議

    通過(guò)實(shí)踐,本文總結(jié)了構(gòu)建CNN網(wǎng)絡(luò)模型并優(yōu)化的般化建議,這些建議將會(huì)在構(gòu)建高準(zhǔn)確率輕量級(jí)CNN神經(jīng)網(wǎng)絡(luò)模型方面提供幫助。 1)避免單層神經(jīng)網(wǎng)絡(luò)
    發(fā)表于 10-28 08:02

    開始利用NMSIS庫(kù)搭建神經(jīng)網(wǎng)絡(luò)

    環(huán)境:Vivado2021.1、NucleiStudio_IDE_202102-win64 內(nèi)容:從開始利用NMSIS庫(kù)搭建神經(jīng)網(wǎng)絡(luò),這
    發(fā)表于 10-24 13:47

    在Ubuntu20.04系統(tǒng)中訓(xùn)練神經(jīng)網(wǎng)絡(luò)模型的些經(jīng)驗(yàn)

    模型。 我們使用MNIST數(shù)據(jù)集,訓(xùn)練個(gè)卷積神經(jīng)網(wǎng)絡(luò)(CNN)模型,用于手寫數(shù)字識(shí)別。旦模型被訓(xùn)練并保存,就可以用于對(duì)新圖像進(jìn)行推理和預(yù)測(cè)。要使用生成的模型進(jìn)行推理,可以按照以下步
    發(fā)表于 10-22 07:03

    CICC2033神經(jīng)網(wǎng)絡(luò)部署相關(guān)操作

    在完成神經(jīng)網(wǎng)絡(luò)量化后,需要將神經(jīng)網(wǎng)絡(luò)部署到硬件加速器上。首先需要將所有權(quán)重?cái)?shù)據(jù)以及輸入數(shù)據(jù)導(dǎo)入到存儲(chǔ)器內(nèi)。 在仿真環(huán)境下,可將其存于個(gè)文件,并在 Verilog 代碼中通過(guò) read
    發(fā)表于 10-20 08:00

    液態(tài)神經(jīng)網(wǎng)絡(luò)(LNN):時(shí)間連續(xù)性與動(dòng)態(tài)適應(yīng)性的神經(jīng)網(wǎng)絡(luò)

    1.算法簡(jiǎn)介液態(tài)神經(jīng)網(wǎng)絡(luò)(LiquidNeuralNetworks,LNN)是種新型的神經(jīng)網(wǎng)絡(luò)架構(gòu),其設(shè)計(jì)理念借鑒自生物神經(jīng)系統(tǒng),特別是秀
    的頭像 發(fā)表于 09-28 10:03 ?1197次閱讀
    液態(tài)<b class='flag-5'>神經(jīng)網(wǎng)絡(luò)</b>(LNN):時(shí)間連續(xù)性與動(dòng)態(tài)適應(yīng)性的<b class='flag-5'>神經(jīng)網(wǎng)絡(luò)</b>

    【「AI芯片:科技探索與AGI愿景」閱讀體驗(yàn)】+神經(jīng)形態(tài)計(jì)算、類腦芯片

    AI芯片不僅包括深度學(xué)細(xì)AI加速器,還有另外個(gè)主要列別:類腦芯片。類腦芯片是模擬人腦神經(jīng)網(wǎng)絡(luò)架構(gòu)的芯片。它結(jié)合微電子技術(shù)和新型神經(jīng)形態(tài)器件
    發(fā)表于 09-17 16:43

    如何在機(jī)器視覺(jué)中部署深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)

    1:基于深度學(xué)習(xí)的目標(biāo)檢測(cè)可定位已訓(xùn)練的目標(biāo)類別,并通過(guò)矩形框(邊界框)對(duì)其進(jìn)行標(biāo)識(shí)。 在討論人工智能(AI)或深度學(xué)習(xí)時(shí),經(jīng)常會(huì)出現(xiàn)“
    的頭像 發(fā)表于 09-10 17:38 ?900次閱讀
    如何在機(jī)器視覺(jué)中部署<b class='flag-5'>深度</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>神經(jīng)網(wǎng)絡(luò)</b>

    無(wú)刷電機(jī)小波神經(jīng)網(wǎng)絡(luò)轉(zhuǎn)子位置檢測(cè)方法的研究

    摘要:論文通過(guò)對(duì)無(wú)刷電機(jī)數(shù)學(xué)模型的推導(dǎo),得出轉(zhuǎn)角:與三相相電壓之間存在映射關(guān)系,因此構(gòu)建了個(gè)以三相相電壓為輸人,轉(zhuǎn)角為輸出的小波神經(jīng)網(wǎng)絡(luò)來(lái)實(shí)現(xiàn)轉(zhuǎn)角預(yù)測(cè),并采用改進(jìn)遺傳算法來(lái)訓(xùn)練網(wǎng)絡(luò)結(jié)
    發(fā)表于 06-25 13:06

    神經(jīng)網(wǎng)絡(luò)專家系統(tǒng)在電機(jī)故障診斷中的應(yīng)用

    摘要:針對(duì)傳統(tǒng)專家系統(tǒng)不能進(jìn)行自學(xué)習(xí)、自適應(yīng)的問(wèn)題,本文提出了基于種經(jīng)網(wǎng)絡(luò)專家系統(tǒng)的并步電機(jī)故障診斷方法。本文將小波神經(jīng)網(wǎng)絡(luò)和專家系統(tǒng)相結(jié)合,充分發(fā)揮了二者故障診斷的優(yōu)點(diǎn),很大程度上降低了對(duì)電機(jī)
    發(fā)表于 06-16 22:09

    神經(jīng)網(wǎng)絡(luò)RAS在異步電機(jī)轉(zhuǎn)速估計(jì)中的仿真研究

    眾多方法中,由于其結(jié)構(gòu)簡(jiǎn)單,穩(wěn)定性好廣泛受到人們的重視,且已被用于產(chǎn)品開發(fā)。但是MRAS仍存在在低速區(qū)速度估計(jì)精度下降和對(duì)電動(dòng)機(jī)參數(shù)變化非常敏感的問(wèn)題。本文利用神經(jīng)網(wǎng)絡(luò)的特點(diǎn),使估計(jì)更為簡(jiǎn)單、快速
    發(fā)表于 06-16 21:54

    基于FPGA搭建神經(jīng)網(wǎng)絡(luò)的步驟解析

    本文的目的是在個(gè)神經(jīng)網(wǎng)絡(luò)已經(jīng)通過(guò)python或者M(jìn)ATLAB訓(xùn)練好的神經(jīng)網(wǎng)絡(luò)模型,將訓(xùn)練好的模型的權(quán)重和偏置文件以TXT文件格式導(dǎo)出,然后通過(guò)python程序?qū)xt文件轉(zhuǎn)化為coe
    的頭像 發(fā)表于 06-03 15:51 ?1194次閱讀
    基于FPGA<b class='flag-5'>搭建</b><b class='flag-5'>神經(jīng)網(wǎng)絡(luò)</b>的步驟解析

    嵌入式AI技術(shù)之深度學(xué)習(xí):數(shù)據(jù)樣本預(yù)處理過(guò)程中使用合適的特征變換對(duì)深度學(xué)習(xí)的意義

    ? 作者:蘇勇Andrew 使用神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)機(jī)器學(xué)習(xí),網(wǎng)絡(luò)的每個(gè)層都將對(duì)輸入的數(shù)據(jù)做次抽象,多層神經(jīng)網(wǎng)絡(luò)構(gòu)成
    的頭像 發(fā)表于 04-02 18:21 ?1516次閱讀