<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何使用Numpy搭建神經網絡

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

很多同學入門機器學習之后,直接用TensorFlow調包實現神經網絡,對于神經網絡內在機理知之甚少。

編程語言與技術框架變化更新非常之快,理解背后的原理才是王道。下面文摘菌和大家一起用Numpy實現一步一步實現神經網絡。

此篇文章旨在幫大家梳理神經網絡知識點,且此篇文章是第一部分,只是簡單搭一個簡單的框架。暫時不涉及梯度下降、學習率調參等知識點。

最簡單的神經網絡包含三個要素,輸入層,隱藏層以及輸出層。關于其工作機理其完全可以類比成一個元函數:Y=W*X+b。

一個簡單的神經網絡可以理解為兩次一元函數的輸入和輸出。

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

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

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

兩個函數都有相同的特點,即函數值在零點左右變化較大,當輸入值遠離零點,其輸出較穩定。

首先導入相關的庫,需要兩個庫,一個用于科學計算的Numpy,另一個是math。

importnumpyasnpimport math

然后定義激活函數,

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

這兩個激活函數,其中tanh函數,Numpy直接內嵌。softmax根據數學定義進行設置。第二個激活函數因為是指數函數,其值會變化較大,所以我們用x-x.max 縮小其變化范圍,這對結果不影響。

我們使用的圖片大小是 28*28像素。以后會用手寫數字數據集訓練網絡,所以會有10個數字輸入,分別是[1,2,3,4,5,6,7,8,9,10]。所以要先定義三個列表。

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列表里面包含兩個數,第一個是圖片的像素大小,第二個是數字的輸入變化量。

activation列表包含兩個激活函數,分別為tanh,softmax。

distribution 列表里面對應的是字典格式的數據,分別對應神經網絡參數取值范圍。

其中第一層不包含參數W。

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

上面代碼是對b和w這兩個參數初始化,因為我們輸入的是28*28個數字,輸出的是10個數字。所以第一層的 b 也有28*28個數字組成。根據矩陣的乘法規則,第二層的時候,w的維度只有是28*28行,10列才能滿足輸出的10個數字。因此第二層的b是10個數字。

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

又因為np.random.rand()這一函數輸出值的范圍在[0,1],括號里面的參數(即dinensions[layer]只是確保輸出的數字個數滿足要求),所以為了讓輸出的值在一開始設置的 b 的區間內,我們設置先乘(dist[1]-dist[0])然后加上dist[0]。dist[1]和dist[0]分別對應參數的上下限。

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

上面代碼是將三個參數的初始化集成達到一個函數里面。

先定義一個空列表(不要寫錯成空字典)是為了將三個參數統一輸出。

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

然后從零開始遍歷distribution。用if循環語句,目的是把參數全部包含進來。

第二層for循環和if語句是判斷,并正確添加參數。

parameters=init_parameters() #將參數賦值給新的變量。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

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

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

最后,隨便輸入一個784維數據(像素),都可以輸出一個圖片標簽。

預測圖片中的數字

好了,我們第一個簡單的神經網絡就搭建好了,關于如何使用梯度下降和學習率,如何訓練網絡以及如何加載圖片數據,我們在以后的文章中會介紹。

注:此篇文章受B站up主大野喵渣的啟發,并參考了其代碼,感興趣的同學可以去B站觀看他關于神經網絡的教學視頻。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 神經網絡
    +關注

    關注

    42

    文章

    4591

    瀏覽量

    99298
  • 函數
    +關注

    關注

    3

    文章

    4117

    瀏覽量

    61467
  • 機器學習
    +關注

    關注

    66

    文章

    8176

    瀏覽量

    131016

原文標題:TensorFlow什么的都弱爆了,強者只用Numpy搭建神經網絡

