赞
踩
BP神经网络由一层输入层、任意隐层(一般为1)、一层输出层组成。假定输入向量为n维向量,即输入神经元数量为n,隐层的层数为num,每一层隐层的神经元数量为eachCount,输出向量为yCount维向量,即输出神经元的数量为yCount,则BP算法要训练的参数有:
1.输入层到第一层隐层的n * eachCount个连接权值以及eachCount个阈值;
2.隐层与隐层之间的(num - 1) * eachCount * eachCount个连接权值以及(num -1) * eachCount个阈值;
3.最后一层隐层到输出层的eachCount * yCount个连接权值以及输出层的yCount个阈值。
其中,阈值可看作一个固定输入为-1.0的“哑结点”,因此权重和阈值的学习可以统一为权重的学习。
BP算法包括标注BP算法以及累积BP算法,前者每次更新只针对单个样例,参数更新得非常频繁,而且对不同样例进行更新的效果可能出现“抵消”现象。而累积BP算法直接针对累积误差最小化,它正在读取整个训练集D一遍后才对参数进行更新,其参数更新的频率低得多。这里我们使用Python来实现标准BP算法。
神经元使用Sigmoid函数作为激活函数,其公式为:
实现代码为:
- def sigmoid(inX):
- return 1.0/(1+exp(-inX))
然后给出标准BP算法的Python实现,引用了numpy库进行矩阵计算,python版本为2.7,注释很详细:
- '''
- 标准bp算法
- 每次更新都只针对单个样例,参数更新得很频繁s
- dataSet 训练数据集
- labels 训练数据集对应的标签
- 标签采用one-hot编码(一位有效编码),例如类别0对应标签为[1,0],类别1对应标签为[0,1]
- alpha 学习率
- num 隐层数,默认为1层
- eachCount 每一层隐层的神经元数目
- repeat 最大迭代次数
- 算法终止条件:达到最大迭代次数或者相邻一百次迭代的累计误差的差值不超过0.001
- '''
- def bp(dataSet, labels, alpha = 0.01, num = 1, eachCount = 10, repeat = 500):
- dataSet = mat(dataSet)
- m,n = shape(dataSet)
- if len(labels) == 0:
- print 'no train data! '
- return
- yCount = shape(labels[0])[1] # 输出神经元的数目
- firstWMat = mat(random.sample((n + 1, eachCount))) # 输入层到第一层隐层的w值和阈值,每列第一个为阈值
- hideWA
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。