女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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

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

3天內不再提示

手寫數字識別神經網絡的實現(2)

CHANBAEK ? 來源:小小研究生 ? 作者:小小研究生 ? 2023-06-23 16:57 ? 次閱讀

在練習二中,手寫數字識別使用數值微分的方式實現了神經網絡,現在用誤差反向傳播法來實現。兩者的區別僅僅是使用不同方法求梯度。

1、2層神經網絡的類

將2層神經網絡實現為一個TwoLayerNet的類(和上次的代碼僅僅是求梯度的方式不同,不同的地方加*表示):

class TwoLayerNet:
    def __init__(self, input_size, hidden_size, output_size, weight_init_std=0.01):
        # 初始化權重
        self.params = {}
        self.params['W1'] = weight_init_std *np.random.randn(input_size, hidden_size)
        self.params['b1'] = np.zeros(hidden_size)
        self.params['W2'] = weight_init_std *np.random.randn(hidden_size, output_size)
        self.params['b2'] = np.zeros(output_size)
*       #生成層        
*       self.layers = OrderedDict()
*       self.layers['Affine1'] = Affine(self.params['W1'], self.params['b1'])
*       self.layers['Relu1'] = Relu()
*       self.layers['Affine2'] = Affine(self.params['W2'], self.params['b2'])
*       self.lastLayer = SoftmaxWithLoss()
*   def predict(self, x):
        for layer in self.layers.values():
           x = layer.forward(x)
        return x
    # x:輸入數據, t:監督數據
    def loss(self, x, t):
        y = self.predict(x)
*       return self.lastLayer.forward(y, t)
    def accuracy(self, x, t):
        y = self.predict(x)
        y = np.argmax(y, axis=1)
*       if t.dim != 1 : t=np.argmax(t,axis=1)
        accuracy = np.sum(y == t) / float(x.shape[0])
        return accuracy
    # x:輸入數據, t:監督數據
    def numerical_gradient(self, x, t):
        loss_W = lambda W: self.loss(x, t)
        grads = {}
        grads['W1'] = numerical_gradient(loss_W, self.params['W1'])
        grads['b1'] = numerical_gradient(loss_W, self.params['b1'])
        grads['W2'] = numerical_gradient(loss_W, self.params['W2'])
        grads['b2'] = numerical_gradient(loss_W, self.params['b2'])
        return grads
*    def gradient(self, x, t):
        # forward
        self.loss(x, t)
        # backward
        dout = 1
        dout = self.lastLayer.backward(dout)      
        layers = list(self.layers.values())
        layers.reverse()
        for layer in layers:
            dout = layer.backward(dout)
        # 設定
        grads = {}
        grads['W1'], grads['b1'] = self.layers['Affine1'].dW, self.layers['Affine1'].db
        grads['W2'], grads['b2'] = self.layers['Affine2'].dW, self.layers['Affine2'].db
        return grads

只介紹和數值微分求導法不同的部分:

初始化: layer是保存神經網絡的層的有序字典型變量 。OrderedDict是有序字典, 有序是說它可以記住向字典中添加元素的順序 ,正向傳播只需要按照添加元素的順序調用各層的forward方法就可以,反向傳播順序相反地順序調用backward方法。通過layers['Affine1'],layers['Relu1'],layers['Affine2']的形式保存各個層。還定義了最后一層lastlayer,上一篇中介紹了Affine,Relu,SoftmaxWithLoss函數的封裝,在這一層中直接定義。

定義predict函數,用于識別:predict()函數的參數是輸入的圖像數據,按照層的順序(layers的for語句)依次調用每一層的forward()函數,先是x經過Affine1層的forward函數,返回的out值作為Relu層的forward函數的輸入參數,返回的out作為Affine2層的forward函數的輸入參數,返回的out作為最后一層SoftmaxWithLoss層的forward函數的輸入參數,返回的out是最后的輸出,也就是識別的結果。

定義損失函數:輸入參數是x輸入圖像和t標簽,經過predict函數得到識別數據y,返回值是輸入為y和t的SoftmaxWithLoss()的前向函數。

