RM新时代网站-首页

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

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

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

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

電子工程師 ? 來(lái)源:未知 ? 2019-05-18 11:02 ? 次閱讀

很多同學(xué)入門機(jī)器學(xué)習(xí)之后,直接用TensorFlow調(diào)包實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò),對(duì)于神經(jīng)網(wǎng)絡(luò)內(nèi)在機(jī)理知之甚少。

編程語(yǔ)言與技術(shù)框架變化更新非常之快,理解背后的原理才是王道。下面文摘菌和大家一起用Numpy實(shí)現(xiàn)一步一步實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)。

此篇文章旨在幫大家梳理神經(jīng)網(wǎng)絡(luò)知識(shí)點(diǎn),且此篇文章是第一部分,只是簡(jiǎn)單搭一個(gè)簡(jiǎn)單的框架。暫時(shí)不涉及梯度下降、學(xué)習(xí)率調(diào)參等知識(shí)點(diǎn)。

最簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò)包含三個(gè)要素,輸入層,隱藏層以及輸出層。關(guān)于其工作機(jī)理其完全可以類比成一個(gè)元函數(shù):Y=W*X+b。

一個(gè)簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò)可以理解為兩次一元函數(shù)的輸入和輸出。

第一次:Y1=A1(W1*X+b1) ,其中X是原始數(shù)據(jù)的輸入,A1代表激活函數(shù)。

第二次:Y2=A2(W2*Y1+b2),其中Y1是第一次的輸出,A2是激活函數(shù)。參數(shù)W1、W2、b1、b2原則上各不相同。

本篇文章我們用到的激活函數(shù)有兩個(gè),一個(gè)是tan(x),另一個(gè)是softmax。兩者的函數(shù)曲線如下。

兩個(gè)函數(shù)都有相同的特點(diǎn),即函數(shù)值在零點(diǎn)左右變化較大,當(dāng)輸入值遠(yuǎn)離零點(diǎn),其輸出較穩(wěn)定。

首先導(dǎo)入相關(guān)的庫(kù),需要兩個(gè)庫(kù),一個(gè)用于科學(xué)計(jì)算的Numpy,另一個(gè)是math。

importnumpyasnpimport math

然后定義激活函數(shù),

def tanh(x): return np.tanh(x)def softmax(x): exp=np.exp(x-x.max()) return exp/exp.sum()

這兩個(gè)激活函數(shù),其中tanh函數(shù),Numpy直接內(nèi)嵌。softmax根據(jù)數(shù)學(xué)定義進(jìn)行設(shè)置。第二個(gè)激活函數(shù)因?yàn)槭侵笖?shù)函數(shù),其值會(huì)變化較大,所以我們用x-x.max 縮小其變化范圍,這對(duì)結(jié)果不影響。

我們使用的圖片大小是 28*28像素。以后會(huì)用手寫數(shù)字?jǐn)?shù)據(jù)集訓(xùn)練網(wǎng)絡(luò),所以會(huì)有10個(gè)數(shù)字輸入,分別是[1,2,3,4,5,6,7,8,9,10]。所以要先定義三個(gè)列表。

dinensions=[28*28,10]activation=[tanh,softmax]distribution=[{'b':[0,0]},{'b':[0,0],'w':[-math.sqrt(6/(dinensions[0]+dinensions[1])),math.sqrt(6/(dinensions[0]+dinensions[1]))]}]

dinensions列表里面包含兩個(gè)數(shù),第一個(gè)是圖片的像素大小,第二個(gè)是數(shù)字的輸入變化量。

activation列表包含兩個(gè)激活函數(shù),分別為tanh,softmax。

distribution 列表里面對(duì)應(yīng)的是字典格式的數(shù)據(jù),分別對(duì)應(yīng)神經(jīng)網(wǎng)絡(luò)參數(shù)取值范圍。

其中第一層不包含參數(shù)W。

definit_parameters_b(layer):dist=distribution[layer]['b'] return np.random.rand(dinensions[layer])*(dist[1]-dist[0])+dist[0] #使得生成的隨機(jī)數(shù)在 b 的區(qū)間內(nèi)definit_parameters_w(layer):dist=distribution[layer]['w'] return np.random.rand(dinensions[layer-1],dinensions[layer])*(dist[1]-dist[0])+dist[0] #使得生成的隨機(jī)數(shù)在 b 的區(qū)間內(nèi)

