1 importnumpy2 importscipy.special3 importscipy.ndimage.interpolation4 #import matplotlib.pyplot
5 importtime6 importstring7 from random importshuffle8
9 importmatplotlib.pyplot10
11
12
13 classNeuralNetwork:14
15 #初始化神经网络
16 def __init__(self, inputnodes, hiddenodes, outputnodes, learningrate):17 #设置输入层、隐藏层、输出层的节点数
18 self.inodes =inputnodes19 self.hnodes =hiddenodes20 self.onodes =outputnodes21
22 #学习因子
23 self.lr =learningrate24
25 #输入层、隐藏层、输出层之间的链接权重
26 #self.wih = (numpy.random.rand(self.hnodes, self.inodes) - 0.5)
27 #self.who = (numpy.random.rand(self.onodes, self.inodes) - 0.5)
28 #利用正态分布采样权重
29 self.wih = numpy.random.normal(0.0, pow(self.hnodes, - 0.5), (self.hnodes, self.inodes))30 self.who = numpy.random.normal(0.0, pow(self.onodes, - 0.5), (self.onodes, self.hnodes))31
32 #S函数
33 self.activation_function = lambdax: scipy.special.expit(x)34 self.inverse_activation_function = lambdax: scipy.special.logit(x)35 pass
36
37 #训练
38 deftrain(self, inputs_list, targets_list):39 #输入层转矩阵
40 inputs = numpy.array(inputs_list, ndmin=2).T41 targets = numpy.array(targets_list, ndmin=2).T42
43 #隐藏层输入=权重点乘输入层矩阵
44 hidden_inputs =numpy.dot(self.wih, inputs)45 #隐藏层应用S函数
46 hidden_outputs =self.activation_function(hidden_inputs)47
48 #输出层输入=权重点乘隐藏层输入矩阵
49 final_inputs =numpy.dot(self.who, hidden_outputs)50 #输出层输入应用S函数
51 final_outputs =self.activation_function(final_inputs)52
53 #计算误差
54 output_errors = targets -final_outputs55 #计算隐藏层误差
56 hidden_errors =numpy.dot(self.who.T, output_errors)57 #更新隐藏层和输出层之间的权重
58 self.who += self.lr * numpy.dot((output_errors * final_outputs * (1.0 -final_outputs)),59 numpy.transpose(hidden_outputs))60 #更新输入层和隐藏层之间的权重
61 self.wih += self.lr * numpy.dot((hidden_errors * hidden_outputs * (1.0 -hidden_outputs)),62 numpy.transpose(inputs))63
64 pass
65
66 #查询
67 defquery(self, inputs_list):68 #输入层转矩阵
69 inputs = numpy.array(inputs_list, ndmin=2).T70
71 #隐藏层输入=权重点乘输入层矩阵
72 hidden_inputs =numpy.dot(self.wih, inputs)73 #隐藏层应用S函数
74 hidden_outputs =self.activation_function(hidden_inputs)75
76 #输出层输入=权重点乘隐藏层输入矩阵
77 final_inputs =numpy.dot(self.who, hidden_outputs)78 #输出层输入应用S函数
79 final_outputs =self.activation_function(final_inputs)80
81 returnfinal_outputs82
83 defback_query(self, targets_list):84 #transpose the targets list to a vertical array
85 final_outputs = numpy.array(targets_list, ndmin=2).T86
87 #calculate the signal into the final output layer
88 final_inputs =self.inverse_activation_function(final_outputs)89
90 #calculate the signal out of the hidden layer
91 hidden_outputs =numpy.dot(self.who.T, final_inputs)92 #scale them back to 0.01 to .99
93 hidden_outputs -=numpy.min(hidden_outputs)94 hidden_outputs /=numpy.max(hidden_outputs)95 hidden_outputs *= 0.98
96 hidden_outputs += 0.01
97
98 #calculate the signal into the hidden layer
99 hidden_inputs =self.inverse_activation_function(hidden_outputs)100
101 #calculate the signal out of the input layer
102 inputs =numpy.dot(self.wih.T, hidden_inputs)103 #scale them back to 0.01 to .99
104 inputs -=numpy.min(inputs)105 inputs /=numpy.max(inputs)106 inputs *= 0.98
107 inputs += 0.01
108
109 returninputs110
111
112 #验证码,10个数字+26个大小写字母97-122
113 codes = list(string.digits +string.ascii_lowercase)114 #输入、隐藏、输出三层节点数
115 input_nodes = 45 * 100
116 #四位验证码
117 output_nodes =(len(codes))118 hidden_nodes = output_nodes * 10
119
120
121 #学习因子
122 learning_rate = 0.2
123
124 #创建神经网络
125 n =NeuralNetwork(input_nodes, hidden_nodes, output_nodes, learning_rate)126
127 #读取训练数据
128 #training_data_file = open("web/mnist_dataset/mnist_train_100.csv")
129 training_data_file = open("web/train.csv")130 training_data_list =training_data_file.readlines()131 shuffle(training_data_list)132 training_data_file.close()133
134
135 #世代,所有数据训练一遍为一个世代
136 epochs = 1
137 print("输入节点=%d,隐藏节点=%d,输出节点=%d,学习因子=%f,时代=%d" %(input_nodes, hidden_nodes, output_nodes, learning_rate, epochs))138 print("开始训练...")139 start =int(time.time())140 for e inrange(epochs):141 #训练神经网络
142 for record intraining_data_list:143 #按逗号切分成数组
144 all_values = record.split(",")145 #缩放并转换成0.01到0.99之间的数组
146 train_inputs = (numpy.asfarray(all_values[1:]) / 255.0 * 0.99) + 0.01
147 #旋转正负10度
148 train_inputs_plus_10 = scipy.ndimage.interpolation.rotate(train_inputs.reshape(1, 4500), 10, cval=0.01,149 reshape=False)150 train_inputs_minus_10 = scipy.ndimage.interpolation.rotate(train_inputs.reshape(1, 4500), -10, cval=0.01,151 reshape=False)152
153 #构建真实输出数组,除了目标位置是0.99,其他都是0.01
154 train_targets = numpy.zeros(output_nodes) + 0.01
155 code =all_values[0]156 train_targets[codes.index(code)] = 0.99
157 n.train(train_inputs, train_targets)158 n.train(train_inputs_plus_10, train_targets)159 n.train(train_inputs_minus_10, train_targets)160 pass
161 pass
162 end =int(time.time())163 print("训练用时=", end - start, "秒")164
165 #测试数据
166 #test_data_file = open("web/mnist_dataset/mnist_test_10.csv")
167 #test_data_file = open("web/mnist_dataset/mnist_test.csv")
168 test_data_file = open("web/test.csv")169 test_data_list =test_data_file.readlines()170 test_data_file.close()171 #all_values = test_data_list[0].split(",")
172 #image_array = numpy.asfarray(all_values[1:]).reshape((28, 28))
173 #matplotlib.pyplot.imshow(image_array, cmap='Greys', interpolation='None')
174 #175 #value = n.query((numpy.asfarray(all_values[1:]) / 255.0 * 0.99) + 0.01)
176 #print(value)
177
178 #统计分数
179 scorecard =[]180
181 print("开始测试...")182 start =int(time.time())183 #检查所有测试数据
184 for record intest_data_list:185 all_values = record.split(",")186 #正确答案
187 correct_label =(all_values[0])188 #print(correct_label, "正确答案")
189
190 verify_inputs = (numpy.asfarray(all_values[1:]) / 255.0 * 0.99) + 0.01
191 verify_outputs =n.query(verify_inputs)192 #print(verify_outputs)
193 label =codes[numpy.argmax(verify_outputs)]194 #print(label, "神经网络答案")
195
196 if label ==correct_label:197 scorecard.append(1)198 else:199 scorecard.append(0)200 pass
201 pass
202 end =int(time.time())203 print("检查用时=", end - start, "秒")204
205 #print(scorecard)
206 scorecard_array =numpy.asarray(scorecard)207 print("正确率=", scorecard_array.sum() /scorecard_array.size)208
209 label =0210 #create the output signals for this label
211 targets = numpy.zeros(output_nodes) + 0.01
212 #all_values[0] is the target label for this record
213 targets[label] = 0.99
214 #print(targets)
215
216 #get image data
217 image_data =n.back_query(targets)218 #print(image_data)
219
220 #plot image data
221 matplotlib.pyplot.imshow(image_data.reshape(45, 100), cmap='Greys', interpolation='None')