200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > 神经网络——实现MNIST数据集的手写数字识别

神经网络——实现MNIST数据集的手写数字识别

时间:2019-01-13 18:43:20

相关推荐

神经网络——实现MNIST数据集的手写数字识别

由于官网下载手写数字的数据集较慢,因此提供便捷下载地址如下

手写数字的数据集MNIST下载:/download/gaoyu1253401563/10891997

数据集包含如下:

一、使用小规模数据集进行神经网络的训练和测试

数据集:

mnist_train_100.csv :100个样本

mnist_test_10.csv :10个样本

1、数据集分析

如下为mnist_train_100.csv开始的2-3行:

存储数据的文件成为CSV文件,每一个吗值都是由逗号分隔,对于每行(最左边有行号)的数值,开头的第一个在值是标签,即书写者希望表示的数字,如第一行的 “5”、第二行的 “0”。随后的784个值,由逗号分隔,是手写数字的像素值,像素数组的尺寸是28*28(即784),这784个像素值是手写数字的28*28的图片对应的784个位置的像素值。

注意:正常情况下0指的是黑色,255指的是白色,但是MNIST数据集使用相反的方式表示。

通过以下程序根据数据显示图片。

# 读入手写字体数据集(小数据集:mnist_train_100.csv)import numpy as npimport matplotlib.pyplot as pltdata_file = open("mnist_dataset/mnist_train_100.csv", 'r')data_list = data_file.readlines()data_file.close()all_values = data_list[1].split(',')#np.asfarray()函数:返回转换为float类型的数组image_array = np.asfarray(all_values[1:]).reshape((28,28))plt.imshow(image_array, cmap = 'Greys', interpolation = 'None')

2、数据集中数据的处理

需要做的第一件事是将输入颜色值从较大的0到255的范围,缩放到较小的0.01到1.0的范围,选择0.01作为范围的最小值,是为了避免0值输入最终会造成权重更新的失败。

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

输出结果如下:

[0.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.2080.62729412 0.99223529 0.62729412 0.204117650.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.19635294 0.9340.98835294 0.98835294 0.98835294 0.93011765 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.21964706 0.89129412 0.99223529 0.98835294 0.937882350.91458824 0.98835294 0.23129412 0.03329412 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.04882353 0.24294118 0.879647060.98835294 0.99223529 0.98835294 0.79423529 0.33611765 0.988352940.99223529 0.48364706 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.64282353 0.98835294 0.98835294 0.98835294 0.992235290.98835294 0.98835294 0.38270588 0.74376471 0.99223529 0.658352940.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.2080.9340.99223529 0.99223529 0.74764706 0.45258824 0.99223529 0.895176470.19247059 0.31670588 1. 0.66223529 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.19635294 0.9340.98835294 0.98835294 0.704941180.05658824 0.30117647 0.47976471 0.09152941 0.01 0.010.99223529 0.95341176 0.20411765 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.15752941 0.650588240.99223529 0.91458824 0.81752941 0.33611765 0.01 0.010.01 0.01 0.01 0.01 0.99223529 0.988352940.65058824 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.03717647 0.70105882 0.98835294 0.94176471 0.285647060.08376471 0.11870588 0.01 0.01 0.01 0.010.01 0.01 0.99223529 0.98835294 0.76705882 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.231294120.98835294 0.98835294 0.25458824 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.99223529 0.98835294 0.76705882 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.77870588 0.99223529 0.747647060.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 1. 0.992235290.77094118 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.30505882 0.96505882 0.98835294 0.44482353 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.99223529 0.98835294 0.58458824 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.34 0.988352940.90294118 0.10705882 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.03717647 0.534117650.99223529 0.73211765 0.05658824 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.34 0.98835294 0.87576471 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.03717647 0.51858824 0.98835294 0.88352941 0.285647060.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.34 0.98835294 0.57294118 0.01 0.01 0.010.01 0.01 0.01 0.01 0.19635294 0.650588240.98835294 0.68164706 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.34388235 0.992235290.88352941 0.01 0.01 0.01 0.01 0.010.01 0.45258824 0.9340.99223529 0.63894118 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.34 0.98835294 0.97670588 0.576823530.19635294 0.12258824 0.34 0.70105882 0.88352941 0.992235290.87576471 0.65835294 0.22741176 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.34 0.98835294 0.98835294 0.98835294 0.89905882 0.844705880.98835294 0.98835294 0.98835294 0.77094118 0.51470588 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.11870588 0.782588240.98835294 0.98835294 0.99223529 0.98835294 0.98835294 0.914588240.57294118 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.10705882 0.50694118 0.988352940.99223529 0.98835294 0.55741176 0.15364706 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01]

