精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

3天內不再提示

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

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

對MNIST數據集使用2層神經網絡(1層隱藏層)實現。

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)
    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:輸入數據, t:監督數據
    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:輸入數據, 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):
        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

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

圖片

定義了predict函數,表明網絡結構,輸入x權重+偏置進行激活得到隱藏層z1,z1權重+偏置進行激活得到輸出y。

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

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

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

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

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

2、Mini-batch的實現

定義了2層神經網絡的類相當于對神經網絡進行封裝形成一個模塊,需要的時候設計參數即可直接調用。現在對MNIST數據集進行學習,使用這個封裝好的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)
iters_num = 10000  # 適當設定循環的次數
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)
# 更新參數
    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)

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

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

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

圖片

3、基于測試數據的評價

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

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

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

圖片

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

    關注

    42

    文章

    4717

    瀏覽量

    100010
  • 函數
    +關注

    關注

    3

    文章

    4237

    瀏覽量

    61969
  • 數據集
    +關注

    關注

    4

    文章

    1197

    瀏覽量

    24538
  • MNIST
    +關注

    關注

    0

    文章

    10

    瀏覽量

    3350
收藏 人收藏

    評論

    相關推薦

    粒子群優化模糊神經網絡在語音識別中的應用

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

    labview BP神經網絡實現

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

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

    特征向量作為神經網絡的輸入,所以神經的輸入層神經元個數等于特征向量的維數,即9×18=162 個輸入神經元。輸出層神經元個數的確定因為要
    發表于 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

    【案例分享】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 ?1523次閱讀
    谷歌向<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 ?614次閱讀

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

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

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

    在練習二中,手寫數字識別使用數值微分的方式實現神經網絡,現在用誤差反向傳播法來實現。兩者的區別
    的頭像 發表于 06-23 16:57 ?628次閱讀

    常見的卷積神經網絡模型 典型的卷積神經網絡模型

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

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

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