笔记汇总:https://blog.csdn.net/a1103688841/article/details/84350432
感谢:《Python神经网络编程》--塔里克·拉希德著
# -*- coding: UTF-8 -*-
import numpy as np
import scipy.special
class neuralNetwork:
def __init__(self,inputnodes,hiddennodes,outputnodes,learningrate,weit_simple=True):
#basis value initialize
self.inodes=inputnodes
self.hnodes=hiddennodes
self.onodes=outputnodes
self.lr=learningrate
#weit value initialize
if(weit_simple):
self.wih=(np.random.rand(self.hnodes,self.inodes)-0.5)
self.who=(np.random.rand(self.onodes,self.hnodes)-0.5)
else:
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))
#activation function initialize
#这里不能随意修改函数,因为下面训练函数中的激活函数导数是直接固定的。
self.activaltion_function=lambda x:scipy.special.expit(x)
pass
def train(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.activaltion_function(hidden_inputs)
final_inputs=np.dot(self.who,hidden_outputs)
final_outputs=self.activaltion_function(final_inputs)
output_errors=targets-final_outputs
hidden_errors=np.dot(self.who.T,output_errors)
#这里使用的反向传播用的是S型函数的公式
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,inputs_list):
inputs=np.array(inputs_list,ndmin=2).T
hidden_inputs=np.dot(self.wih,inputs)
hidden_outputs=self.activaltion_function(hidden_inputs)
final_inputs=np.dot(self.who,hidden_outputs)
final_outputs=self.activaltion_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)