引言
推荐阅读《Python神经网络编程》[英]Taniq Rashid 著
非常的简单易懂,对数学知识讲解的很细致,完全不用担心看不懂
下文的代码也是取自书中
构建神经网络
下文仅构建了一个3层神经网络,并简单的对模型进行了一次训练
import numpy
import scipy.special #为了使用包内的激活函数
#构建3层的神经网络
class neuralNetwork:
# 初始化 所需参数:输入层节点数、隐藏层节点数、输出层节点数、学习效率
def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate):
self.inodes = inputnodes
self.hnodes = hiddennodes
self.onodes = outputnodes
#按照正态分布随机生成权重矩阵
#pow(x,y)=x^y
#normal(分布中心值,标准方差,数组大小)
self.wih = numpy.random.normal(0.0, pow(self.inodes, -0.5), (self.hnodes, self.inodes))
self.who = numpy.random.normal(0.0, pow(self.hnodes, -0.5), (self.onodes, self.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
# 矩阵内积计算隐藏层输入值
# dot()矩阵内积/点乘
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)
# 计算误差
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
if __name__ == "__main__":
input_nodes = 3 #输入层节点数
hidden_nodes = 3 #隐藏层节点数
output_nodes = 3 #输出层节点数
learning_rate = 0.3 #学习效率
n = neuralNetwork(input_nodes,hidden_nodes,output_nodes, learning_rate)
inputList=[1,3,5]
targetList=[4,7,11]
n.train(inputList,targetList)