深度学习实战——手写数字识别

一,算法介绍

代码和数据来自知乎帖 https://zhuanlan.zhihu.com/p/274610199

不过文中的错误代码有点多。。。有的是看评论改的,有的是我自己改的。

这个算法全部放在一个.py文件中了,不涉及模型加载等。

步骤就是先训练网络,然后查询网络,判断待识别图片中的数字。

二,数据

链接:https://blog.csdn.net/nameofcsdn/article/details/119086279

所有的图片都是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)

你可能感兴趣的:(深度学习实战——手写数字识别)