99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

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

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

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

手寫數(shù)字識別神經(jīng)網(wǎng)絡(luò)的實現(xiàn)(1)

CHANBAEK ? 來源:小小研究生 ? 作者:小小研究生 ? 2023-06-23 16:57 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

對MNIST數(shù)據(jù)集使用2層神經(jīng)網(wǎng)絡(luò)(1層隱藏層)實現(xiàn)。

1、2層神經(jīng)網(wǎng)絡(luò)的類

將2層神經(jīng)網(wǎng)絡(luò)實現(xiàn)為一個TwoLayerNet的類:

class TwoLayerNet:
    def __init__(self, input_size, hidden_size, output_size, weight_init_std=0.01):
        # 初始化權(quán)重
        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)
    def predict(self, x):
        W1, W2 = self.params['W1'], self.params['W2']
        b1, b2 = self.params['b1'], self.params['b2']
        a1 = np.dot(x, W1) + b1
        z1 = sigmoid(a1)
        a2 = np.dot(z1, W2) + b2
        y = softmax(a2)
        return y
    # x:輸入數(shù)據(jù), t:監(jiān)督數(shù)據(jù)
    def loss(self, x, t):
        y = self.predict(x)
        return cross_entropy_error(y, t)
    def accuracy(self, x, t):
        y = self.predict(x)
        y = np.argmax(y, axis=1)
        t = np.argmax(t, axis=1)
        accuracy = np.sum(y == t) / float(x.shape[0])
        return accuracy
    # x:輸入數(shù)據(jù), t:監(jiān)督數(shù)據(jù)
    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):
        W1, W2 = self.params['W1'], self.params['W2']
        b1, b2 = self.params['b1'], self.params['b2']
        grads = {}
        batch_num = x.shape[0]
        # forward
        a1 = np.dot(x, W1) + b1
        z1 = sigmoid(a1)
        a2 = np.dot(z1, W2) + b2
        y = softmax(a2)
        # backward
        dy = (y - t) / batch_num
        grads['W2'] = np.dot(z1.T, dy)
        grads['b2'] = np.sum(dy, axis=0)
        da1 = np.dot(dy, W2.T)
        dz1 = sigmoid_grad(a1) * da1
        grads['W1'] = np.dot(x.T, dz1)
        grads['b1'] = np.sum(dz1, axis=0
        return grads

定義了初始化函數(shù)__init__,其中params變量W1,2分別是第1,2層的權(quán)重,b1,2分別是1,2層的偏置。初始化函數(shù)中包含輸入層、隱藏層和輸出層的神經(jīng)元數(shù),W1是隨機生成的大小為輸入層神經(jīng)元數(shù)量(m)*隱藏層神經(jīng)元數(shù)量的矩陣(n),b1是隱藏層神經(jīng)元數(shù)量(n)的全0一維數(shù)組,W2是隨機生成的大小為隱藏層神經(jīng)元數(shù)量(n)*輸出層神經(jīng)元數(shù)量(k)的矩陣,b2是輸出層神經(jīng)元數(shù)量(k)的全0一維數(shù)組。

圖片

定義了predict函數(shù),表明網(wǎng)絡(luò)結(jié)構(gòu),輸入x權(quán)重+偏置進行激活得到隱藏層z1,z1權(quán)重+偏置進行激活得到輸出y。

定義損失函數(shù)loss,使用的是交叉熵誤差。

定義精確度函數(shù)accuracy,計算輸出與標(biāo)簽一致(即正確識別)的概率。

定義了數(shù)值微分求權(quán)重梯度的函數(shù)numerical_gradient,返回梯度值,之前介紹過。

定義了另一種求權(quán)重梯度的方法,后面介紹。

上述代碼中涉及的兩個變量params和grads是字典型實例變量,前者保存了神經(jīng)網(wǎng)絡(luò)中全部的參數(shù),后者保存了各個參數(shù)的梯度。

2、Mini-batch的實現(xiàn)

定義了2層神經(jīng)網(wǎng)絡(luò)的類相當(dāng)于對神經(jīng)網(wǎng)絡(luò)進行封裝形成一個模塊,需要的時候設(shè)計參數(shù)即可直接調(diào)用?,F(xiàn)在對MNIST數(shù)據(jù)集進行學(xué)習(xí),使用這個封裝好的2層神經(jīng)網(wǎng)絡(luò)。

# 讀入數(shù)據(jù)
(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)
iters_num = 10000  # 適當(dāng)設(shè)定循環(huán)的次數(shù)
train_size = x_train.shape[0]
batch_size = 100
learning_rate = 0.1


# 獲取mini-batch
for i in range(iters_num):
    batch_mask = np.random.choice(train_size, batch_size)
    x_batch = x_train[batch_mask]
    t_batch = t_train[batch_mask]
# 計算梯度
    #grad = network.numerical_gradient(x_batch, t_batch)
    grad = network.gradient(x_batch, t_batch)
# 更新參數(shù)
    for key in ('W1', 'b1', 'W2', 'b2'):
        network.params[key] -= learning_rate * grad[key]
# 記錄學(xué)習(xí)過程    
    loss = network.loss(x_batch, t_batch)
    train_loss_list.append(loss)

讀入數(shù)據(jù)后,調(diào)用了2層神經(jīng)網(wǎng)絡(luò)的類,設(shè)置好函數(shù)完成調(diào)用,其中輸入神經(jīng)元為784個(圖片像素為28*28),隱藏層50個神經(jīng)元,輸出層10個神經(jīng)元(對應(yīng)0-9的分類)。

設(shè)置超參數(shù),包括學(xué)習(xí)的次數(shù)iters_num,訓(xùn)練數(shù)據(jù)的數(shù)量train_size,一次隨機選取的訓(xùn)練數(shù)據(jù)的個數(shù)batch_size,學(xué)習(xí)率learning_rate。

獲取mini-batch,計算mini-batch中的梯度,有兩種計算方法數(shù)值微分和后面會介紹的高效方法,任意一種都行。通過grad函數(shù)更新參數(shù)W1,W2,b1,b2,使參數(shù)向梯度方向即使損失函數(shù)減小的方向移動,保存每一次更新的損失函數(shù)的值,后續(xù)繪圖可以觀察損失函數(shù)的變化。損失函數(shù)在不斷減小,說明神經(jīng)網(wǎng)絡(luò)確實在學(xué)習(xí)。

圖片

3、基于測試數(shù)據(jù)的評價

損失函數(shù)的值是某一個mini-batch的損失函數(shù)的值,不能說明在其他數(shù)據(jù)集上也能有同等程度的表現(xiàn),神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)必須確認(rèn)是否能識別訓(xùn)練數(shù)據(jù)之外的其他數(shù)據(jù),即確認(rèn)是否會發(fā)生過擬合。