上面代碼是對(duì)b和w這兩個(gè)參數(shù)初始化,因?yàn)槲覀冚斎氲氖?8*28個(gè)數(shù)字,輸出的是10個(gè)數(shù)字。所以第一層的 b 也有28*28個(gè)數(shù)字組成。根據(jù)矩陣的乘法規(guī)則,第二層的時(shí)候,w的維度只有是28*28行,10列才能滿足輸出的10個(gè)數(shù)字。因此第二層的b是10個(gè)數(shù)字。

dinensions[X] 意思是取切片,dinensions[1] 取得是10,dinensions[0],取得是28*28。

又因?yàn)閚p.random.rand()這一函數(shù)輸出值的范圍在[0,1],括號(hào)里面的參數(shù)(即dinensions[layer]只是確保輸出的數(shù)字個(gè)數(shù)滿足要求),所以為了讓輸出的值在一開始設(shè)置的 b 的區(qū)間內(nèi),我們?cè)O(shè)置先乘(dist[1]-dist[0])然后加上dist[0]。dist[1]和dist[0]分別對(duì)應(yīng)參數(shù)的上下限。

definit_parameters():parameters=[]foriinrange(len(distribution)):layer_parameters={}forjindistribution[i].keys():ifj=='b':layer_parameters['b']=init_parameters_b(i)continueifj=='w':layer_parameters['w']=init_parameters_w(i)continueparameters.append(layer_parameters) return parameters

上面代碼是將三個(gè)參數(shù)的初始化集成達(dá)到一個(gè)函數(shù)里面。

先定義一個(gè)空列表(不要寫錯(cuò)成空字典)是為了將三個(gè)參數(shù)統(tǒng)一輸出。

注:字典類型不能用append,列表可以用,列表.append(字典) 也是可以的。

然后從零開始遍歷distribution。用if循環(huán)語(yǔ)句,目的是把參數(shù)全部包含進(jìn)來(lái)。

第二層for循環(huán)和if語(yǔ)句是判斷,并正確添加參數(shù)。

parameters=init_parameters() #將參數(shù)賦值給新的變量。defpredict(img,parameters):I0_in=img+parameters[0]['b']I0_out=activation[0](I0_in)I1_in=np.dot(I0_out,parameters[1]['w']+parameters[1]['b'])I1_out=activation[1](I1_in) return I1_out

定義輸出函數(shù),思路是這樣的:輸入數(shù)據(jù)后,根據(jù)函數(shù):y=wx+b,進(jìn)行變換,第一層w全為1。然后經(jīng)過(guò)激活函數(shù)(第一個(gè)激活函數(shù)是tanh,所以用activation[0]),得出第一層的輸入I0_out。 然后進(jìn)入第二層,第一層的輸出作為輸入,根據(jù)函數(shù):y=wx+b,進(jìn)行變換,第二層的w為parameters[1]['w'],第二層的b為parameters[1]['b']。然后再經(jīng)過(guò)激活函數(shù)softmax,得到輸出。

predict(np.random.rand(784),parameters).argmax()

最后,隨便輸入一個(gè)784維數(shù)據(jù)(像素),都可以輸出一個(gè)圖片標(biāo)簽。

預(yù)測(cè)圖片中的數(shù)字

好了,我們第一個(gè)簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò)就搭建好了,關(guān)于如何使用梯度下降和學(xué)習(xí)率,如何訓(xùn)練網(wǎng)絡(luò)以及如何加載圖片數(shù)據(jù),我們?cè)谝院蟮奈恼轮袝?huì)介紹。

注:此篇文章受B站up主大野喵渣的啟發(fā),并參考了其代碼,感興趣的同學(xué)可以去B站觀看他關(guān)于神經(jīng)網(wǎng)絡(luò)的教學(xué)視頻。

聲明:本文內(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)題:TensorFlow什么的都弱爆了,強(qiáng)者只用Numpy搭建神經(jīng)網(wǎng)絡(luò)