3、构建目标矩阵

我们要求神经网络对图像进行分类,分配正确的标签,这些标签是0到9共10个数字中的一个,这意味着神经网络应该有10个输出层节点,每个节点对应一个可能的答案或标签,例如:如果答案是“0”,输出层第一个节点激发,而其余的输出节点则保持抑制状态。如下图所示:对于example“0”,可以看出输出层的最大信号来自于标签为“0”的节点,其余的输出节点产生非常小的信号输出。通常我们使用最大信号的输出节点对应的标签作为答案。

如果训练样本的标签为“0”,则需要创建输出节点的目标数组,其中除了对应于标签“0”的节点,其余所有的节点的值都应该很小,例如 [0.99,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01]

如下程序所示,根据目标数组,使用python实现目标数组

onodes = 10targets = np.zeros(onodes) + 0.01targets[int(all_values[0])] = 0.99targets

输出结果如下:

4、神经网络的实现

设计神经网络

import numpy as npimport scipy.special as Simport matplotlib.pyplot as pltclass neuralNetwork:#初始化神经网络,构造函数def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate):#设置每个输入、隐藏、输出层中的节点数(三层的神经网络)self.inodes = inputnodesself.hnodes = hiddennodesself.onodes = outputnodes#链接权重矩阵,wih和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 = 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.lr = learningrate#创建激活函数(函数的另一种定义方法,这样以后可以直接调用)self.activation_function = lambda x: S.expit(x)pass#训练神经网络def train(self, inputs_list, targets_list):#将输入列表转换成二维数组inputs = np.array(inputs_list, ndmin = 2).Ttargets = 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)#计算输出层的误差:(target - actual)(预期目标输出值-实际计算得到的输出值)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一般用于占位置,定义一个空函数程序会报错,当没有想好函数的内容可以用pass填充,使得程序正常运行pass#查询神经网络:接受神经网络的输入,返回神经网络的输出def query(self, inputs_list):#将输入列表转换成二维数组inputs = np.array(inputs_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)#返回输出层的输出值return final_outputs

初始化参数,类的实例化

input_nodes = 784hidden_nodes = 100output_nodes = 10learning_rate = 0.3n = neuralNetwork(input_nodes, hidden_nodes, output_nodes, learning_rate)

加载训练数据的CSV文件到程序中