下面的代碼會對訓(xùn)練和測試數(shù)據(jù)的每一個epoch記錄識別精度。一個epoch表示學(xué)習(xí)中所有數(shù)據(jù)均被使用過一次的更新次數(shù),訓(xùn)練數(shù)據(jù)有60000個,mini-batch是100個,那么重復(fù)隨機梯度下降法600次,所有訓(xùn)練數(shù)據(jù)就都被看過了,因此600次是一個epoch。

train_acc_list = []
test_acc_list = []
iter_per_epoch = max(train_size / batch_size, 1)


if i % iter_per_epoch == 0:
  train_acc = network.accuracy(x_train, t_train)
  test_acc = network.accuracy(x_test, t_test)
  train_acc_list.append(train_acc)
  test_acc_list.append(test_acc)
  print("train acc, test acc | " + str(train_acc) + ", " + str(test_acc))
# 繪制圖形
markers = {'train': 'o', 'test': 's'}
x = np.arange(len(train_acc_list))
plt.plot(x, train_acc_list, label='train acc')
plt.plot(x, test_acc_list, label='test acc', linestyle='--')
plt.xlabel("epochs")
plt.ylabel("accuracy")
plt.ylim(0, 1.0)
plt.legend(loc='lower right')
plt.show()

每經(jīng)歷一個epoch就會對所有訓(xùn)練和測試數(shù)據(jù)計算精度,然后繪制訓(xùn)練和測試精確度的變化,訓(xùn)練和測試的精度在慢慢提高且基本重疊,說明沒有過擬合。

