关于BP算法的原理和推导过程网上有很多博客已经写的十分清楚了,这里不再赘述,下面使用python自己实现了多隐层BP神经网络,可调节网络结构(隐层层数、节点数)。先把代码放上来,详细的等有时间再更新。
import os
import numpy as np
# Back propagation network
class BP:
def __init__(self, precision, max_learning_time, learning_rate, hidden_nodes, sigmoid):
"""
Parameter initialization.
precision, max_learning_time : 计算精度ε,最大学习次数M
learning_rate : 学习率 η (0.1~3)
# inertance_Alpha : 惯性项系数 α(0.9~1 或者 0即不用)
"""
self.precision = precision
self.max_learning_time = max_learning_time
self.learning_rate = learning_rate
self.hidden_nodes = hidden_nodes
self.sigmoid = sigmoid
print("Parameter initialization is finished... ")
def __construct_network(self, feature_dimension, class_number):
"""
Network structure initialization.
hidden_nodes : 隐层节点数,自定 eg, list=[4,5,4]
hidden_layer : 隐藏层层数,>=1 len(list)
input_nodes : 输入层节点,等于样本特征向量的维数
output_nodes : 输出层节点,等于分类的类别数(多输出型,1-0编码模式)
weight_list : 每层间的权重
:param feature_dimension: 样本特征维数
:param class_number: 分类的类别数
:return:
"""
self.input_nodes = feature_dimension
self.output_nodes = class_number
# 相邻两层的权系数和偏置, 范围(-0.5,0.5) , “+1” : 加上一行偏置b
weight_ih = np.random.random_sample(size=(self.input_nodes+1, self.hidden_nodes[0])) - 0.5 # 输入层到第一隐层
self.weight_list = [weight_ih]
for i in range(1,len