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

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

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

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

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

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

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

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

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ī)生成的大小為輸入層神經(jīng)元數(shù)量(m)*隱藏層神經(jīng)元數(shù)量的矩陣(n),b1是隱藏層神經(jīng)元數(shù)量(n)的全0一維數(shù)組,W2是隨機(jī)生成的大小為隱藏層神經(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)重+偏置進(jìn)行激活得到隱藏層z1,z1權(quán)重+偏置進(jìn)行激活得到輸出y。

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

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

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

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

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

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

定義了2層神經(jīng)網(wǎng)絡(luò)的類(lèi)相當(dāng)于對(duì)神經(jīng)網(wǎng)絡(luò)進(jìn)行封裝形成一個(gè)模塊,需要的時(shí)候設(shè)計(jì)參數(shù)即可直接調(diào)用。現(xiàn)在對(duì)MNIST數(shù)據(jù)集進(jìn)行學(xué)習(xí),使用這個(gè)封裝好的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]
# 計(jì)算梯度
    #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í)過(guò)程    
    loss = network.loss(x_batch, t_batch)
    train_loss_list.append(loss)

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

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

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

圖片

3、基于測(cè)試數(shù)據(jù)的評(píng)價(jià)

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

下面的代碼會(huì)對(duì)訓(xùn)練和測(cè)試數(shù)據(jù)的每一個(gè)epoch記錄識(shí)別精度。一個(gè)epoch表示學(xué)習(xí)中所有數(shù)據(jù)均被使用過(guò)一次的更新次數(shù),訓(xùn)練數(shù)據(jù)有60000個(gè),mini-batch是100個(gè),那么重復(fù)隨機(jī)梯度下降法600次,所有訓(xùn)練數(shù)據(jù)就都被看過(guò)了,因此600次是一個(gè)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)歷一個(gè)epoch就會(huì)對(duì)所有訓(xùn)練和測(cè)試數(shù)據(jù)計(jì)算精度,然后繪制訓(xùn)練和測(cè)試精確度的變化,訓(xùn)練和測(cè)試的精度在慢慢提高且基本重疊,說(shuō)明沒(méi)有過(guò)擬合。

圖片

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

    關(guān)注

    42

    文章

    4726

    瀏覽量

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

    關(guān)注

    3

    文章

    4263

    瀏覽量

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

    關(guān)注

    4

    文章

    1199

    瀏覽量

    24594
  • MNIST
    +關(guān)注

    關(guān)注

    0

    文章

    10

    瀏覽量

    3353
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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