圖片

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 神經(jīng)網(wǎng)絡(luò)

    關(guān)注

    42

    文章

    4814

    瀏覽量

    103648
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4381

    瀏覽量

    64904
  • 數(shù)據(jù)集
    +關(guān)注

    關(guān)注

    4

    文章

    1224

    瀏覽量

    25453
  • MNIST
    +關(guān)注

    關(guān)注

    0

    文章

    10

    瀏覽量

    3541
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

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

    粒子群優(yōu)化模糊神經(jīng)網(wǎng)絡(luò)在語音識別中的應(yīng)用

    的收斂速度和識別率【關(guān)鍵詞】:粒子群優(yōu)化;;模糊神經(jīng)網(wǎng)絡(luò);;語音識別【DOI】:CNKI:SUN:SSJS.0.2010-06-018【正文快照】:1引言語音
    發(fā)表于 05-06 09:05

    基于BP神經(jīng)網(wǎng)絡(luò)的手勢識別系統(tǒng)

    特征向量作為神經(jīng)網(wǎng)絡(luò)的輸入,所以神經(jīng)的輸入層神經(jīng)元個數(shù)等于特征向量的維數(shù),即9×18=162 個輸入神經(jīng)元。輸出層神經(jīng)元個數(shù)的確定因為要
    發(fā)表于 11-13 16:04

    【PYNQ-Z2申請】基于PYNQ-Z2的神經(jīng)網(wǎng)絡(luò)圖形識別

    神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí),講解其工作原理。4.基于PYNQ-Z2,用python實現(xiàn)一個神經(jīng)網(wǎng)絡(luò)。5.訓(xùn)練和測試神經(jīng)網(wǎng)絡(luò),完成神經(jīng)網(wǎng)絡(luò)最經(jīng)典的入門實
    發(fā)表于 01-09 14:48

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

    前言前面我們通過notebook,完成了在PYNQ-Z2開發(fā)板上編寫并運行python程序。我們的最終目的是基于神經(jīng)網(wǎng)絡(luò),完成手寫數(shù)字識別。在這之前,有必要講一下
    發(fā)表于 03-03 22:10

    【案例分享】ART神經(jīng)網(wǎng)絡(luò)與SOM神經(jīng)網(wǎng)絡(luò)

    是一種常用的無監(jiān)督學(xué)習(xí)策略,在使用改策略時,網(wǎng)絡(luò)的輸出神經(jīng)元相互競爭,每一時刻只有一個競爭獲勝的神經(jīng)元激活。ART神經(jīng)網(wǎng)絡(luò)由比較層、識別層、
    發(fā)表于 07-21 04:30

    人工神經(jīng)網(wǎng)絡(luò)實現(xiàn)方法有哪些?

    人工神經(jīng)網(wǎng)絡(luò)(Artificial Neural Network,ANN)是一種類似生物神經(jīng)網(wǎng)絡(luò)的信息處理結(jié)構(gòu),它的提出是為了解決一些非線性,非平穩(wěn),復(fù)雜的實際問題。那有哪些辦法能實現(xiàn)人工神經(jīng)
    發(fā)表于 08-01 08:06

    matlab實現(xiàn)神經(jīng)網(wǎng)絡(luò) 精選資料分享

    習(xí)神經(jīng)神經(jīng)網(wǎng)絡(luò),對于神經(jīng)網(wǎng)絡(luò)實現(xiàn)是如何一直沒有具體實現(xiàn)一下:現(xiàn)看到一個簡單的神經(jīng)網(wǎng)絡(luò)模型用于訓(xùn)
    發(fā)表于 08-18 07:25

    人工神經(jīng)網(wǎng)絡(luò)手寫數(shù)字識別系統(tǒng)的詳細資料概述

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

    谷歌向神經(jīng)網(wǎng)絡(luò)手寫數(shù)字識別發(fā)起挑戰(zhàn),竟用量子計算識別

    神經(jīng)網(wǎng)絡(luò)做 MNIST 手寫數(shù)字識別是機器學(xué)習(xí)小白用來練手的入門項目,業(yè)內(nèi)最佳準(zhǔn)確率已經(jīng)達到了 99.84%。但最近,谷歌向這個「古老」的數(shù)據(jù)集發(fā)起了一項新的挑戰(zhàn):用量子計算來進行
    的頭像 發(fā)表于 08-17 17:17 ?2004次閱讀
    谷歌向<b class='flag-5'>神經(jīng)網(wǎng)絡(luò)</b><b class='flag-5'>手寫</b><b class='flag-5'>數(shù)字</b><b class='flag-5'>識別</b>發(fā)起挑戰(zhàn),竟用量子計算<b class='flag-5'>識別</b>

    神經(jīng)網(wǎng)絡(luò)入門:使用Python+Flux+Julia來實現(xiàn)手寫數(shù)字識別

    使用 MNIST 數(shù)據(jù)集對 0 到 9 之間的數(shù)字進行手寫數(shù)字識別神經(jīng)網(wǎng)絡(luò)的一個典型入門教程。 該技術(shù)在現(xiàn)實場景中是很有用的,比如可以把該
    的頭像 發(fā)表于 11-03 22:02 ?996次閱讀

    使用PyhonFluxJulia實現(xiàn)手寫數(shù)字識別神經(jīng)網(wǎng)絡(luò)入門教程

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

    手寫數(shù)字識別神經(jīng)網(wǎng)絡(luò)實現(xiàn)(2)

    在練習(xí)二中,手寫數(shù)字識別使用數(shù)值微分的方式實現(xiàn)神經(jīng)網(wǎng)絡(luò),現(xiàn)在用誤差反向傳播法來實現(xiàn)。兩者的區(qū)別
    的頭像 發(fā)表于 06-23 16:57 ?987次閱讀

    卷積神經(jīng)網(wǎng)絡(luò)如何識別圖像

    多層卷積層、池化層和全連接層。CNN模型通過訓(xùn)練識別并學(xué)習(xí)高度復(fù)雜的圖像模式,對于識別物體和進行圖像分類等任務(wù)有著非常優(yōu)越的表現(xiàn)。本文將會詳細介紹卷積神經(jīng)網(wǎng)絡(luò)如何識別圖像,主要包括以下
    的頭像 發(fā)表于 08-21 16:49 ?2359次閱讀

    常見的卷積神經(jīng)網(wǎng)絡(luò)模型 典型的卷積神經(jīng)網(wǎng)絡(luò)模型

    LeNet是卷積神經(jīng)網(wǎng)絡(luò)的開山祖師,是由Yan LeCunn在1998年提出的經(jīng)典卷積神經(jīng)網(wǎng)絡(luò)模型。它最初是為手寫數(shù)字識別而設(shè)計的,由卷
    的頭像 發(fā)表于 08-21 17:11 ?4518次閱讀

    神經(jīng)網(wǎng)絡(luò)在圖像識別中的應(yīng)用

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