tft每日頭條

 > 生活

 > 機器學習手寫數字識别屬于什麼

機器學習手寫數字識别屬于什麼

生活 更新时间:2025-02-07 23:01:16

對于深度學習來說,手寫數字識别和編程語言第一程式打印hello word應該屬于一個級别的了,下面先看下手寫數字識别的網絡會是什麼樣子,然後以此學習幾個概念。

MNIST 數據集見上文深度學習入門初探——hello word式的手寫數字識别一

2 手寫數字識别的推理處理

推理處理呢也稱為神經網絡的前向傳播,這裡假設訓練已經結束,神經網絡是個現成的,存儲在sample_weight.pkl這個文件中。來看看這個網絡是個什麼樣子哈。

數據的加載上一節已經介紹過了,現在來看看sample_weight.pkl這個網絡所呈現的樣子:

a、輸入數據是是28*28像素的灰度圖,shape成一維的就是784個數據。

b、輸入層的神經元和數據一緻,784個神經元。産生了50個特征,這個50是可以設計的。

c、接下來的一層為了和輸入層産生的輸出,這個就必須是50個神經元了,産生了100個特征,也是可以設計的。

d、輸出層就隻能是100個神經元了,因為這一層就要輸出最終結果了,隻能是10了,意即0-9共10個類别。

關于激活每一層的激活函數以及最後的softmax函數可參見下面兩節的實現,獨熱碼在這裡利于概率化的輸出:

深度學習入門初探——簡單的激活函數

深度學習入門初探——多層感知機的神經網絡式實現

# coding: utf-8 import sys, os sys.path.append(os.pardir) import numpy as np import pickle from common.functions import sigmoid, softmax def _change_one_hot_label(X): T = np.zeros((X.size, 10)) for idx, row in enumerate(T): row[X[idx]] = 1 return T def load_mnist(normalize=True, flatten=True, one_hot_label=False): """讀入MNIST數據集 Parameters ---------- normalize : 将圖像的像素值正規化為0.0~1.0 one_hot_label : one_hot_label為True的情況下,标簽作為one-hot數組返回 one-hot數組是指[0,0,1,0,0,0,0,0,0,0]這樣的數組 flatten : 是否将圖像展開為一維數組 Returns ------- (訓練圖像, 訓練标簽), (測試圖像, 測試标簽) """ with open("mnist.pkl", 'rb') as f: dataset = pickle.load(f) if normalize: for key in ('train_img', 'test_img'): dataset[key] = dataset[key].astype(np.float32) dataset[key] /= 255.0 if one_hot_label: dataset['train_label'] = _change_one_hot_label(dataset['train_label']) dataset['test_label'] = _change_one_hot_label(dataset['test_label']) if not flatten: for key in ('train_img', 'test_img'): dataset[key] = dataset[key].reshape(-1, 1, 28, 28) return (dataset['train_img'], dataset['train_label']), (dataset['test_img'], dataset['test_label']) 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 network def predict(network, x): W1, W2, W3 = network['W1'], network['W2'], network['W3'] b1, b2, b3 = network['b1'], network['b2'], network['b3'] a1 = np.dot(x, W1) b1 z1 = sigmoid(a1) a2 = np.dot(z1, W2) b2 z2 = sigmoid(a2) a3 = np.dot(z2, W3) b3 y = softmax(a3) return y np.set_printoptions(formatter={'float': '{: 0.9f}'.format}) x, t = get_data() network = init_network() print("\n\n輸入數據的維度 :",x[0].shape, "\n") print("輸入層的神經元 w b :",network['W1'].shape, " ",network['b1'].shape, "\n") print("隐藏層的神經元 w b :",network['W2'].shape, " ",network['b2'].shape, "\n") print("輸出層的神經元 w b :",network['W3'].shape, " ",network['b3'].shape, "\n") y = predict(network, x[0]) print("預測的輸出softmax概率:\n",y, "\n") p= np.argmax(y) print("預測的結果: ",p, "\n", "\n", "\n")

機器學習手寫數字識别屬于什麼(深度學習入門初探)1


3 批處理

神經網絡的輸入不是一個個圖像了,而是多個圖像,上圖中輸入數據的維度就是[batch_size,784],矩陣乘法的規則這個batch_size是一直傳遞下去的,這裡注意下,結果數據在取最大值索引時的維度即可。

這個批的大小跟在計算機系統的内存和算力很大關系,同時在訓練的過程中批處理也有很多好處的,這個後面遇到了再學習。

# coding: utf-8 import sys, os sys.path.append(os.pardir) import numpy as np import pickle from common.functions import sigmoid, softmax def _change_one_hot_label(X): T = np.zeros((X.size, 10)) for idx, row in enumerate(T): row[X[idx]] = 1 return T def load_mnist(normalize=True, flatten=True, one_hot_label=False): with open("mnist.pkl", 'rb') as f: dataset = pickle.load(f) if normalize: for key in ('train_img', 'test_img'): dataset[key] = dataset[key].astype(np.float32) dataset[key] /= 255.0 if one_hot_label: dataset['train_label'] = _change_one_hot_label(dataset['train_label']) dataset['test_label'] = _change_one_hot_label(dataset['test_label']) if not flatten: for key in ('train_img', 'test_img'): dataset[key] = dataset[key].reshape(-1, 1, 28, 28) return (dataset['train_img'], dataset['train_label']), (dataset['test_img'], dataset['test_label']) 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 network def predict(network, x): w1, w2, w3 = network['W1'], network['W2'], network['W3'] b1, b2, b3 = network['b1'], network['b2'], network['b3'] a1 = np.dot(x, w1) b1 z1 = sigmoid(a1) a2 = np.dot(z1, w2) b2 z2 = sigmoid(a2) a3 = np.dot(z2, w3) b3 y = softmax(a3) return y x, t = get_data() network = init_network() batch_size = 100 # 批數量 accuracy_cnt = 0 for i in range(0, len(x), batch_size): x_batch = x[i:i batch_size] y_batch = predict(network, x_batch) p = np.argmax(y_batch, axis=1) accuracy_cnt = np.sum(p == t[i:i batch_size]) print("Accuracy:" str(float(accuracy_cnt) / len(x)))

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2025 - www.tftnews.com All Rights Reserved