四:神经网络(识别手写字)

结合《python神经网络编程》这本书实现代码,个人认为最近几年出的实战系列书,给出的代码和思路更加贴切现在的技术,吴恩达课程讲解很棒但是很多资料和代码或者思想比较老化,不便于吸收理解。

一:主函数

#一个三层的简单神经网络实现
import numpy as np
import scipy.special
import mnist_train as mtr
import mnist_test  as mte

class neuarlNetwork:
    #初始化函数--设定输入层节点,隐藏层节点和输出层节点的数量
    def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate):
        #设定输入层节点,隐藏层节点,输出层节点的数量
        self.inodes = inputnodes
        self.hnodes = hiddennodes
        self.onodes = outputnodes

        #学习效率
        self.lr = learningrate

        #权重矩阵(-0.5,是希望权重的范围可以在-0.5-0.5之间)
        self.wih = (np.random.rand(self.hnodes, self.inodes) - 0.5)
        self.who = (np.random.rand(self.onodes, self.hnodes) - 0.5)

        #定义S函数
        self.activation_function = lambda x:scipy.special.expit(x)
        pass

    #训练--学习给定训练集样本后,优化权重
    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.wih,inputs)
        hidden_outputs = self.activation_function(hidden_inputs)

        final_inputs = np.dot(self.who,hidden_outputs)
        final_outputs = self.activation_function(final_inputs)

        #误差
        output_errors = targets - final_outputs
        #隐含层节点反向传播的误差
        hidden_errors = np.dot(self.who.T,output_errors)

        #更新隐藏层和最终层之间的权重
        self.who += self.lr * np.dot((output_errors * final_outputs * (1.0 - final_outputs)),np.transpose(hidden_outputs))
        #更新输入层和隐藏层之间的权重
        self.wih += self.lr * np.dot((hidden_errors * hidden_outputs * (1.0 - hidden_outputs)),np.transpose(inputs))
        pass

    #查询--给定输入,从输出节点给出答案
    def query(self,inputs_list):
        #输入层的初始输入值,需要转置为一个列向量即n行1列的矩阵
        inputs = np.array(inputs_list,ndmin=2).T #ndmin生成一个二维数组

        hidden_inputs = np.dot(self.wih,inputs)
        hidden_outputs = self.activation_function(hidden_inputs)

        final_inputs = np.dot(self.who,hidden_outputs)
        final_outputs = self.activation_function(final_inputs)

        return final_outputs
        pass

    pass

input_nodes = 784
hidden_nodes = 100
output_nodes = 20
learning_rate = 0.3

#创建神经网络的实例
n = neuarlNetwork(input_nodes,hidden_nodes,output_nodes,learning_rate)

#浏览训练数据集中的所有记录
for record in mtr.train_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
    n.train(inputs,targets)
    pass

#测试集测试
#记录网络执行的情况最初为空
scorecard = []

for record in mte.test_data_list:
    all_values = record.split(',')
    correct_label = int(all_values[0]) #目标值(正确答案)
    inputs = (np.asfarray(all_values[1:])/255.0 * 0.99) + 0.01
    outputs = n.query(inputs)
    label = np.argmax(outputs) #返回沿轴最大值的索引
    if(label == correct_label):
        scorecard.append(1)
    else:
        scorecard.append(0)
        pass
    pass
#将测试成绩作为分数打印出来
scorecard_array = np.asarray(scorecard)
print("performance = ",scorecard_array.sum() / scorecard_array.size)
#print(mnist.mnist_a)

二:mnist_train.py(训练集)

import numpy as np
import matplotlib.pyplot as plt

train_data_file = open(r"D:\project\python神经网络编程\数据集\mnist_train.csv", 'r')
train_data_list = train_data_file.readlines()
train_data_file.close()

三:mnist_test.py(测试集)

import numpy as np
import matplotlib.pyplot as plt

test_data_file = open(r"D:\project\python神经网络编程\数据集\mnist_test.csv", 'r')
test_data_list = test_data_file.readlines()
test_data_file.close()

all_values = test_data_list[0].split(',')

 

 

发布了40 篇原创文章 · 获赞 4 · 访问量 5175

猜你喜欢

转载自blog.csdn.net/worewolf/article/details/98956018