神經網路學習筆記4

2022-02-02 10:38:25 字數 4420 閱讀 1144

②學習演算法的實現

神經網路的步驟

1、mini-batch

從訓練資料中隨機選取一部分資料,稱之為mini-batch。目標是減少mini-batch的損失函式值。

2、計算梯度

為了減少mini-batch損失函式的值,需要求出各個權重引數的梯度,梯度表示損失函式的值減少最多的方向。

3、更新引數,將權重引數沿著梯度方向進行微小更新。

4、loop step 123

例項1、實現手寫數字識別的神經網路

以2層神經網路為物件,使用mnist資料集進行學習。

權重使用符合高斯分布的隨機數進行初始化,偏置使用0進行初始化。

2、mini-batch實現

從訓練資料中隨機選擇一部分資料,使用梯度法更新引數

以minst資料集進行學習,twolayernet類作為物件

設定mini-batch大小為100,每次需要從60000個訓練資料中隨機取出100個資料,然後對這包含100筆資料的mini-batch求梯度,使用隨機梯度下降法更新引數。梯度法的更新速度每更新一次,都對訓練資料計算損失函式的值,把值新增到陣列中。

可以發現,隨著學習的進行,損失函式值不斷減少。是正常的學習進行訊號,表示神經網路的權重引數正在逐漸擬合資料。

#

coding: utf-8

import

sys, os

#為了匯入父目錄的檔案而進行的設定

import

numpy as np

import

matplotlib.pyplot as plt

from dataset.mnist import

load_mnist

from two_layer_net import

twolayernet

#讀入資料

(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 = 100learning_rate = 0.1train_loss_list =

train_acc_list =

test_acc_list =

#平均每個epoch重複的次數

iter_per_epoch = max(train_size / batch_size, 1)

for i in

range(iters_num):

#獲取mini-batch

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)

3、基於測試資料評價

必須確認是否能苟正確識別訓練資料意外的其他資料,確認是否會發生過擬合。

過擬合:訓練資料中的數字影象能正確辨別,但是不在訓練資料中的數字影象卻無法被識別。

每經過乙個epoch都會記錄下訓練資料和測試資料的識別精度。

epoch:指學習中所有訓練資料均被使用過一次的更新次數

比如對於10000筆訓練資料,用大小為100筆資料的mini-batch進行學習,重複隨機梯度下降法100次,所有訓練資料都過了一遍,100次為乙個epoch。

**實現:

#

coding: utf-8

import

sys, os

#為了匯入父目錄的檔案而進行的設定

import

numpy as np

import

matplotlib.pyplot as plt

from dataset.mnist import

load_mnist

from two_layer_net import

twolayernet

#讀入資料

(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 = 100learning_rate = 0.1train_loss_list =

train_acc_list =

test_acc_list =

#平均每個epoch重複的次數

iter_per_epoch = max(train_size / batch_size, 1)

for i in

range(iters_num):

#獲取mini-batch

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)

#計算每個epoch的識別精度

if i % iter_per_epoch ==0:

train_acc =network.accuracy(x_train, t_train)

test_acc =network.accuracy(x_test, t_test)

print("

train acc, test acc |

" + str(train_acc) + "

, " +str(test_acc))

#繪製圖形

markers =

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就對所有的訓練資料和測試資料識別精度,並記錄結果。

從圖里可以看出,隨著epoch前進,使用訓練資料和測試資料評價的識別精度都提高了。即沒有發生過擬合現象。

簡單總結:為了能順利進行神經網路的學習,匯入了損失函式的指標。以損失函式為基準,找出使得它達到值最小的權重引數,就是神經網路學習的目標。

為了找到盡可能小的值,對損失函式使用梯度下降法更新權重

神經網路學習筆記

隱含層數越多,越容易擬合複雜函式 為了擬合複雜函式需要的隱含節點數目,基本上隨著隱含層數目的增加呈現指數下降的趨勢,也就是說層數越多,神經網路所需要的隱含節點可以越少。層數越深,概念越抽象,需要背誦的知識點 神經網路的隱含節點 就越少。但是,層數越多,容易出現過擬合以及引數難以除錯以及梯度瀰散的問題...

神經網路學習筆記

sigmoid函式是一種常見的擠壓函式,其將較大範圍的輸入擠壓到 0 1 區間內,其函式的表示式與形狀如下圖所示 該函式常被用於分類模型,因為其具有很好的乙個特性f x f x 1 f x 這個函式也會被用於下面的神經網路模型中做啟用函式。生物的神經網路系統中,最簡單最基本的結構是神經元。每個神經元...

神經網路 學習筆記

神經網路是用來解決分類問題的模型。他與感知機有著緊密的聯絡。神經網路中,神經元接收到的總輸入將與神經元的閾值進行比較,然後通過 啟用函式 處理以產生神經元的輸出。最理想的啟用函式是階躍函式,但是他不連續,不光滑,所以,採用sigmoid函式來進行替代。感知機只有輸出層神經元進行啟用函式處理,即只擁有...