python实现简单的3层神经网络识别手写数字

import numpy as np
import scipy.special
import scipy.misc
class neural_Network(object):
    #类的初始化的方法
    def __init__(self,inputnodes,hidenodes,outnodes,learnrate):
        #输入节点
        self.inodes = inputnodes
        #隐藏节点
        self.hnodes = hidenodes
        #输入节点
        self.onodes = outnodes
        #学习率
        self.lr = learnrate
        #初始化的输入的权重矩阵
        self.wih = np.random.normal(0.0,pow(self.hnodes,-0.5),(self.hnodes,self.inodes))
        #初始化的输出的权重矩阵
        self.who = np.random.normal(0.0,pow(self.onodes,-0.5),(self.onodes,self.hnodes))
        # 阈值函数
        self.activation_fuction = lambda x:scipy.special.expit(x)
    #训练函数,更新权重
    def train(self,input_list,target_list):
        #输入的矩阵
        inputs = np.array(input_list,ndmin=2).T
        #预计的输出的矩阵
        targets = np.array(target_list,ndmin=2).T
        #隐藏节点的输入
        hidden_input = np.dot(self.wih,inputs)
        #隐藏节点的输出
        hidden_output = self.activation_fuction(hidden_input)
        #输出节点的输入
        final_input = np.dot(self.who,hidden_output)

        #输出节点的输出
        final_output = self.activation_fuction(final_input)
        #结果与预计结果的差值(误差)
        #print(final_output)
        output_error = targets - final_output
        #print(output_error)
        #隐藏节点的输出的误差
        hidden_error = np.dot(self.who.T,output_error)
        #更新输出权重
        self.who += self.lr * np.dot(output_error*final_output*(1.0-final_output),np.transpose(hidden_output))
        #更新输入权重
        self.wih += self.lr * np.dot(hidden_error*hidden_output*(1.0-hidden_output),np.transpose(inputs))
    #计算函数
    def query(self,input_list):
        #输入的矩阵
        inputs = np.array(input_list,ndmin=2).T
        #隐藏节的输入
        hidden_inputs = np.dot(self.wih,inputs)
        #隐藏节点的输出
        hidden_outputs = self.activation_fuction(hidden_inputs)
        #输出节点的输入
        final_inputs = np.dot(self.who,hidden_outputs)
        #输出节点的输出
        final_outputs = self.activation_fuction(final_inputs)
        #返回输出的值
        return final_outputs



if __name__ == '__main__':
    #输入节点,像素为28*28共784
    input_nodes = 784
    #隐藏节点,100层
    hidden_nodes = 100
    #输出节点10个,0-9
    output_nodes = 10
    #学习率
    lr = 0.2
    #初始化nt
    nt = neural_Network(input_nodes, hidden_nodes, output_nodes, lr)
    #开始训练
    training_data_file = open("mnist_train_2600.csv", 'r')
    training_data_list = training_data_file.readlines()
    training_data_file.close()
    for record in training_data_list:
        all_values = record.split(',')
        inputs = (np.asfarray(all_values[1:]) / 255.0 * 0.99) + 0.01
        targets = np.zeros(output_nodes) + 0.01
        targets[int(all_values[0])] = 0.99
        nt.train(inputs, targets)
    #手写图像识别
    #scipy no moudle imread报错卸载安装旧版本
    img_array = scipy.misc.imread('4.png', flatten=True)
    #调整色度
    img_data = 255.0 - img_array.reshape(784)
    #归一
    img_data = (img_data / 255.0 * 0.99) + 0.01
    #测试
    result = nt.query(img_data)
    #测试结果
    print('图片数字为:'+str(np.argmax(result)))

你可能感兴趣的:(Python,神经网络)