当前位置:   article > 正文

基于Python神经网络的手写字体识别_手写汉字识别代码

手写汉字识别代码

       本文将分享实现手写字体识别的神经网络实现,代码中有详细注释以及我自己的一些体会,希望能帮助到大家 (≧∇≦)/ 

  1. ##############################################手写字体识别#############################################
  2. import numpy
  3. import scipy.special
  4. ######################################定义神经网络的类#########################################
  5. class neuralNetwork:
  6. # 初始化
  7. def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate):
  8. # 设置输入层、隐藏层、输出层节点个数
  9. self.inodes = inputnodes
  10. self.hnodes = hiddennodes
  11. self.onodes = outputnodes
  12. self.wih = numpy.random.normal(0.0, pow(self.inodes, -0.5), (self.hnodes, self.inodes))
  13. self.who = numpy.random.normal(0.0, pow(self.hnodes, -0.5), (self.onodes, self.hnodes))
  14. # 学习率
  15. self.lr = learningrate
  16. # 激活函数
  17. self.activation_function = lambda x: scipy.special.expit(x)
  18. pass
  19. # 训练
  20. def train(self, inputs_list, targets_list):
  21. # 转化为二维数组
  22. inputs = numpy.array(inputs_list, ndmin=2).T
  23. targets = numpy.array(targets_list, ndmin=2).T
  24. # 计算隐藏层输入
  25. hidden_inputs = numpy.dot(self.wih, inputs)
  26. # 计算隐藏层输出
  27. hidden_outputs = self.activation_function(hidden_inputs)
  28. # 计算输出层的输入
  29. final_inputs = numpy.dot(self.who, hidden_outputs)
  30. # 计算输出层的输出
  31. final_outputs = self.activation_function(final_inputs)
  32. # 计算偏差
  33. output_errors = targets - final_outputs
  34. hidden_errors = numpy.dot(self.who.T, output_errors)
  35. # 更新权重
  36. self.who += self.lr * numpy.dot((output_errors * final_outputs * (1.0 - final_outputs)),
  37. numpy.transpose(hidden_outputs))
  38. self.wih += self.lr * numpy.dot((hidden_errors * hidden_outputs * (1.0 - hidden_outputs)),
  39. numpy.transpose(inputs))
  40. pass
  41. # 验证
  42. def query(self, inputs_list):
  43. # 转化为二维数组
  44. inputs = numpy.array(inputs_list, ndmin=2).T
  45. # 计算隐藏层输入
  46. hidden_inputs = numpy.dot(self.wih, inputs)
  47. # 计算隐藏层输出
  48. hidden_outputs = self.activation_function(hidden_inputs)
  49. # 计算输出层的输入
  50. final_inputs = numpy.dot(self.who, hidden_outputs)
  51. # 计算输出层的输出
  52. final_outputs = self.activation_function(final_inputs)
  53. return final_outputs
  54. ############################################init###############################################
  55. # 输入、输出、隐藏层节点个数
  56. input_nodes = 784
  57. hidden_nodes = 500
  58. output_nodes = 10
  59. # 学习率
  60. learning_rate = 0.1
  61. # 训练轮次
  62. epochs=5
  63. #####################################创建一个神经网络############################################
  64. n = neuralNetwork(input_nodes, hidden_nodes, output_nodes, learning_rate)
  65. ##########################################训练#################################################
  66. train_file = open("mnist_dataset/MNIST_csv/mnist_train.csv",'r')
  67. train_list = train_file.readlines()
  68. train_file.close()
  69. for e in range(epochs):
  70. for record in train_list:
  71. value_train = record.split(',')
  72. inputs = (numpy.asfarray(value_train[1:])/255.0*0.99)+0.01 # 数据预处理,把像素值范围限定到[0.01,1]
  73. targets=numpy.zeros(output_nodes)+0.01
  74. targets[int(value_train[0])] = 0.99
  75. #创建训练时目标序列(除了目标是0.99,其余9个都是0.01);而根据数据集特征 all_value[0]是每一组数的目标标签
  76. n.train(inputs,targets) #训练
  77. print("第 %d 代训练完成" % e)
  78. ##########################################测试#################################################
  79. data_file = open("mnist_dataset/MNIST_csv/mnist_test.csv",'r')
  80. test_data_list = data_file.readlines()
  81. data_file.close()
  82. #测试,并统计准确率
  83. scorecard=[]
  84. for record in test_data_list:
  85. value_test = record.split(',')
  86. correct_label=int(value_test[0])
  87. # print(correct_label,"正确答案")
  88. inputs = (numpy.asfarray(value_test[1:]) / 255.0 * 0.99) + 0.01
  89. outputs = n.query(inputs)
  90. label = numpy.argmax(outputs)
  91. # print(label,"网络给出的答案")
  92. if (label==correct_label):
  93. scorecard.append(1)
  94. else:
  95. scorecard.append(0)
  96. #print(scorecard)
  97. #打分
  98. scorecard_array=numpy.asarray(scorecard)
  99. print("performance = ",scorecard_array.sum()/scorecard_array.size)

       训练集和数据集的.csv格式文件可以从下面链接中获取:

链接:https://pan.baidu.com/s/1Wc55qHUQPbPBNz4uYdY8nA 
提取码:2pq6 
--来自百度网盘超级会员V3的分享

求学路上,你我共勉(๑•̀ㅂ•́)و✧

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/343019
推荐阅读
相关标签
  

闽ICP备14008679号