定義識別精度:經過predict()之后的輸出y是識別結果,如果與標簽一致說明結果準確,識別精度就是準確的次數與輸入圖像數量之比,即準確的概率。批處理時假設一次處理N張,y的形狀是(N,10),有兩個方向,a[1]是按行方向索引,argmax是找到最大值所在的位置。按行找到到最大值的索引值,就對應每一張圖片識別到最大可能性的結果對應的分類。將該分類與標簽進行比較,求識別正確的概率。

定義了數值微分求導的過程,這個是數值微分的方法,如果用誤差反向傳播法需要將這段注釋掉;或者后續要比較兩個方法求導的結果。

定義了誤差反向傳播法求導的方法:先求dout=1通過lastlayer層的backward函數的輸出,返回dx。由于反向傳播經過的層和正向相反,正向的有序字典變量需要reverse反向,這樣通過for語句調用每一層的backward函數經過的層順序就是affine2,relu,affine1,此時的輸出就是最后的求導結果。

將神經網絡用層的方式實現,將每一層模塊化,是非常方便的,即使層很多,也只需要接好每一層的接口。通過各個層內部的forward和backward函數就可以識別或者計算梯度。

2、數值微分的計算耗時,但是計算簡單不易出錯。誤差反向傳播法的實現相對復雜容易出錯。所以比較兩者的結果可以確認誤差反向傳播法是否正確。這個比較的操作成為梯度確認。梯度確認的代碼:

(x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, one_hot_label=True)
network = TwoLayerNet(input_size=784, hidden_size=50, output_size=10)
x_batch = x_train[:3]
t_batch = t_train[:3]
grad_numerical = network.numerical_gradient(x_batch, t_batch)
grad_backprop = network.gradient(x_batch, t_batch)
for key in grad_numerical.keys():
    diff = np.average( np.abs(grad_backprop[key] - grad_numerical[key]) )
    print(key + ":" + str(diff))

通過numerical_gradient函數得到的數值微分求導結果保存在grad_numerical中,通過gradient函數得到的誤差反向傳播結求導結果保存在grad_backprop中。通過求對應位置的數值的絕對值的平均值,判斷誤差反向傳播求導結果是否正確。

W1:3.705434371413955e-10

b1:2.37776902256894e-09

W2:5.412727643613116e-09

b2:1.396563151026542e-07

輸出的誤差很小,所以是正確的。

3、使用誤差反向傳播法的學習

和數值微分的方法一樣,因為不同之處僅僅是求梯度。

因此在練習二中的代碼,把數值微分求梯度的代碼注釋掉,用誤差反向傳播法求梯度的代碼就可以了。

