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

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

3天內不再提示

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

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

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

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

將2層神經(jīng)網(wǎng)絡實現(xiàn)為一個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)
    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層的權重,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)絡結構,輸入x權重+偏置進行激活得到隱藏層z1,z1權重+偏置進行激活得到輸出y。

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

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

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

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

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

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

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

# 讀入數(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  # 適當設定循環(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]
# 記錄學習過程    
    loss = network.loss(x_batch, t_batch)
    train_loss_list.append(loss)

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

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

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

圖片

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

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

下面的代碼會對訓練和測試數(shù)據(jù)的每一個epoch記錄識別精度。一個epoch表示學習中所有數(shù)據(jù)均被使用過一次的更新次數(shù),訓練數(shù)據(jù)有60000個,mini-batch是100個,那么重復隨機梯度下降法600次,所有訓練數(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就會對所有訓練和測試數(shù)據(jù)計算精度,然后繪制訓練和測試精確度的變化,訓練和測試的精度在慢慢提高且基本重疊,說明沒有過擬合。

圖片

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

    評論

    相關推薦

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

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

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

    特征向量作為神經(jīng)網(wǎng)絡的輸入,所以神經(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)絡圖形識別

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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