文章出處:【微信號:BigDataDigest,微信公眾號:大數據文摘】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    神經網絡教程(李亞非)

      第1章 概述  1.1 人工神經網絡研究與發展  1.2 生物神經元  1.3 人工神經網絡的構成  第2章人工神經網絡基本模型  2.1 MP模型  2.2 感知器模型  2.3
    發表于 03-20 11:32

    神經網絡簡介

    神經網絡簡介
    發表于 08-05 21:01

    【PYNQ-Z2試用體驗】神經網絡基礎知識

    語言,使用numpy.dot方法即可計算矩陣乘法。 以上便是一個簡單神經網絡的基本原理,對神經網絡有了基本的認識之后,我們才能進行復雜的神經網絡設計??偨Y本文講解了
    發表于 03-03 22:10

    【PYNQ-Z2試用體驗】基于PYNQ-Z2的神經網絡圖形識別[結項]

    前言前面我們簡單講解了神經網絡的基本概念和工作原理,接下來,將通過具體的python代碼來完成基于神經網絡的圖形識別。這里使用手寫的數字圖像作為輸入,神經網絡將輸出圖像所對應的數字。獲取神經網
    發表于 03-18 21:51

    卷積神經網絡如何使用

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

    【案例分享】ART神經網絡與SOM神經網絡

    今天學習了兩個神經網絡,分別是自適應諧振(ART)神經網絡與自組織映射(SOM)神經網絡。整體感覺不是很難,只不過一些最基礎的概念容易理解不清。首先ART神經網絡是競爭學習的一個代表,
    發表于 07-21 04:30

    如何構建神經網絡?

    原文鏈接:http://tecdat.cn/?p=5725 神經網絡是一種基于現有數據創建預測的計算系統。如何構建神經網絡?神經網絡包括:輸入層:根據現有數據獲取輸入的層隱藏層:使用反向傳播優化輸入變量權重的層,以提高模型的預測
    發表于 07-12 08:02

    基于BP神經網絡的PID控制

    最近在學習電機的智能控制,上周學習了基于單神經元的PID控制,這周研究基于BP神經網絡的PID控制。神經網絡具有任意非線性表達能力,可以通過對系統性能的學習來實現具有最佳組合的PID控制。利用BP
    發表于 09-07 07:43

    輕量化神經網絡的相關資料下載

    視覺任務中,并取得了巨大成功。然而,由于存儲空間和功耗的限制,神經網絡模型在嵌入式設備上的存儲與計算仍然是一個巨大的挑戰。前面幾篇介紹了如何在嵌入式AI芯片上部署神經網絡:【嵌入式AI開發】篇五|實戰篇一:STM32cubeIDE上部署
    發表于 12-14 07:35

    使用keras搭建神經網絡實現基于深度學習算法的股票價格預測

    本文使用keras搭建神經網絡,實現基于深度學習算法的股票價格預測。本文使用的數據來源為tushare,一個免費開源接口;且只取開票價進行預測。import numpy as npimport
    發表于 02-08 06:40

    基于Numpy實現同態加密神經網絡

    在分布式AI環境下,同態加密神經網絡有助于保護商業公司知識產權和消費者隱私。本文介紹了如何基于Numpy實現同態加密神經網絡。
    的頭像 發表于 03-27 14:52 ?7668次閱讀
    基于<b class='flag-5'>Numpy</b>實現同態加密<b class='flag-5'>神經網絡</b>

    基于Numpy實現神經網絡:反向傳播

    和DeepMind數據科學家、Udacity深度學習導師Andrew Trask一起,基于Numpy手寫神經網絡,更深刻地理解反向傳播這一概念。
    的頭像 發表于 04-01 09:29 ?4889次閱讀
    基于<b class='flag-5'>Numpy</b>實現<b class='flag-5'>神經網絡</b>:反向傳播

    【連載】深度學習筆記7:Tensorflow入門

    從前面的學習筆記中,和大家一起使用了 numpy 一步一步從感知機開始到兩層網絡以及最后實現了深度神經網絡的算法搭建。而后我們又討論了改善深度神經網
    的頭像 發表于 08-20 12:47 ?3134次閱讀

    如何使用numpy搭建一個卷積神經網絡詳細方法和程序概述

    內容將繼續秉承之前 DNN 的學習路線,在利用Tensorflow搭建神經網絡之前,先嘗試利用numpy手動搭建卷積神經網絡,以期對卷積
    的頭像 發表于 10-20 10:55 ?5887次閱讀

    卷積神經網絡模型搭建

    卷積神經網絡模型搭建 卷積神經網絡模型是一種深度學習算法。它已經成為了計算機視覺和自然語言處理等各種領域的主流算法,具有很大的應用前景。本篇文章將詳細介紹卷積神經網絡模型的
    的頭像 發表于 08-21 17:11 ?696次閱讀
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>