首页 > 编程知识 正文

bp神经网络与卷积神经网络,神经网络bp算法推导

时间:2023-05-05 03:37:26 阅读:18403 作者:3354

人工神经网络及BP算法的理解及如何利用神经网络选瓜一.人工神经网络的理解:二. BP算法的理解:5.13公式推导:4.模板代码:

一.人工神经网络理解:

开始看人工神经网络的时候,我觉得自己很厉害,但随着理解的深入,我意识到其实就那么点东西,说白了就是套上模板。 这里为了区别于生物神经网络,人工神经网络又称神经网络,但其复杂性远远低于生物神经网络。 这里用代码进行模拟。 也就是说,不是制造所谓的神经元,而是使用一些参数假设神经元的存在。 例如,制作两个神经元之间路径的数值和其他特征的数值来模拟神经元的存在。

这里将神经元视为函数,具有输入和输出。 在有多个输入值的情况下,对各个输入值进行加权操作,将加权后的值相加,对相加后的值和该神经元的阈值进行差分,将差分值作为该神经元的最终输入。 简而言之,每个初始变量乘以系数进行加法运算。 然后,以最终的输入值为自变量,计算出与该神经元对应的函数值。 与该神经元对应的函数是人为设定的,一般使用该函数sidmoid。 (

之所以采用这个函数,是因为这个函数是连续的,并且具有很好的求导性质。 也就是说

便于以后进行权重和阈值更新

在构建神经网络时,首先构建输入层和输出层,然后根据需要构建隐藏层。 隐藏层的数量可以是多层,通常在创建时采用隐藏层。 这是因为一层的精度已经很高了。 如果采用多层,在增加运算上的负担的同时,精度也不会提高。 当然,不创建隐藏层,只需要输入层和输出层,有些简单的处理就足够了。

以下是两个神经网络图模型:

2 .理解BP算法: BP算法即误差反向传播算法设置神经网络的初始权重和阈值,然后将输入值输入神经网络的输入层,通过神经网络的处理得到最终结果,结果对每个样本进行调整,但在调整次数足够多时,其神环境网的阈值和权重非常理想,认为那时神环境网的差错率非常低。 也就是说,我们训练的人工智能可以把这个训练的神环境网络处理成其他数据,得到预期的结果。

这里,以单个隐藏层的神经网络为例,假设输出层有l个神经元,我们采用

Ek被称为均方误差。

虽然Ek的值理想上是0,但是如果实际值不是0,则实际值和期待值之间的差是Ek,根据该值来调整权重和阈值。

3.5.13公式推导:这里进行资料5.13公式推导,先给出已经推导的公式

输出层第j个神经元的阈值

元输出。

在上述导出的基础上,我们导出

根据定义

其中:

我们就这三个分别要求:

首先:

如果是:

gi是以前导出的

然后求第二个:

我在这里用了:

求最后一项:

这比较简单:

综上所述:

四、 模板代码: importnumpyasnpfromnumpy.core.fromnumericimportputfromnumpy.lib.function _ baseimportappendimportpandasasasasion 设置reprocessing#文本标签的数字程序trans1=preprocessing.label encoder (trans2=preprocessing.label trans1=trans1. fit )牢固)、(混浊)、(沉闷)、(清爽)、(清晰)、(模糊) 65 '软粘' (trans2=trans2. fit ) ([ '是] ' no'] )加载数据defloaddataset ) path ) :#path='c:(_sers ) )小encoding='utf8 ' )存储数据dataset=NP.arrrrars )存储标签labelset=NP.array ) for i in file.readlines ) ) 3360a=I ' ) temp=[]temp.extend(a[1:-3] ) temp=TRR

= np.append(dataset, temp) p = np.array([]) p = np.append(p, a[-1]) p = trans2.transform(p) labelset = np.append(labelset, p) # 每个数据行的最后一个是标签 dataset = dataset.reshape((17, 8)) file.close() return dataset, labelsetdef parameter_initialization(x, y, z): # 隐层阈值 value1 = np.random.randint(-5, 5, (1, y)).astype(np.float64) # 输出层阈值 value2 = np.random.randint(-5, 5, (1, z)).astype(np.float64) # 输入层与隐层的连接权重 weight1 = np.random.randint(-5, 5, (x, y)).astype(np.float64) # 隐层与输出层的连接权重 weight2 = np.random.randint(-5, 5, (y, z)).astype(np.float64) '''value1=np.ones((1,8)) value2=np.ones((1,1)) weight1=np.ones((8,8)) weight2=np.ones((8,1))''' return weight1, weight2, value1, value2def sigmoid(z): return 1 / (1 + np.exp(-z))def trainning(dataset, labelset, weight1, weight2, value1, value2): # x为步长 x = 0.1 for i in range(len(dataset)): # 输入数据 inputset = np.mat(dataset[i]).astype(np.float64) # 数据标签 outputset = np.mat(labelset[i]).astype(np.float64) # 隐层输入 input1 = np.dot(inputset, weight1).astype(np.float64) # 隐层输出 output2 = sigmoid(input1 - value1).astype(np.float64) # 输出层输入 input2 = np.dot(output2, weight2).astype(np.float64) # 输出层输出 output3 = sigmoid(input2 - value2).astype(np.float64) # 更新公式由矩阵运算表示 a = np.multiply(output3, 1 - output3) g = np.multiply(a, outputset - output3) b = np.dot(g, np.transpose(weight2)) c = np.multiply(output2, 1 - output2) e = np.multiply(b, c) value1_change = -x * e value2_change = -x * g weight1_change = x * np.dot(np.transpose(inputset), e) weight2_change = x * np.dot(np.transpose(output2), g) # 更新参数 value1 += value1_change value2 += value2_change weight1 += weight1_change weight2 += weight2_change return weight1, weight2, value1, value2def testing(dataset, labelset, weight1, weight2, value1, value2): # 记录预测正确的个数 rightcount = 0 for i in range(len(dataset)): # 计算每一个样例通过该神经网路后的预测值 inputset = np.mat(dataset[i]).astype(np.float64) outputset = np.mat(labelset[i]).astype(np.float64) output2 = sigmoid(np.dot(inputset, weight1) - value1) output3 = sigmoid(np.dot(output2, weight2) - value2) # 确定其预测标签 if output3 > 0.5: flag = 1 else: flag = 0 if labelset[i] == flag: rightcount += 1 # 输出预测结果 print("预测为%d 实际为%d" % (flag, labelset[i])) # 返回正确率 return rightcount / len(dataset)filename = "C:\Users\小白白\Desktop\names.txt"d1, d2 = loaddataset(filename)w1, w2, v1, v2 = parameter_initialization(len(d1[0]), len(d1[0]), 1)for i in range(5000): w1, w2, v1, v2 = trainning(d1, d2, w1, w2, v1, v2)sum=0for i in range(10): sum+=(testing(d1,d2,w1,w2,v1,v2)) print(sum/10.0) t = int(input("请输入测试样例个数:"))for i in range(t): s = input("请按顺序输入西瓜特征:") s = s.strip().split(",") temp = [] temp.extend(s[1:-2]) temp = trans1.transform(temp) temp = np.append(temp, s[-2]) temp = np.append(temp, s[-1]) inputset = np.mat(temp).astype(np.float64) output2 = sigmoid(np.dot(inputset, w1) - v1) output3 = sigmoid(np.dot(output2, w2) - v2) p="" if output3 > 0.5: p = "好" else: p = "坏" print("该西瓜判断为%s瓜" % p)

当然,学习率的设置要适当,通常设置为0.1;
学习次数越多,所得的准确率越高

由于初始设定的权值和阈值为随机产生的,所以准确率有一定的浮动,
每次运行程序所得的准确率都不同,但大致在一定范围内,所谓没必要太过计较所造成的偏差。

以下为训练集:

编号,色泽,根蒂,敲声,纹理,脐部,触感,密度,含糖率,好瓜1,青绿,蜷缩,浊响,清晰,凹陷,硬滑,0.697,0.46,是2,乌黑,蜷缩,沉闷,清晰,凹陷,硬滑,0.774,0.376,是3,乌黑,蜷缩,浊响,清晰,凹陷,硬滑,0.634,0.264,是4,青绿,蜷缩,沉闷,清晰,凹陷,硬滑,0.608,0.318,是5,浅白,蜷缩,浊响,清晰,凹陷,硬滑,0.556,0.215,是6,青绿,稍蜷,浊响,清晰,稍凹,软粘,0.403,0.237,是7,乌黑,稍蜷,浊响,稍糊,稍凹,软粘,0.481,0.149,是8,乌黑,稍蜷,浊响,清晰,稍凹,硬滑,0.437,0.211,是9,乌黑,稍蜷,沉闷,稍糊,稍凹,硬滑,0.666,0.091,否10,青绿,硬挺,清脆,清晰,平坦,软粘,0.243,0.267,否11,浅白,硬挺,清脆,模糊,平坦,硬滑,0.245,0.057,否12,浅白,蜷缩,浊响,模糊,平坦,软粘,0.343,0.099,否13,青绿,稍蜷,浊响,稍糊,凹陷,硬滑,0.639,0.161,否14,浅白,稍蜷,沉闷,稍糊,凹陷,硬滑,0.657,0.198,否15,乌黑,稍蜷,浊响,清晰,稍凹,软粘,0.36,0.37,否16,浅白,蜷缩,浊响,模糊,平坦,硬滑,0.593,0.042,否17,青绿,蜷缩,沉闷,稍糊,稍凹,硬滑,0.719,0.103,否

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。