training_data_file = open("mnist_dataset/mnist_train_100.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.01targets = np.zeros(output_nodes) + 0.01targets[int(all_values[0])] = 0.99n.train(inputs, targets)pass

测试训练后的神经网络模型

test_data_file = open("mnist_dataset/mnist_test_10.csv", 'r')test_data_list = test_data_file.readlines()test_data_file.close()all_values = test_data_list[0].split(',')image_array = np.asfarray(all_values[1:]).reshape((28,28))plt.imshow(image_array, cmap='Greys', interpolation = 'None')n.query((np.asfarray(all_values[1:]) / 255.0*0.99) + 0.01)

测试的单个数据对应的数字:

输出结果:

分析:由结果可知,节点的最大输出信号对应标签“7”,因此将此结果作为答案,即判断测试数据集中的这个手写数字是7。可以发现,这个结果不是太令人满意,因为答案对应的输出信号值不是很大,因为我们使用的数据集太小,因此进行二的实验。

二、完整数据集进行神经网络的训练和测试

数据集:

mnist_train.csv :60000个样本

mnist_test.csv :10000个样本

1、神经网络的设计

import numpy as npimport scipy.special as Simport matplotlib.pyplot as pltclass neuralNetwork:#初始化神经网络,构造函数def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate):#设置每个输入、隐藏、输出层中的节点数self.inodes = inputnodesself.hnodes = hiddennodesself.onodes = outputnodes#链接权重矩阵,wih和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 = 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.lr = learningrate#创建激活函数(函数的另一种定义方法,这样以后可以直接调用)self.activation_function = lambda x: S.expit(x)pass#训练神经网络def train(self, inputs_list, targets_list):#将输入列表转换成二维数组inputs = np.array(inputs_list, ndmin = 2).Ttargets = 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)#计算输出层的误差:(target - actual)(预期目标输出值-实际计算得到的输出值)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一般用于占位置,定义一个空函数程序会报错,当没有想好函数的内容可以用pass填充,使得程序正常运行pass#查询神经网络:接受神经网络的输入,返回神经网络的输出def query(self, inputs_list):#将输入列表转换成二维数组inputs = np.array(inputs_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)#返回输出层的输出值return final_outputs

2、参数设置

input_nodes = 784hidden_nodes = 200output_nodes = 10learning_rate = 0.3n = neuralNetwork(input_nodes, hidden_nodes, output_nodes, learning_rate)

3、导入mnist的训练数据集

#将mnist的训练数据CSV文件加载到一个列表中training_data_file = open("mnist_dataset/mnist_train.csv", 'r')training_data_list = training_data_file.readlines()training_data_file.close()

4、训练神经网络

#训练神经网络#epochs是用于训练数据集的次数,有些人把训练一次叫做一个世代,epochs = 5for e in range(epochs):for record in training_data_list:all_values = record.split(',')inputs = (np.asfarray(all_values[1:]) / 255.0*0.99) + 0.01targets = np.zeros(output_nodes) + 0.01targets[int(all_values[0])] = 0.99n.train(inputs, targets)passpass

5、载入测试数据集

#将mnist测试数据的CSV文件加载到一个列表中test_data_file = open("mnist_dataset/mnist_test.csv", 'r')test_data_list = test_data_file.readlines()test_data_file.close()

6、测试训练的模型

#scorecard用于记录训练好的神经网络在测试时的表现,初始为一个空列表scorecard = []#检测测试数据集中的所有数据for record in test_data_list:all_values = record.split(',')correct_label = int(all_values[0])inputs = (np.asfarray(all_values[1:]) / 255.0*0.99) + 0.01outputs = n.query(inputs)outputs_max_label = np.argmax(outputs)if (outputs_max_label == correct_label):scorecard.append(1)else:scorecard.append(0)passpass

7、计算测试的得分

#计算得分scorecard_array = np.asarray(scorecard)print("performace = ", scorecard_array.sum() / scorecard_array.size)

结果:

总结:训练和测试用时需要几分钟,可以见接下来的图,每次得分不同,这是因为,我们生成的链接权重矩阵是随机的,因此每次训练、测试最后的得分不同。

使用%%time计算训练和测试的时间如下(CPU环境下):

训练时间:Wall time: 6min 42s

测试时间: Wall time:1.86s

三、使用自己写的手写数字作为数据集进行网络的测试

1、对自己的手写数字进行数据的处理

import numpy as np#python自带的库,主要用于读取和存储图像import imageio #glob是python自带的一个文件操作相关模块,用于查找想要的文件,支持通配符操作import globimport matplotlib.pyplot as plt#定义一个列表,存储自己手写数字的数据our_own_dataset = []#对每个自己的手写数字处理,获得MNIST的数据集对应的CSV格式数据,并存储到定义的列表中for image_file_name in glob.glob('my_own_dataset/2828_my_own_?.png'):print("loading...", image_file_name)#记录自己手写数字的正确标签label = int(image_file_name[-5:-4])#将图像数据从png文件加载到数组中img_array = imageio.imread(image_file_name, as_gray = True)#将28*28的方块数组变成很长的一段数值,正常情况下,像素值:0代表黑色,255代表白色,但MNIST数据集存储的像素值相反。img_data = 255.0 - img_array.reshape(784)img_data = (img_data / 255.0*0.99) + 0.01print(np.min(img_data))print(np.max(img_data))#将标签和对应的数据添加到测试数据中,即我们的数据集#np.append(arr,values,axis=None),将value插入到目标arr的后面,values和arr应该具有相同的维度record = np.append(label,img_data)print(record)our_own_dataset.append(record)pass

部分结果:

loading... my_own_dataset\2828_my_own_2.png0.011.0[2. 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.07211765 0.522470590.71658826 0.61952943 0.29729411 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.27400002 0.79423529 0.79423529 0.84470588 1.1. 0.59623533 0.01776471 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.23905884 0.704941210.32835296 0.01 0.01 0.18858825 0.92235297 1.0.35552943 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.34388235 0.28952941 0.01 0.010.01 0.01 0.50305885 1. 0.61176473 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.37105882 1. 0.61564708 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.43705884 1.0.42152941 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.68941176 0.86800003 0.09152941 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.219647060.88741177 0.37494117 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01388235 0.68941176 0.55741179 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.46811765 0.63505882 0.02941176 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.36329412 0.68164706 0.095411760.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.27011764 0.69329411 0.12258823 0.01 0.01 0.010.01 0.15752943 0.01776471 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.24294119 0.81364709 0.324470580.01 0.01388235 0.02941176 0.14588237 0.64670593 0.48752940.01388235 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.048823530.46423531 1. 1. 1. 1. 1.1. 1. 1. 0.1847059 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.08376471 0.46811765 0.50694120.44482353 0.51082355 0.53023529 0.53023529 0.53023529 0.50694120.29341176 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01]loading... my_own_dataset\2828_my_own_3.png0.011.0[3. 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.033294120.12258823 0.01 0.44870588 0.61176473 0.56129414 0.231294130.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.27400002 0.60400003 0.80588233 0.46035293 0.010.32058823 0.48364705 0.56905884 0.72435296 0.64282358 0.076000010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.262352940.5147059 0.23517647 0.02552941 0.01 0.01 0.010.01 0.01 0.81752944 0.5147059 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.21964706 0.08764706 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.623411770.49529412 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.7515294 0.38658825 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.58847064 0.7360.02164706 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.08376471 0.41764706 0.61952943 0.24682353 0.24294119 0.048823530.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.54576474 0.961176461. 0.57682353 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.07600001 0.05270588 0.22352943 0.813647090.59235299 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.05270588 0.37882352 0.328352960.08376471 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.82141179 0.4720.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.35164705 0.55352944 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.052705880.23517647 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.34 0.76705885 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.18082353 0.08764706 0.010.01 0.01 0.01 0.01 0.01 0.010.02941176 0.87964708 0.5418824 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.41764706 0.87964708 0.02552941 0.01 0.010.01 0.01 0.01 0.01 0.13423531 0.421529410.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.53800005 0.79811764 0.11870588 0.01 0.01 0.087647060.31282353 0.82917649 0.27788237 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.530235290.26235294 0.16917649 0.70494121 0.78258824 0.7282353 0.371058820.02164706 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.130352940.31282353 0.14588237 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01 0.010.01 0.01 0.01 0.01 0.01]

2、基于自己数据的网络训练和测试

设计神经网络

import numpy as npimport scipy.special as Simport matplotlib.pyplot as plt#python自带的库,主要用于读取和存储图像import imageio #glob是python自带的一个文件操作相关模块,用于查找想要的文件,支持通配符操作import globclass neuralNetwork:#初始化神经网络,构造函数def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate):#设置每个输入、隐藏、输出层中的节点数self.inodes = inputnodesself.hnodes = hiddennodesself.onodes = outputnodes#链接权重矩阵,wih和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 = 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.lr = learningrate#创建激活函数(函数的另一种定义方法,这样以后可以直接调用)self.activation_function = lambda x: S.expit(x)pass#训练神经网络def train(self, inputs_list, targets_list):#将输入列表转换成二维数组inputs = np.array(inputs_list, ndmin = 2).Ttargets = 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)#计算输出层的误差:(target - actual)(预期目标输出值-实际计算得到的输出值)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一般用于占位置,定义一个空函数程序会报错,当没有想好函数的内容可以用pass填充,使得程序正常运行pass#查询神经网络:接受神经网络的输入,返回神经网络的输出def query(self, inputs_list):#将输入列表转换成二维数组inputs = np.array(inputs_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)#返回输出层的输出值return final_outputs

设置参数

input_nodes = 784hidden_nodes = 200output_nodes = 10learning_rate = 0.1n = neuralNetwork(input_nodes, hidden_nodes, output_nodes, learning_rate)

加载训练数据集训练

#将mnist的训练数据CSV文件加载到一个列表中training_data_file = open("mnist_dataset/mnist_train.csv", 'r')training_data_list = training_data_file.readlines()training_data_file.close()#训练神经网络#epochs是用于训练数据集的次数,有些人把训练一次叫做一个世代,epochs = 10for e in range(epochs):for record in training_data_list:all_values = record.split(',')inputs = (np.asfarray(all_values[1:]) / 255.0*0.99) + 0.01targets = np.zeros(output_nodes) + 0.01targets[int(all_values[0])] = 0.99n.train(inputs, targets)passpass

导入自己的数据集

#定义一个列表,存储自己手写数字的数据our_own_dataset = []#对每个自己的手写数字处理,获得MNIST的数据集对应的CSV格式数据,并存储到定义的列表中for image_file_name in glob.glob('my_own_dataset/2828_my_own_?.png'):#记录自己手写数字的正确标签label = int(image_file_name[-5:-4])#将图像数据从png文件加载到数组中img_array = imageio.imread(image_file_name, as_gray = True)#将28*28的方块数组变成很长的一段数值,正常情况下,像素值:0代表黑色,255代表白色,但MNIST数据集存储的像素值相反。img_data = 255.0 - img_array.reshape(784)img_data = (img_data / 255.0*0.99) + 0.01#将标签和对应的数据添加到测试数据中,即我们的数据集#np.append(arr,values,axis=None),将value插入到目标arr的后面,values和arr应该具有相同的维度record = np.append(label,img_data)our_own_dataset.append(record)pass

测试单个手写数字

#测试自己的手写数字数据集item = 2#显示图片plt.imshow(our_own_dataset[item][1:].reshape(28,28), cmap = 'Greys', interpolation='None')correct_label = our_own_dataset[item][0]inputs = our_own_dataset[item][1:]outputs = n.query(inputs)print(outputs)label = np.argmax(outputs)print("network says ", label)if (label == correct_label):print("match")else:print("no match")pass

测试结果

其他测试结果:

四、提高识别正确率的改进方法

1、调整学习率

可以将学习率(learning_rate)调大或者调小,进行训练测试,看最后的等分情况,即识别准确率,本设计(3层神经网络与MNIST数据集)不同学习率的具体得分情况如下图所示:

可知,学习率在0.05到0.3之间可能会有较好的表现。个人训练的结果可能会有差异,因为代码运行的整个过程有一定的随机性。

2、增加一定的训练次数

增加一定的训练次数(也有人称训练一次为一个世代),可以提高训练模型的性能,从而提高后期测试时,模型的识别准确率。但值得注意的是:过多的训练,会使得网络出现过拟合现象,即网络过度拟合训练数据,从而降低训练出模型的识别准确率,这种过拟合现象在各种类型的机器学习中都会存在。

不同次数训练(不同数目的世代)下模型的识别准确率的结果可以参考下图:

尝试:可以同时改变学习率和训练次数进行尝试,但有一点需要明白的是:要正确、科学的得到最好的结果,需要为每个学习率和训练次数组合进行多次试验,尽量减小在梯度下降过程中随机性的影响,从而得到最优的结果。

3、改变网络结构

隐藏层节点前后的链接权重具有学习能力,可以试着改变中间隐藏层的节点数目,合理的进行改变,若设置为4,这样就不可能有足够的空间让网络去学习任何知识,将所有的输入转换成正确的输出。(这就想是让5L的瓶子盛50L的水一样,不能完成的任务)。

如果隐藏层的节点选取过多,例如10000个,此时有太多的路径供学习选择,因此难以训练网络,此需要设置更多的训练次数来训练网络,这样会大大加重计算的算力,耗时。

因此我们需要在可以容忍的运行时间内选择某个数目的隐藏层节点进行训练。本网络可参考下图:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。