色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

    文章

    4771

    瀏覽量

    100719
  • 數值
    +關注

    關注

    0

    文章

    80

    瀏覽量

    14359
  • 函數
    +關注

    關注

    3

    文章

    4327

    瀏覽量

    62573
  • 數字識別
    +關注

    關注

    2

    文章

    19

    瀏覽量

    10140
收藏 人收藏

    評論

    相關推薦

    基于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

    如何使用STM32F4+MPU9150實現神經網絡識別手勢?

    如何使用STM32F4+MPU9150實現神經網絡識別手勢?
    發表于 11-19 07:06

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

    逼近未知非線性對象的特點,使其為手寫數字識別提供了一種新的方法。本論文采用一編制了一套基于神經網絡手寫
    發表于 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 ?1633次閱讀
    谷歌向<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 ?711次閱讀

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

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

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

    對MNIST數據集使用2神經網絡(1層隱藏層)實現
    的頭像 發表于 06-23 16:57 ?568次閱讀
    <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 ?1926次閱讀

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

    隨著人工智能技術的飛速發展,神經網絡在圖像識別領域的應用日益廣泛。神經網絡以其強大的特征提取和分類能力,為圖像識別帶來了革命性的進步。本文將詳細介紹
    的頭像 發表于 07-01 14:19 ?671次閱讀
    主站蜘蛛池模板: 国产精品无码视频一区二区| 和尚扒开双腿蹂躏| 狠狠色噜噜狠狠狠狠米奇777| 噜妇插内射精品| 色淫阁色九九| 在线观看国产高清免费不卡| 成人高清网站| 久久久久99精品成人片三人毛片| 鸥美一级黄色片| 一本到高清视频在线观看三区| qvod 电影| 精品网站一区二区三区网站| 拍戏被CAO翻了H| 亚洲精品午睡沙发系列| voyeurhit农村夫妻偷拍| 黑人玩弄极品人妻系列| 强奷表妺好紧2| 亚洲无码小格式| 丰满老熟女白浆直流| 久久综合色一综合色88| 天天摸夜添狠狠添高| 2019夜夜| 花蝴蝶在线观看免费中文版高清| 欧洲亚洲精品A片久久99果冻| 孕妇高潮抽搐喷水30分钟| 国产成人在线观看网站| 男人J进女人P| 伊人久久久久久久久香港| 国产精品线路一线路二| 欧美午夜福利主线路| 欲插爽乱浪伦骨| 国产露脸A片国语露对白| 漂亮的av女演员| 自拍偷拍2| 果冻传媒mv国产陈若瑶主演| 日本熟妇乱妇熟色A片蜜桃亚洲 | write as 跳蛋| 浪潮色诱AV久久久久久久| 亚洲精品伊人久久久久| 国产成人aaa在线视频免费观看| 妹妹的第一次有点紧|