1. 程式人生 > >【深度學習】基於Numpy實現的神經網路進行手寫數字識別

【深度學習】基於Numpy實現的神經網路進行手寫數字識別

直接先用前面設定的網路進行識別,即進行推理的過程,而先忽視學習的過程。

推理的過程其實就是前向傳播的過程。

深度學習也是分成兩步:學習 + 推理。學習就是訓練模型,更新引數;推理就是用學習到的引數來處理新的資料。

from keras.datasets.mnist import load_data
import pickle

def sigmoid(x):
  return 1 / (1 + np.exp(-x))

# 防止溢位型
def softmax(x):
  c = np.max(x)
  exp_x = np.exp(x - c)
  sum_exp_x =
np.sum(exp_x) return exp_x / sum_exp_x def get_data(): (X_train, y_train), (X_test, y_test) = load_data() return X_test.reshape(10000, 784), y_test def init_network(): # https://github.com/Bingyy/deep-learning-from-scratch/blob/master/ch03/sample_weight.pkl with open('sample_weight.pkl', 'rb') as f:
network = pickle.load(f) return network # 儲存的是網路引數字典 network = init_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_test, y_test = get_data() # 得到測試資料 network = init_network() accuracy_cnt = 0 for i in range(len(X_test)): y = predict(network, X_test[i]) p = np.argmax(y) if p == y_test[i]: accuracy_cnt += 1 print('準確率:', str(float(accuracy_cnt) / len(X_test))) # 準確率: 0.9207

這裡用到的網路還是三層網路,只是第一個隱藏層有50個神經元,第二個隱藏層有100個神經元,引數是作者提供的已經訓練好的網路權重。本篇的目的是為了熟練使用已經訓練好的模型。

網路對應的陣列結構

在這裡插入圖片描述

要點總結:

  • 使用keras提供的load_data載入mnist資料
  • 使用pickle載入儲存的網路權重
  • 基於權重組建全連線網路
  • 使用網路進行資料預測,並統計正確率

上面是一次讀取一張圖片,如果批量處理是如何進行的呢?

在這裡插入圖片描述

X_test, y_test = get_data() # 得到測試資料
network = init_network()

batch_size = 100
accuracy_cnt = 0

for i in range(0, len(X_test), batch_size):
  x_batch = X_test[i:i+batch_size]
  y_batch = predict(network, x_batch)
  p = np.argmax(y_batch, axis=1)
  accuracy_cnt += np.sum(p == y_test[i:i+batch_size])
  
print('準確率:', str(float(accuracy_cnt) / len(X_test)))
 

這裡只是如何取資料有變化,然後預測時還是用原來的predict函式。

另外,這裡再講一下軸的問題:

x = np.array([[0.1, 0.8, 0.1], [0.3, 0.1, 0.6], [0.2, 0.5, 0.3], [0.8, 0.1, 0.1]])
y = np.argmax(x, axis=1) # array([1, 2, 1, 0])

取出的是每一行的最大值下標。

END.

參考:

《深度學習入門:基於Python的理論與實現》