python-神经网络编程笔记摘要第二章

书名--《Python 神经网络编程》中文版,英文版《Make Your Own Neural Network》,第二章使用Ipython搭建了简单的三层神经网络,并使用其进行的手写数字体识别的实现,下面对原文中的代码,使用python实现,并进行解读。

第一章中的核心公式,在编程的过程当中可以非常容易的实现:

python-神经网络编程笔记摘要第二章_第1张图片

搭建的构架:

初始化函数——设定输入层节点,隐藏层节点,输出层节点数量,学习率

查询——即通过输入获得一组输出

训练——通过训练样本,不停的更新参数

import numpy as np 
import scipy.special as sci
import matplotlib.pyplot as plt 
class nn:
    #定义了神经网了规模,输入的数量,隐层的数量,输出的数量和学习率,初始化了权重
    def __init__(self,inputnodes,hiddennodes,outputnodes,learningrate):
        self.inodes = inputnodes
        self.hnodes = hiddennodes
        self.onodes = outputnodes
        self.learningrate = learningrate
        #使用正态分布随机初始化权重
        #wih 为输入到隐层的参数
        #wio 为隐层到输出的参数
        self.wih = np.random.normal(0.0,pow(self.inodes,0.5),(self.hnodes,self.inodes))
        self.who = np.random.normal(0.0,pow(self.hnodes,0.5),(self.onodes,self.hnodes))
        #定义激活函数
        self.activation = lambda x: sci.expit(x)

    def train(self,inputlist,targetlist):
        #将输入和输出转化成 二维的列向量用于计算
        inputs = np.array(inputlist,ndmin=2).T
        targets = np.array(targetlist,ndmin=2).T
        #计算隐层和输输出层的输出
        hinput = np.dot(self.wih,inputs)
        houtput = self.activation(hinput)
        finalinput = np.dot(self.who,houtput)
        finaloutput = self.activation(finalinput)
        #计算输出层和隐层的误差————即误差的反向传播
        outputerror = targets - finaloutput
        hiddenerror = np.dot(self.who.T,outputerror)
        #使用梯度更新参数
        self.who += self.learningrate*np.dot(outputerror*finaloutput*(1-finaloutput),np.transpose(houtput))
        self.wih += self.learningrate*np.dot(hiddenerror*houtput*(1-houtput),np.transpose(inputs))
        
    def query(self,inputlist):
        #正向传播计算输出层的输出
        inputs = np.array(inputlist,ndmin=2).T
        hinput = np.dot(self.wih,inputs)
        houtput = self.activation(hinput)
        finalinput = np.dot(self.who,houtput)
        finaloutput = self.activation(finalinput)
        return finaloutput
    
input_nodes = 784
hidden_nodes = 100
output_nodes = 10
learningrate = 0.2
epochs =7

training_data_file = open('book-py-nn/mnist_train.csv')
training_data_list = training_data_file.readlines()
training_data_file.close()

test_data_file = open('book-py-nn/mnist_test.csv')
test_data_list = test_data_file.readlines()
test_data_file.close()

n = nn(input_nodes,hidden_nodes,output_nodes,learningrate)

#进行训练,epochs为迭代整个数据集的轮次
#使用的mnist数据为处理过的 .csv数据
for i in range(epochs):
    for data in training_data_list:
        value = data.split(',')
        #获取该样本的标签————数据总的第一个数据是标签
        label = int(value[0])
        #利用标签制作输出的列向量,输出的范围在(0.01,0.99)
        target = np.zeros(output_nodes)+0.01
        target[label] = 0.99
        #处理输入数据,提取除了第一个数据的其他数据并缩放到(0.01,1)的范围
        inputs = (np.asfarray(value[1:])/255.0*0.99)+0.01
        #reshape到图片的大小,可以用显示图像
        image = inputs.reshape(28,28)
        #对该样本进行训练
        n.train(inputs,target)

#统计测试样本的数量和测试正确的数量
test_num=0
right_num = 0
for data in test_data_list:
    value = data.split(',')
    label = int(value[0])
    target = np.zeros(output_nodes)+0.01
    target[label] = 0.99
    inputs = (np.asfarray(value[1:])/255.0*0.99)+0.01
    image = inputs.reshape(28,28)
    predict =  list(n.query(inputs))
    predict_lable = predict.index(max(predict))
    if predict_lable==label:
        right_num+=1
    else:
        pass
        # print(predict_lable ,label)
    test_num+=1
#epoch=1:acc is  0.7861
#epoch=7:acc is  0.8314
print("acc is ",float(right_num)/float(test_num))   

上述代码只是简单的三层神经网络的搭建,没有使用其他的训练方法和进行调参,只是说明了原理的实现。

原文中的结果是0.96以上了,可能是自己写的有点问题,参考即可,可以阅读原书,里面说的比较清楚,还进行了调参的说明。

原著内容少,讲解的比较深刻,我的总结不是特别全面,建议花一两天过一次。

你可能感兴趣的:(深度学习)