代码和数据来自知乎帖 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,感觉算法识别率是有点低。
本来还有测试集的,不过代码中没用到,我就删了。。。
用的是最简单的一层网络。
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
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)