人工智能 实验4BP神经网络
importnumpyasnp
importscipy.specialasS
importmatplotlib.pyplotasplt
classneuralNetwork:
#初始化神经网络,构造函数
def__init__(self,inputnodes,hiddennodes,outputnodes,learningrate):
#设置每个输入、隐藏、输出层中的节点数
self.inodes=inputnodes
self.hnodes=hiddennodes
self.onodes=outputnodes
#链接权重矩阵,wih和who
#weightsinsidethearraysarew_i_j,wherelinkisfromnodeitonodejinthenextlayer
#w11w21
#w12w22etc
self.wih=np.random.normal(0.0,pow(self.inodes,-0.5),(self.hnodes,self.inodes))
self.who=np.random.normal(0.0,pow(self.hnodes,-0.5),(self.onodes,self.hnodes))
#学习率
self.lr=learningrate
#创建激活函数(函数的另一种定义方法,这样以后可以直接调用)
self.activation_function=lambdax:S.expit(x)
pass
#训练神经网络
deftrain(self,inputs_list,targets_list):
#将输入列表转换成二维数组
inputs=np.array(inputs_list,ndmin=2).T
targets=np.array(targets_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)
#计算输出层的误差:(target-actual)(预期目标输出值-实际计算得到的输出值)
output_errors=targets-final_outputs
#隐藏层的误差:是输出层误差按权重分割,在隐藏节点上重新组合
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一般用于占位置,定义一个空函数程序会报错,当没有想好函数的内容可以用pass填充,使得程序正常运行
pass
#查询神经网络:接受神经网络的输入,返回神经网络的输出
defquery(self,inputs_list):
#将输入列表转换成二维数组
inputs=np.array(inputs_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)
#返回输出层的输出值
returnfinal_outputs
#请设置输入、隐藏、输出层中的节点数,和学习率
input_nodes=
hidden_nodes=
output_nodes=
learning_rate=
#将mnist的训练数据CSV文件加载到一个列表中
#请输入代码
#训练神经网络
#请输入代码
#进行测试,输出测试结果
#请输入代码