import numpy as np
import scipy.special
import matplotlib.pyplot as plt
import pylab
class NeuralNetwork():
# 初始化神经网络
def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate):
# 设置输入层节点,隐藏层节点和输出层节点的数量和学习率
self.inodes = inputnodes
self.hnodes = hiddennodes
self.onodes = outputnodes
self.lr = learningrate #设置神经网络中的学习率
# 使用正态分布,进行权重矩阵的初始化
self.wih = np.random.normal(0.0, pow(self.hnodes, -0.5), (self.hnodes, self.inodes))
self.who = np.random.normal(0.0, pow(self.onodes, -0.5), (self.onodes, self.hnodes))
self.activation_function = lambda x: scipy.special.expit(x) #激活函数设为Sigmod()函数
pass
# 定义训练神经网络
print("************Train start******************")
def train(self,input_list,target_list):
# 将输入、输出列表转换为二维数组
inputs = np.array(input_list, ndmin=2).T
targets = np.array(target_list,ndmin= 2).T
hidden_inputs = np.dot(self.wih, inputs) #计算到隐藏层的信号,dot()返回的是两个数组的点积
hidden_outputs = self.activation_function(hidden_inputs) #计算隐藏层输出的信号
final_inputs = np.dot(self.who, hidden_outputs) #计算到输出层的信号
final_outputs = self.activation_function(final_inputs)
output_errors = targets - final_outputs #计算输出值与标签值的差值
#print("*****************************")
#print("output_errors:",output_errors)
hidden_errors = np.dot(self.who.T,output_errors)
#隐藏层和输出层权重更新
self.who += self.lr * np.dot((output_errors*final_outputs*(1.0-final_outputs)),
np.transpose(hidden_outputs))
#输入层和隐藏层权重更新
self.wih += self.lr * np.dot((hidden_errors*hidden_outputs*(1.0-hidden_outputs)),
np.transpose(inputs))
pass
#查询神经网络
def query(self, input_list): # 转换输入列表到二维数
inputs = np.array(input_list, ndmin=2).T #计算到隐藏层的信号
hidden_inputs = np.dot(self.wih, inputs) #计算隐藏层输出的信号
hidden_outputs = self.activation_function(hidden_inputs) #计算到输出层的信号
final_inputs = np.dot(self.who, hidden_outputs)
final_outputs = self.activation_function(final_inputs)
return final_outputs
input_nodes = 784 #输入层神经元个数
hidden_nodes = 100 #隐藏层神经元个数
output_nodes = 10 #输出层神经元个数
learning_rate = 0.3 #学习率为0.3
# 创建神经网络
n = NeuralNetwork(input_nodes, hidden_nodes, output_nodes, learning_rate)
score = []
print("***************Test start!**********************")
for record in test_data_list:
#用逗号分割将数据进行拆分
all_values = record.split(',')
#正确的答案是第一个值
correct_values = int(all_values[0])
print(correct_values,"是正确的期望值")
#做输入
inputs = (np.asfarray(all_values[1:])/255.0 * 0.99) + 0.01
#测试网络 作输入
outputs= n.query(inputs)
#找出输出的最大值的索引
label = np.argmax(outputs)
print(label,"是网络的输出值\n")
#如果期望值和网络的输出值正确 则往score 数组里面加1 否则添加0
if(label == correct_values):
score.append(1)
else:
score.append(0)
pass
pass
print("正确率是:",(score_array.sum()/score_array.size)*100,'%')