深度学习实战——手写数字识别
一,算法介绍
代码和数据来自知乎帖
不过文中的错误代码有点多。。。有的是看评论改的,有的是我自己改的。
这个算法全部放在一个.py文件中了,不涉及模型加载等。
步骤就是先训练网络,然后查询网络,判断待识别图片中的数字。
二,数据
链接:
所有的图片都是28*28的图片。
其中mnist_train.csv中是训练集,这2张照片是测试图片:
1.jpg是原帖提供的,2.jpg是我自己试着画出来的,画了好几次才画出一个算法能识别的。
emmmm,感觉算法识别率是有点低。
本来还有测试集的,不过代码中没用到,我就删了。。。
三,算法实现
1,神经网络类
用的是最简单的一层网络。
class neuralNetwork: def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate): # 函数调用时神经网络输入节点数、隐层节点数、输出节点数、学习速率 self.inodes = inputnodes self.hnodes = hiddennodes self.onodes = outputnodes self.lr = learningrate # 连接权重矩阵 self.wih = (numpy.random.normal(0.0, pow(self.hnodes, -0.5), (self.hnodes, self.inodes))) self.who = (numpy.random.normal(0.0, pow(self.onodes, -0.5), (self.onodes, self.hnodes))) # 激活函数 self.activation_function = lambda x: scipy.special.expit(x) pass # 训练神经网络 def train(self, inputs_list, targets_list): # 将输入转为二维数组 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_errors = numpy.dot(self.who.T, output_errors) # 权重编码(隐藏层-最终层) self.who += self.lr * numpy.dot((final_outputs * output_errors * (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)) # 神经网络查询 def query(self, inputs_list): # 将输入转为二维数组 inputs = numpy.array(inputs_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) return final_outputs
2,完整代码
import numpy import scipy.special import imageio ### # class neuralNetwork: ### # 神经网络输入节点数、隐层节点数、输出节点数 input_nodes = 784 # 28 * 28 = 784 hidden_nodes = 200 output_nodes = 10 # 学习速率 learning_rate = 0.1 pic_path = "D:/number/number/" # 创建神经网络 net = neuralNetwork(input_nodes, hidden_nodes, output_nodes, learning_rate) # 将mnist training data csv文件加载到列表中 training_data= open(pic_path + "mnist_train.csv", r) training_list = training_data.readlines() training_data.close() # 训练,重复次数越大时间越长,精度越高 repeat = 2 for e in range(repeat): for record in training_list: all_values = record.split(,) inputs = (numpy.asfarray(all_values[1:]) / 255.0 * 0.99) + 0.01 targets = numpy.zeros(output_nodes) + 0.01 targets[int(all_values[0])] = 0.99 net.train(inputs, targets) # 测试神经网络是否能准确识别自己的手绘28*28 png图像 image = pic_path + 2.jpg img_array = imageio.imread(image, as_gray=True) # 从28x28重塑为784个值列表 img_data = 255.0 - img_array.reshape(784) img = (img_data / 255.0 * 0.99) + 0.01 # 查询神经网络 outputs = net.query(img) # 系统得到的值 result = numpy.argmax(outputs) print("识别结果:", result)
上一篇:
IDEA上Java项目控制台中文乱码