1. 程式人生 > 其它 >手寫三層神經網路完成手寫體識別任務

手寫三層神經網路完成手寫體識別任務

import numpy as np
import numpy.random
import scipy.special


class NeuralNetwork:

    # initialise the neural network
    def __init__(self, input_nodes_num, hidden_nodes_num, output_nodes_num, lr):
        # 初始化神經元個數,可以直接修改
        self.input_nodes = input_nodes_num
        self.hidden_nodes = hidden_nodes_num
        self.output_nodes 
= output_nodes_num self.learning_rate = lr # 初始化權重值,利用正態分佈函式進行隨機初始化,均值為0,方差為神經元個數開方 self.w_input_hidden = numpy.random.normal(0.0, pow(self.hidden_nodes, -0.5), (self.hidden_nodes, self.input_nodes)) self.w_hidden_output
= numpy.random.normal(0.0, pow(self.output_nodes, -0.5), (self.output_nodes, self.hidden_nodes)) # 初始化啟用函式,啟用函式選用Sigmoid函式,更加平滑,接近自然界的神經元行為模式 # lambda定義了一個匿名函式 self.activation_function = lambda x: scipy.special.expit(x)
pass # train the neural network def train(self, inputs_list, targets_list): # 將訓練集和測試集中的資料轉化為列向量 inputs = np.array(inputs_list, ndmin=2).T targets = np.array(targets_list, ndmin=2).T # 隱藏層的輸入為訓練集與權重值的點乘,輸出為啟用函式的輸出 hidden_inputs = np.dot(self.w_input_hidden, inputs) hidden_outputs = self.activation_function(hidden_inputs) # 輸出層的輸入為隱藏層的輸出,輸出為最終結果 final_inputs = np.dot(self.w_hidden_output, hidden_outputs) final_outputs = self.activation_function(final_inputs) # 損失函式 output_errors = targets - final_outputs # 隱藏層的誤差為權值矩陣的轉置與輸出誤差的點乘 hidden_errors = np.dot(self.w_hidden_output.T, output_errors) # 對權值進行更新 self.w_hidden_output += self.learning_rate * np.dot((output_errors * final_outputs * (1.0 - final_outputs)), np.transpose(hidden_outputs)) self.w_input_hidden += self.learning_rate * np.dot((hidden_errors * hidden_outputs * (1.0 - hidden_outputs)), np.transpose(inputs)) pass # query the neural network def query(self, inputs_list): # 轉置將行向量轉成列向量,將每組資料更好的分隔開來,方便後續矩陣點乘操作 inputs = np.array(inputs_list, ndmin=2).T # 加權求和後經過sigmoid函式得到隱藏層輸出 hidden_inputs = np.dot(self.w_input_hidden, inputs) hidden_outputs = self.activation_function(hidden_inputs) # 加權求和後經過sigmoid函式得到最終輸出 final_inputs = np.dot(self.w_hidden_output, hidden_outputs) final_outputs = self.activation_function(final_inputs) # 得到輸出資料列 return final_outputs # 初始化各層神經元個數,期中輸入神經元個數取決於讀入的因變數,而輸出神經元個數取決於分類的可能性個數 input_nodes = 784 hidden_nodes = 500 output_nodes = 10 # 學習率,每次調整步幅大小 learning_rate = 0.2 n = NeuralNetwork(input_nodes, hidden_nodes, output_nodes, learning_rate) # 獲取訓練集資訊 training_data_file = open('data/mnist_train.csv', 'r') training_data_list = training_data_file.readlines() training_data_file.close() for record in training_data_list: all_values = record.split(',') inputs = (numpy.asfarray(all_values[1:]) / 255.0 * 0.99) + 0.01 targets = numpy.zeros(output_nodes) + 0.01 targets[int(all_values[0])] = 0.99 n.train(inputs, targets) pass print('train successful!') test_file = open('data/mnist_test.csv', 'r') test_list = test_file.readlines() test_file.close() m = np.size(test_list) j = 0.0 for record in test_list: test_values = record.split(',') np.asfarray(test_values) results = n.query(np.asfarray(test_values[1:])) if results[int(test_values[0])] == max(results): j += 1 pass print("正確率為;" + str(j/m))