1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
| from tqdm import tqdm import numpy as np ''' 用户手册——by clever_bobo 本函数是基于bp神经网络的二分类项目,(输出层激活函数为sigmod)是最基本的3层网络,暂时没有设置纠错选项,请谨慎输入 多分类,输出层激活函数请使用线性整流函数ReLU或者不设置激活函数 输入项分别为训练数据集,模型数据集,隐藏层节点数量,训练次数,学习率 为方便显示,特加入tqdm模块,加个显示条
学习随笔: 目前的主要问题: bp神经网络核心还是基于梯度下降法优化的,但是此时损失函数是非凸的,也就是说局部最小不一定是全局最小,有可能会到一个跟全局最小差别很大的局部最小点或者鞍点
梯度消失问题(鞍点?激活函数引起的尤其是sigmod,tanh)
计算时间长(目前大部分人都吐槽的问题)
优化(本代码均未使用): 初始化一般随机化参数,满足均值为0的正态分布,方差一般取2/(N+M),N为上一层节点数量,M为下一层节点数量 随机梯度下降增加动量(加速收敛,减少震荡) '''
def Readdata(filename): fp=open(filename) dataset,datalabel=[],[] for i in fp.readlines(): databuff=i.strip().split() dataset.append([float(j) for j in databuff[:-1]]) datalabel.append(float(databuff[-1])) return dataset,datalabel
def Para_Init(input,hidden=3,output=3): input_hidden=np.random.randn(input,hidden) hidden_output=np.random.randn(hidden,output) hidden_bias=np.random.randn(1,hidden) output_bias=np.random.randn(1,output) return input_hidden,hidden_output,hidden_bias,output_bias
def sigmod(z): return 1/(1+np.exp(-z))
def D_sigmod(z): return np.multiply(z,(1-z))
def Train(dataset,datalabel,input_hidden,hidden_output,hidden_bias,output_bias,learn_rate=0.01): for i in range(len(datalabel)): input_value=np.mat(dataset[i]) output_label=np.mat(datalabel[i]) hidden_value=sigmod(np.dot(input_value,input_hidden)-hidden_bias) output_value=sigmod(np.dot(hidden_value,hidden_output)-output_bias) d_output_value=D_sigmod(output_value) error=output_label-output_value hidden_output_change=learn_rate*np.dot(np.transpose(hidden_value),np.multiply(error,d_output_value)) output_bias_change=-learn_rate*np.multiply(error,d_output_value) d_hidden_value=D_sigmod(hidden_value) t2=np.transpose(np.dot(hidden_output,np.multiply(error,d_output_value))) input_hidden_change=learn_rate*np.dot(np.transpose(input_value),np.multiply(t2,d_hidden_value)) hidden_bias_change=-learn_rate*t2 hidden_bias +=hidden_bias_change hidden_output +=hidden_output_change input_hidden +=input_hidden_change output_bias += output_bias_change return hidden_bias,hidden_output,input_hidden,output_bias
def Testing(dataset,datalabel,hidden_bias,hidden_output,input_hidden,output_bias): rightnum=0 for i in range(len(dataset)): input_value=np.mat(dataset[i]) output_label=np.mat(datalabel[i]) hidden_value=sigmod(np.dot(input_value,input_hidden)-hidden_bias) output_value=sigmod(np.dot(hidden_value,hidden_output)-output_bias) if abs(output_value-output_label)<0.5: print("本次判断正确!模型判断为%d,实际为%d"%(datalabel[i],datalabel[i])) rightnum += 1 else: t=abs(datalabel[i]-1.0) print("失败了失败了!模型判断为%d,实际为%d"%(t,datalabel[i]))
return rightnum*1.0/len(datalabel) if __name__ =="__main__": dataset, datalabel = Readdata(r'C:\Users\97751\Desktop\BP神经网络(马疝病数据集)\horseColicTraining.txt') hidden=int(input("神经网络设置多少个隐藏节点:")) input_hidden,hidden_output,hidden_bias,output_bias=Para_Init(len(dataset[0]),hidden,output=1) time=int(input("训练次数?")) learn_rate=float(input("学习率?")) for i in tqdm(range(time)): hidden_bias,hidden_output,input_hidden,output_bias=Train(dataset,datalabel,input_hidden,hidden_output,hidden_bias,output_bias,learn_rate) error=Testing(dataset, datalabel,hidden_bias,hidden_output,input_hidden,output_bias) print("正确率为:%.4f"%(error))
|