文章出處:【微信號(hào):BigDataDigest,微信公眾號(hào):大數(shù)據(jù)文摘】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

      第1章 概述  1.1 人工神經(jīng)網(wǎng)絡(luò)研究與發(fā)展  1.2 生物神經(jīng)元  1.3 人工神經(jīng)網(wǎng)絡(luò)的構(gòu)成  第2章人工神經(jīng)網(wǎng)絡(luò)基本模型  2.1 MP模型  2.2 感知器模型  2.3
    發(fā)表于 03-20 11:32

    【PYNQ-Z2試用體驗(yàn)】神經(jīng)網(wǎng)絡(luò)基礎(chǔ)知識(shí)

    語(yǔ)言,使用numpy.dot方法即可計(jì)算矩陣乘法。 以上便是一個(gè)簡(jiǎn)單神經(jīng)網(wǎng)絡(luò)的基本原理,對(duì)神經(jīng)網(wǎng)絡(luò)有了基本的認(rèn)識(shí)之后,我們才能進(jìn)行復(fù)雜的神經(jīng)網(wǎng)絡(luò)設(shè)計(jì)。總結(jié)本文講解了
    發(fā)表于 03-03 22:10

    【PYNQ-Z2試用體驗(yàn)】基于PYNQ-Z2的神經(jīng)網(wǎng)絡(luò)圖形識(shí)別[結(jié)項(xiàng)]

    前言前面我們簡(jiǎn)單講解了神經(jīng)網(wǎng)絡(luò)的基本概念和工作原理,接下來(lái),將通過(guò)具體的python代碼來(lái)完成基于神經(jīng)網(wǎng)絡(luò)的圖形識(shí)別。這里使用手寫的數(shù)字圖像作為輸入,神經(jīng)網(wǎng)絡(luò)將輸出圖像所對(duì)應(yīng)的數(shù)字。獲取神經(jīng)網(wǎng)
    發(fā)表于 03-18 21:51

    卷積神經(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ǔ)的概念容易理解不清。首先ART神經(jīng)網(wǎng)絡(luò)是競(jìng)爭(zhēng)學(xué)習(xí)的一個(gè)代表,
    發(fā)表于 07-21 04:30

    如何構(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ù)獲取輸入的層隱藏層:使用反向傳播優(yōu)化輸入變量權(quán)重的層,以提高模型的預(yù)測(cè)
    發(fā)表于 07-12 08:02

    基于BP神經(jīng)網(wǎng)絡(luò)的PID控制

    最近在學(xué)習(xí)電機(jī)的智能控制,上周學(xué)習(xí)了基于單神經(jīng)元的PID控制,這周研究基于BP神經(jīng)網(wǎng)絡(luò)的PID控制。神經(jīng)網(wǎng)絡(luò)具有任意非線性表達(dá)能力,可以通過(guò)對(duì)系統(tǒng)性能的學(xué)習(xí)來(lái)實(shí)現(xiàn)具有最佳組合的PID控制。利用BP
    發(fā)表于 09-07 07:43

    輕量化神經(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ā)】篇五|實(shí)戰(zhàn)篇一:STM32cubeIDE上部署
    發(fā)表于 12-14 07:35

    使用keras搭建神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)基于深度學(xué)習(xí)算法的股票價(jià)格預(yù)測(cè)

    本文使用keras搭建神經(jīng)網(wǎng)絡(luò),實(shí)現(xiàn)基于深度學(xué)習(xí)算法的股票價(jià)格預(yù)測(cè)。本文使用的數(shù)據(jù)來(lái)源為tushare,一個(gè)免費(fèi)開源接口;且只取開票價(jià)進(jìn)行預(yù)測(cè)。import numpy as npimport
    發(fā)表于 02-08 06:40

    基于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 ?7951次閱讀
    基于<b class='flag-5'>Numpy</b>實(shí)現(xiàn)同態(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 ?5140次閱讀
    基于<b class='flag-5'>Numpy</b>實(shí)現(xiàn)<b class='flag-5'>神經(jīng)網(wǎng)絡(luò)</b>:反向傳播

    【連載】深度學(xué)習(xí)筆記7:Tensorflow入門

    從前面的學(xué)習(xí)筆記中,和大家一起使用了 numpy 一步一步從感知機(jī)開始到兩層網(wǎng)絡(luò)以及最后實(shí)現(xiàn)了深度神經(jīng)網(wǎng)絡(luò)的算法搭建。而后我們又討論了改善深度神經(jīng)網(wǎng)
    的頭像 發(fā)表于 08-20 12:47 ?3260次閱讀

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

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

    卷積神經(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ì)介紹卷積神經(jīng)網(wǎng)絡(luò)模型的
    的頭像 發(fā)表于 08-21 17:11 ?951次閱讀

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

    要使用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)
    的頭像 發(fā)表于 07-11 16:30 ?1626次閱讀
    RM新时代网站-首页