總結:通過買水果的例子介紹了誤差反向傳播法的原理,介紹了神經網絡中的誤差反向傳播法,原理一樣只是不用標量用矩陣。將relu,softmaxwithloss,affine,softmax層封裝成模塊,內部實現了forward和backward方法。只需要搭建神經網絡的每一層,通過內部的forward和backward函數,將數據正向或反向傳播就可以求導。

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

    關注

    42

    文章

    4807

    瀏覽量

    102756
  • 數值
    +關注

    關注

    0

    文章

    80

    瀏覽量

    14530
  • 函數
    +關注

    關注

    3

    文章

    4368

    瀏覽量

    64181
  • 數字識別
    +關注

    關注

    2

    文章

    19

    瀏覽量

    10218
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    labview BP神經網絡實現

    請問:我在用labview做BP神經網絡實現故障診斷,在NI官網找到了機器學習工具包(MLT),但是里面沒有關于這部分VI的幫助文檔,對于”BP神經網絡分類“這個范例有很多不懂的地方,比如
    發表于 02-22 16:08

    基于BP神經網絡的手勢識別系統

      摘 要:本文給出了采用ADXL335加速度傳感器來采集五個手指和手背的加速度三軸信息,并通過ZigBee無線網絡傳輸來提取手勢特征量,同時利用BP神經網絡算法進行誤差分析來實現手勢識別
    發表于 11-13 16:04

    【PYNQ-Z2申請】基于PYNQ-Z2神經網絡圖形識別

    神經網絡的學習,講解其工作原理。4.基于PYNQ-Z2,用python實現一個神經網絡。5.訓練和測試神經網絡,完成
    發表于 01-09 14:48

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

    前言前面我們通過notebook,完成了在PYNQ-Z2開發板上編寫并運行python程序。我們的最終目的是基于神經網絡,完成手寫數字識別
    發表于 03-03 22:10

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

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

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

    是一種常用的無監督學習策略,在使用改策略時,網絡的輸出神經元相互競爭,每一時刻只有一個競爭獲勝的神經元激活。ART神經網絡由比較層、識別層、
    發表于 07-21 04:30

    人工神經網絡實現方法有哪些?

    人工神經網絡(Artificial Neural Network,ANN)是一種類似生物神經網絡的信息處理結構,它的提出是為了解決一些非線性,非平穩,復雜的實際問題。那有哪些辦法能實現人工神經
    發表于 08-01 08:06

    matlab實現神經網絡 精選資料分享

    神經神經網絡,對于神經網絡實現是如何一直沒有具體實現一下:現看到一個簡單的神經網絡模型用于訓
    發表于 08-18 07:25

    人工神經網絡手寫數字識別系統的詳細資料概述

    逼近未知非線性對象的特點,使其為手寫數字識別提供了一種新的方法。本論文采用一編制了一套基于神經網絡手寫
    發表于 05-27 08:00 ?18次下載
    人工<b class='flag-5'>神經網絡</b><b class='flag-5'>手寫</b><b class='flag-5'>數字</b><b class='flag-5'>識別</b>系統的詳細資料概述

    谷歌向神經網絡手寫數字識別發起挑戰,竟用量子計算識別

    神經網絡做 MNIST 手寫數字識別是機器學習小白用來練手的入門項目,業內最佳準確率已經達到了 99.84%。但最近,谷歌向這個「古老」的數據集發起了一項新的挑戰:用量子計算來進行
    的頭像 發表于 08-17 17:17 ?1882次閱讀
    谷歌向<b class='flag-5'>神經網絡</b><b class='flag-5'>手寫</b><b class='flag-5'>數字</b><b class='flag-5'>識別</b>發起挑戰,竟用量子計算<b class='flag-5'>識別</b>

    神經網絡入門:使用Python+Flux+Julia來實現手寫數字識別

    使用 MNIST 數據集對 0 到 9 之間的數字進行手寫數字識別神經網絡的一個典型入門教程。 該技術在現實場景中是很有用的,比如可以把該
    的頭像 發表于 11-03 22:02 ?924次閱讀

    使用PyhonFluxJulia實現手寫數字識別神經網絡入門教程

    使用 MNIST 數據集對 0 到 9 之間的數字進行手寫數字識別神經網絡的一個典型入門教程。該技術在現實場景中是很有用的,比如可以把該技
    發表于 12-08 00:23 ?7次下載

    手寫數字識別神經網絡實現(1)

    對MNIST數據集使用2神經網絡(1層隱藏層)實現
    的頭像 發表于 06-23 16:57 ?834次閱讀
    <b class='flag-5'>手寫</b><b class='flag-5'>數字</b><b class='flag-5'>識別</b><b class='flag-5'>神經網絡</b>的<b class='flag-5'>實現</b>(1)

    卷積神經網絡如何識別圖像

    多層卷積層、池化層和全連接層。CNN模型通過訓練識別并學習高度復雜的圖像模式,對于識別物體和進行圖像分類等任務有著非常優越的表現。本文將會詳細介紹卷積神經網絡如何識別圖像,主要包括以下
    的頭像 發表于 08-21 16:49 ?2245次閱讀

    神經網絡在圖像識別中的應用

    隨著人工智能技術的飛速發展,神經網絡在圖像識別領域的應用日益廣泛。神經網絡以其強大的特征提取和分類能力,為圖像識別帶來了革命性的進步。本文將詳細介紹
    的頭像 發表于 07-01 14:19 ?1093次閱讀