8、神經網路

發呆少女發表於2020-12-18
'''
預測手寫數字
使用多類logistic迴歸不能形成更復雜的假設,因為它只是一個線性分類器。
神經網路可以實現非常複雜的非線性的模型。
利用已經訓練好了的權重進行預測。
'''
import numpy as np
from scipy.io import loadmat


# 載入權重資料
def load_weight(path):
    data = loadmat(path)
    return data['Theta1'], data['Theta2']


# 載入權重資料
theta1, theta2 = load_weight('data/ex3weights.mat')


# print(theta1.shape, theta2.shape)  # (25, 401) (10, 26)


# 載入資料集
def load_data(path):
    data = loadmat(path)  # loadmat讀取mat檔案
    # 這裡的資料為MATLAB的格式,所以要使用SciPy.io的loadmat函式
    X = data['X']
    y = data['y']
    return X, y


# 載入資料集
X, y = load_data('data/ex3data1.mat')
y = y.flatten()  # 轉為一維向量
X = np.insert(X, 0, values=np.ones(X.shape[0]), axis=1)  # np.ones(n) 返回一個元素值全為1的n維向量


# print(X.shape, y.shape)  # (5000, 401) (5000,)

# sigmoid函式
def sigmoid(z):
    return 1 / (1 + np.exp(-z))


# 神經網路計算
a1 = X  # 第一層神經元
z2 = a1 @ theta1.T
z2 = np.insert(z2, 0, 1, axis=1)
a2 = sigmoid(z2)  # 第二層神經元
# print(a2.shape)  # (5000, 26)
z3 = a2 @ theta2.T
a3 = sigmoid(z3)  # 第三層神經元
# print(a3.shape)  # (5000, 10)

# 計算準確率
y_pred = np.argmax(a3, axis=1) + 1  # 按行取最大值的索引值,加一是因為索引從0開始
# print(y_pred.shape)  # (5000,)
accuracy = np.mean(y_pred == y)
print('accuracy={}%'.format(accuracy * 100)) # accuracy=97.52%

執行結果:

accuracy=97.52%

相關文章