在實現(xiàn)對手寫數(shù)字圖像的分類,可以先假設學習已經(jīng)全部結(jié)束,我們使用學習到的參數(shù),先實現(xiàn)神經(jīng)網(wǎng)絡的“推理處理”。該處理也稱為神經(jīng)網(wǎng)絡的前向傳播。
和求解機器學習問題的步驟(分成學習和推理兩個階段進行)一樣
使用神經(jīng)網(wǎng)絡解決問題時,也需要首先使用訓練數(shù)據(jù)(學習數(shù)據(jù))進行權重參數(shù)的學習;進行推理時,使用剛才學習到的參數(shù),對輸入數(shù)據(jù)進行分類。
MNIST數(shù)據(jù)集
MNIST是機器學習最有名的數(shù)據(jù)集之一,被應用于從簡單的實驗到發(fā)表的論文研究等各種場合,在閱讀圖像識別或機器學習的論文時,MNIST數(shù)據(jù)集經(jīng)常作為實驗用的數(shù)據(jù)出現(xiàn)。
MINIST數(shù)據(jù)集是由0到9的數(shù)字圖像構成的,MNIST數(shù)據(jù)集的使用方法是,先用訓練圖像進行學習,再用學習到的模型度量能在多大程度上對測試圖像進行正確的分類。
MNIST的圖像數(shù)據(jù)是28像素 x 28像素的灰度圖像(1通道),各個像素的取值在0到255之間。每個圖像數(shù)據(jù)都相應地標有“7”“2”“1”等標簽
這里通過Python的腳本mnist.py,從下載MNIST數(shù)集到將這些數(shù)據(jù)轉(zhuǎn)換成NumPy數(shù)組等處理,使用mnistpy中的load_mnist()函數(shù),就可以按下述方式輕松讀入MNIST數(shù)據(jù)。
注意這里的mnist.py不具備通用性,只能用在學習項目中,做學習了解(具體可以參考網(wǎng)上知識,在此不詳述)
Python有pickle這個功能,可以將程序運行中的對象保存為文件,如果加裁保存過的pickle文件,可以立刻復原之前程序運行中的對象。利用pickle功能,可以高效地完成MINIST數(shù)據(jù)的準備工作。pickle.load(f)
手寫數(shù)字識別的例子
# coding: utf-8
import sys, os
sys.path.append(os.pardir) # 為了導入父目錄的文件而進行的設定
import numpy as np
from dataset.mnist import load_mnist
(x_train, t_train), (x_test, t_test) = load_mnist(flatten=True, normalize=False)
# 輸出各個數(shù)據(jù)的形狀
print(x_train.shape) # (60000,784)
print(t_train.shape) # (60000,)
print(x test.shape) #(10000,784)
print(t_test.shape) # (10000,)
上面的代碼中,先導人dataset/mnist.py中的load_mnist函數(shù)。load mnist函數(shù)以“(訓練圖像,訓練標簽),(測試圖像,測試標簽)”的形式返回讀人的MNIST數(shù)據(jù)。
然后想 load_mnist(normalize=True,flatten=True,one_hot_label=False)
這樣,設置3個參數(shù)。
normalize設置是否將輸人圖像正規(guī)化為0.0~1.0的值。
flatten設置是否展開輸人圖像(變成一維數(shù)組)。若設置為True,則輸人圖像會保存為由784個元素構成的一維數(shù)組。
one_hot_label設置是否將標簽保存為one-hot表示。one-hot表示是僅正確解標簽為1,其余皆為0的數(shù)組,就像[0,0,1,0,0,0,0,0,0,0]這樣。當one_hot_label為True時,標簽則保存為one-hot表示。
后面顯示MINIST圖像,同時也確認一下數(shù)據(jù)。圖像的是使用PIL(Python Image Library)模塊。執(zhí)行下述代碼后,訓練圖像的第一張就會顯示出來
# coding: utf-8
import sys, os
sys.path.append(os.pardir) # 為了導入父目錄的文件而進行的設定
import numpy as np
from dataset.mnist import load_mnist
from PIL import Image
def img_show(img):
pil_img = Image.fromarray(np.uint8(img))
pil_img.show()
(x_train, t_train), (x_test, t_test) = load_mnist(flatten=True, normalize=False)
img = x_train[0]
label = t_train[0]
print(label) # 5
print(img.shape) # (784,)
img = img.reshape(28, 28) # 把圖像的形狀變?yōu)樵瓉淼某叽?print(img.shape) # (28, 28)
img_show(img)
要注意的是,flatten=True時讀人的圖像是以一列(一維)NumPy數(shù)組的形式保存的。因此,顯示圖像時,需要把它變?yōu)樵瓉淼?8像素 x 28像素的形狀。可以通過reshape()方法的參數(shù)指定期望的形狀。。此外,還需要把保存為NumPy數(shù)組的圖像數(shù)據(jù)轉(zhuǎn)換為PIL用的數(shù)據(jù)對象,這個轉(zhuǎn)換處理由Image.fromarray()
來完成。
神經(jīng)網(wǎng)絡的推理處理
對這個MNIST數(shù)據(jù)集實現(xiàn)神經(jīng)網(wǎng)絡的推理處理。
神經(jīng)網(wǎng)絡的輸人層有784個神經(jīng)元,輸出層有10個神經(jīng)元。
輸人層的784這個數(shù)字來源于圖像大小的28x28=784,
輸出層的10這個數(shù)字來源于10類別分類(數(shù)字0到9,共10類別)。
此外,這個神經(jīng)網(wǎng)絡有2個隱藏層,第1個隱藏層有50個神經(jīng)元,第2個隱藏層有100個神經(jīng)元。
先定義get_data()、init_network()、predict() 這3個函數(shù)
def get data():
(x_train,t_train),(x_test,t_test) = load_mnist(normalize=True,flatten=True,one_hot_label=False)
return x_test, t_test
def init_network():
with open("sample_weight.pkl",'rb') as f:
network = pickle.load(f)
return netwrok
def predict(network, x):
W1,W2,w3 = network['W1'], network['W2'], network['w3']
bl,b2, b3 = network['b1'],network['b2'], network['b3']
a1 = np.dot(x,W1)+b1
z1 = sigmoid(a1)
a2 = np.dot(a1,W2) +b2
z2 = sigmoid(a2)
a3=np.dot(a2,W3)+b3
y = sigmoid(a3)
reutrn y
init_network()會讀入保存在pickle文件 sample_weight.pkl 中的學習到的權重參數(shù)
現(xiàn)在,用這3個函數(shù)來實現(xiàn)神經(jīng)網(wǎng)絡的推理處理。然后,評價它的識別精度即能在多大程度上正確分類。
# 獲取數(shù)據(jù)
x, t = get_data()
# 初始化network
network =init_network()
accuracy_cnt =0
for i in range(len(x)):
y = predict(network,x[i]) # predict()函數(shù)以NumPy數(shù)組的形式輸出各個標簽對應的概率
p=np.argmax(y) # 獲取概率最高的元素的索引
if p == t[i]:
accuracy_cnt += 1
print("Accuracy:" + str(float(accuracy_cnt) / len(x))) # 比較神經(jīng)網(wǎng)絡所測的答案和正確解標簽,將回答正確的概率作為識別精度。
目前這個代碼的精度還不是很高,后續(xù)會在神經(jīng)網(wǎng)絡的結(jié)構和學習方法上優(yōu)化來提高這個精度
把load_mnist函數(shù)的參數(shù)normalize設置成了True。將normalize設置成True后,函數(shù)內(nèi)部會進行轉(zhuǎn)換,將圖像的各個像素值除以255,使得數(shù)據(jù)的值在0.0~1.0的范圍內(nèi)。像這樣把數(shù)據(jù)限定到某個范圍內(nèi)的處理稱為正規(guī)化。這種對神經(jīng)網(wǎng)絡的輸人數(shù)據(jù)進行某種既定的轉(zhuǎn)換稱為預處理。文章來源:http://www.zghlxwxcb.cn/news/detail-491833.html
預處理在神經(jīng)網(wǎng)絡(深度學習)中非常實用,實際上,很多預處理都會考慮到數(shù)據(jù)的整體分布,比如,利用數(shù)據(jù)整體的均值或標準差,移動數(shù)據(jù),使數(shù)據(jù)整體以0為中心分布。文章來源地址http://www.zghlxwxcb.cn/news/detail-491833.html
到了這里,關于【深度學習】2-4 神經(jīng)網(wǎng)絡-手寫數(shù)字識別的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!