②學習演算法的實現
神經網路的步驟
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求梯度,使用隨機梯度下降法更新引數。梯度法的更新速度每更新一次,都對訓練資料計算損失函式的值,把值新增到陣列中。
可以發現,隨著學習的進行,損失函式值不斷減少。是正常的學習進行訊號,表示神經網路的權重引數正在逐漸擬合資料。
#3、基於測試資料評價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都會記錄下訓練資料和測試資料的識別精度。
epoch:指學習中所有訓練資料均被使用過一次的更新次數
比如對於10000筆訓練資料,用大小為100筆資料的mini-batch進行學習,重複隨機梯度下降法100次,所有訓練資料都過了一遍,100次為乙個epoch。
**實現:
#在例子中,每經過乙個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前進,使用訓練資料和測試資料評價的識別精度都提高了。即沒有發生過擬合現象。
簡單總結:為了能順利進行神經網路的學習,匯入了損失函式的指標。以損失函式為基準,找出使得它達到值最小的權重引數,就是神經網路學習的目標。
為了找到盡可能小的值,對損失函式使用梯度下降法更新權重
神經網路學習筆記
隱含層數越多,越容易擬合複雜函式 為了擬合複雜函式需要的隱含節點數目,基本上隨著隱含層數目的增加呈現指數下降的趨勢,也就是說層數越多,神經網路所需要的隱含節點可以越少。層數越深,概念越抽象,需要背誦的知識點 神經網路的隱含節點 就越少。但是,層數越多,容易出現過擬合以及引數難以除錯以及梯度瀰散的問題...
神經網路學習筆記
sigmoid函式是一種常見的擠壓函式,其將較大範圍的輸入擠壓到 0 1 區間內,其函式的表示式與形狀如下圖所示 該函式常被用於分類模型,因為其具有很好的乙個特性f x f x 1 f x 這個函式也會被用於下面的神經網路模型中做啟用函式。生物的神經網路系統中,最簡單最基本的結構是神經元。每個神經元...
神經網路 學習筆記
神經網路是用來解決分類問題的模型。他與感知機有著緊密的聯絡。神經網路中,神經元接收到的總輸入將與神經元的閾值進行比較,然後通過 啟用函式 處理以產生神經元的輸出。最理想的啟用函式是階躍函式,但是他不連續,不光滑,所以,採用sigmoid函式來進行替代。感知機只有輸出層神經元進行啟用函式處理,即只擁有...