python神经网络例题:手写数字的识别

文章目录

  • 准备训练数据
  • 完成代码
  • 测试网络

声明:代码和数据集均来自网络,仅供自己学习。侵删。

上次学习了一般的神经网络。这次找个实际的操刀,学习一下。
数据库来源:
http://pjreddie.com/projects/mnist-in-csv/
我们可以从中获得我们想要的数据集和测试集

data_file = open("train_100.csv",'r')
data_list = data_file.readlines()
data_file.close()

一行一行来看,
open()此函数能打开一个文件,“r”表示只读(read)
readline()将文件中的所有行读入变量data_list.但是要注意,此函数会将所有文件读入到内存中,在文件内容过大的情况下,不宜使用。一次在一行上使用更有效率。
最后一行close()函数关闭文件,让计算机释放用于保存文件的部分内存。
在使用python之前,千万要记得,装一些常用库。代码里也要用import导入。

准备训练数据

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

我们知道颜色值的范围是[255,0],我们需要将此范围缩小到[0.01,1]的范围里,以上代码就是为了调整范围
由于手写数字一共有十个且防止输出为0或者1所以构建的目标矩阵为

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

最后我们可以写出完整的代码。

完成代码

import numpy
class neuralNetwork:
  def __init__(self,inputnodes,hiddennodes,outputnodes,learningrate):
  self.inodes=inputnodes
  self.hnodes=hiddennodes
  self.onodes=outputnodes
  self.wih=numpy.random.normal(0.0,pow(self.hnodes,-0.5),(self.hnodes,slef.inodes))
  self.who=numpy.random.normal(0.0,pow(self.onodes,-0.5),(self.onodes,slef.hnodes))
  self.lr=learningrate
  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)\n",
    output_errors = targets - final_outputs
    hidden_errors = numpy.dot(self.who.T, output_errors) 
    self.who += self.lr * numpy.dot((output_errors * final_outputs * (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))
      pass
def query(self, inputs_list):\n",
 
    inputs = numpy.array(inputs_list, ndmin=2).T
    hidden_inputs = numpy.dot(self.wih, inputs)\n",
    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"

    input_nodes = 784
    hidden_nodes = 200
    output_nodes = 10
   

    learning_rate = 0.1


    n = neuralNetwork(input_nodes,hidden_nodes,output_nodes, learning_rate)

    training_data_file = open(\"mnist_dataset/mnist_train.csv\", 'r')
    training_data_list = training_data_file.readlines()
    training_data_file.close()

   for record in training_data_list:
    all_values = record.split(',')\n",
    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
    n.train(inputs, targets)\n",
     pass

测试网络

    test_data_file = open(\"mnist_dataset/mnist_test.csv\", 'r')
    test_data_list = test_data_file.readlines()
    test_data_file.close()

我们发现,通过简单的几行代码,就可以正确区分没有见过的图片。并且训练的个数其实还是很少的。
如果我们改进了网络,那么会提高么?
所以我们需要用一个分数去衡量网络的学习能力,我们称之为记分卡(scorecard)这个模块在每次测试每条数据后都会更新

for record in test_data_list:
   all_values = record.split(',')
   correct_label = int(all_values[0])
   inputs = (numpy.asfarray(all_values[1:]) / 255.0 * 0.99) + 0.01
   outputs = n.query(inputs)
 label = numpy.argmax(outputs)
      if (label == correct_label):
         scorecard.append(1)
      else:
          scorecard.append(0)
        pass

然后我们需要计算正确率

    scorecard_array = numpy.asarray(scorecard)
    print (\"performance = \", scorecard_array.sum() / scorecard_array.size)

到这里,利用少量数据训练的工作就完成了。有精力的话,我们可以使用完整的数据来训练和测试。

你可能感兴趣的:(人工智能)