基于《Python神经网络编程》实现数据集MNIST识别

原理见上一节

读入数据集:

# load the mnist test data CSV file into a list
test_data_file = open("mnist_dataset/mnist_test.csv", 'r')
test_data_list = test_data_file.readlines()#用列表进行储存,每个元素代表一行
test_data_file.close()

打印二维化数字组成的字符:

all_values = test_data_list[1].split(',')
print(len(all_values))

将第一行按 ‘ , ’ 拆分并储存到变量中:结果为785
因为第一个字符为标签,代表是数字几,其余为28*28=784

用asfarray将储存的文本字符串转换为实数数字,并创建28*28的数组列表。

image_array = numpy.asfarray(all_values[1:]).reshape((28,28))
matplotlib.pyplot.imshow(image_array, cmap='Greys', interpolation='None')

在这里插入图片描述

准备mnist数据集

为了加速神经网络的训练,将数据范围进行缩放,将原来的0-255缩放至0.01到1的范围。
即:0对应0.01,255对应1
通过 x / 255 × 0.99 + 0.01 x/255\times0.99+0.01 x/255×0.99+0.01 完成

scaled_input = (numpy.asfarray(all_values[1:]) / 255.0 * 0.99) + 0.01
print(scaled_input)

设计神经网络

目标:根据输入的字符串识别表示的数字
相当于做一个类别为10的分类问题,故设计的神经网络共10个输出节点。
784个输入节点,100个隐藏层节点,10个输出节点。
通过激活函数来进行分辨,并0.01和0.99来代替0和1。

onodes = 10#设置输出节点数为10
targets = numpy.zeros(onodes) + 0.01 #设置目标列表
targets[int(all_values[0])] = 0.99 #对目标列表赋值,对应数字几的那一列为0.99,其余为0.01

完成的神经网络:

import numpy
import pylab
import scipy.special
import matplotlib.pyplot


# neural network class definition
class neuralNetwork:

    #初始化:设置节点数、权重赋值、设置激活函数
    def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate):
        # set number of nodes in each input, hidden, output layer
        self.inodes = inputnodes
        self.hnodes = hiddennodes
        self.onodes = outputnodes

        # link weight matrices, wih and who
        # weights inside the arrays are w_i_j, where link is from node i to node j in the next layer
        # w11 w21
        # w12 w22 etc
        self.wih = numpy.random.normal(0.0, pow(self.inodes, -0.5), (self.hnodes, self.inodes))#随机赋初始权重w_i
        self.who = numpy.random.normal(0.0, pow(self.hnodes, -0.5), (self.onodes, self.hnodes))#随机赋初始权重w_h

        # learning rate
        self.lr = learningrate

        # activation function is the sigmoid function
        self.activation_function = lambda x: scipy.special.expit(x)#设置激活函数

        pass

    #定义训练神经网络的执行函数,1、正向求输出和期望的误差;2、反向更新激活函数
    def train(self, inputs_list, targets_list):
        # convert inputs list to 2d array
        inputs = numpy.array(inputs_list, ndmin=2).T
        targets = numpy.array(targets_list, ndmin=2).T

        hidden_inputs = numpy.dot(self.wih, inputs)#隐藏层用输入求和
        hidden_outputs = self.activation_function(hidden_inputs)#结果用激活函数

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

        output_errors = targets - final_outputs#计算输出层误差
        # hidden layer error is the output_errors, split by weights, recombined at hidden nodes
        hidden_errors = numpy.dot(self.who.T, output_errors)

        #更新隐藏层与输出层权重
        self.who += self.lr * numpy.dot((output_errors * final_outputs * (1.0 - final_outputs)),
                                        numpy.transpose(hidden_outputs))

        #更新输入层与隐藏层权重
        self.wih += self.lr * numpy.dot((hidden_errors * hidden_outputs * (1.0 - hidden_outputs)),
                                        numpy.transpose(inputs))

        pass

    # query the neural network
    def query(self, inputs_list):
        # convert inputs list to 2d array
        inputs = numpy.array(inputs_list, ndmin=2).T

        # calculate signals into hidden layer
        hidden_inputs = numpy.dot(self.wih, inputs)
        # calculate the signals emerging from hidden layer
        hidden_outputs = self.activation_function(hidden_inputs)

        # calculate signals into final output layer
        final_inputs = numpy.dot(self.who, hidden_outputs)
        # calculate the signals emerging from final output layer
        final_outputs = self.activation_function(final_inputs)

        return final_outputs

测试神经网络

  1. 用100条数据进行训练
  2. 用10条数据进行测试
#设置并创建神经网络参数
input_nodes = 784
hidden_nodes = 100
output_nodes = 10
learning_rate = 0.3

n = neuralNetwork(input_nodes,hidden_nodes,output_nodes, learning_rate)

# 训练神经网络:用100个数据作为训练集,加载后循环训练集每一个,并将每个都处理输入和目标值,带入神经网络进行训练
training_data_file = open("mnist_train_100.csv", 'r')
training_data_list = training_data_file.readlines()
training_data_file
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值