BP算法实现
1 项目信息
项目名称:bp算法实现
语言:python
平台:jupyter
2 功能介绍
实现网络定义:网络结构、激活函数、softmax、损失函数
实现前向传播、后向传播过程
实现批量数据的BP 过程
3 具体代码
import numpy as np
3.1 网络结构定义
输入模型的相关参数以确定模型的具体结构。
模型参数包括模型的层数、每层的神经元数、所使用的激活函数以及学习率。
模型默认提供ReLU和sigmoid激活函数,损失函数默认设置为交叉熵。
layerNum = int(input('layer num : '))
# 输入格式 eg: [2,3,2]
unitNums = input('unit nums : ')
unitNums = eval(unitNums)
maxUnitNum = max(unitNums[1:])
# 输入格式 eg: sigmoid/relu
actFun = input('activation function : ')
learnRate = input('learning rate : ')
3.2 初始化模型计算矩阵
根据模型的层数和每层的神经元个数,确定权重个数。
-
权重矩阵weights[层数-1,单层最大权重个数],使用高斯函数初始化权重矩阵。
-
权重跟新矩阵derWeights[层数-1,单层最大权重个数],用于存储经过一次反向传播后权重的更新值。
-
隐藏层神经元矩阵hiddenUnits[层数-1,单层最大单元数],用于存储神经元的计算结果(未激活)。
-
隐藏层神经元激活值矩阵hiddenUnitActivitys,用于存储神经元计算结果经过激活函数的结果。
-
隐藏层神经元激活值导数矩阵derHiddenUnitActivitys,用于存储神经元计算结果经过激活函数导函数的结果
weightNums = [unitNums[i]*unitNums[i+1] for i in range(layerNum-1)]
print('weight nums : {}'.format(weightNums))
maxWeightNum = max(weightNums)
print('max weight num : {}'.format(maxWeightNum))
weights = np.random.normal(size=(layerNum-1, maxWeightNum))
for i in range(layerNum-1):
t = weightNums[i]
weights[i,t:] = 0
print('weights : {}'.format(weights.shape))
derWeights = np.zeros(shape=(layerNum-1, maxWeightNum))
print('derweights : {}'.format(derWeights.shape))
hiddenUnits = np.zeros(shape=(layerNum-1, maxUnitNum))
print('hidden units : {}'.format(hiddenUnits.shape))
hiddenUnitActivitys = np.zeros(shape=(layerNum-1, maxUnitNum))
print('hidden unit activitys : {}'.format(hiddenUnitActivitys.shape))
derHiddenUnitActivitys = np.zeros(shape=