作者:xh7212176 | 来源:互联网 | 2023-09-23 13:48
对于bp神经网络有无激活函数训练,本文使用sigmod函数。对于有sigmoid的bp神经网络,由于sigmod函数理论上讲可将线性相加的组合映射到(0,1)的区间,在一定程度上可
对于bp神经网络有无激活函数训练,本文使用sigmod函数。
对于有sigmoid的bp神经网络,由于sigmod函数理论上讲可将线性相加的组合映射到(0,1)的区间,在一定程度上可以使得将输入进行预测并作出分类。同时,运用梯度下降来更新权重使得反向传播得到可能。
对于无sigmod函数,从理论上讲,其模型就是简单的线性相加求和,对于非线性模型进行预测毫无理论支撑性可言,并且其线性相加的数值可根据权值大小得出的结果也无限大小,其结果数值波动性也特别大,而非误差一直向数值小处进行拓展。
本文使用pycharm对两者进行模拟,对于反向传播,有sigmod函数的bp神经网络还是利用链式法则依次求偏导,无sigmod函数的bp神经网络则直接跳过对激活函数求偏导,而直接对输入函数z(z=w*x+b)求偏导。
迭代100次后观察得出:
无sigmod函数的bp神经网络,其残差数值波动性较大,可能第i+1次比第i次迭代得出的结果还要大,并可能由于偶然性因素,残差竟在第51次迭代得0。但其结果毫无理论性支撑可言。于是换了一组原始输入值,发现其得出结果误差波动性较大,其结果也无实际意义,无法解释其结果理论意义。
#有sigmod函数bp神经网络代码
import numpy as np
import math
def nonlin(x, deriv=False):
if (deriv == True):
return x * (1 - x) #如果deriv为true,求导数
else:
return 1 / (1 + np.exp(-x))
X = np.array([[0.35],[0.9]]) #输入层
y = np.array([[0.5]]) #输出值
np.random.seed(1)
min=9999
W0 = np.array([[0.1,0.8],[0.4,0.6]])
W1 = np.array([[0.3,0.9]])
print('original ',W0,'\n',W1)
print('begin time ')
for j in range(100):
l0 = X #相当于文章中x0
l1 = nonlin(np.dot(W0,l0)) #相当于文章中y1
l2 = nonlin(np.dot(W1,l1)) #相当于文章中y2
l2_error = y - l2
Error = 1/2.0*math.pow(l2_error,2)
print('ERROR',j,':',Error)
l2_delta = l2_error * nonlin(l2, deriv=True) #this will backpack
#print 'l2_delta=',l2_delta
l1_error = l2_delta*W1; #反向传播
l1_delta = l1_error * nonlin(l1.T, deriv=True)
W1 += l2_delta*l1.T; #修改权值
W0 += l1_delta.dot(l0)
print(W0,'\n',W1)
print('endtime')
无sigmod函数bp神经网络代码
import numpy as np
import math
X = np.array([[0.35],[0.9]]) #输入层 #第二次输入值为[0.8],[0.9]
y = np.array([[0.5]]) #输出值 #第二次输入值为[0.7]
np.random.seed(1)
min=9999
W0 = np.array([[0.1,0.8],[0.4,0.6]])
W1 = np.array([[0.3,0.9]])
print('original ',W0,'\n',W1)
print('begin time ')
for j in range(100):
l0 = X #相当于文章中x0
l1 = np.dot(W0,l0) #相当于文章中y1
l2 = np.dot(W1,l1) #相当于文章中y2
l2_error = y - l2
Error = 1/2.0*math.pow(l2_error,2)
print('ERROR',j,':',Error)
l1_delta = l2_error * W1
W1+=l2_error*l1.T
W0+=l1_delta.dot(l0)
#print("Error:",Error)
print(W0,'\n',W1)
print('endtime')
无sigmod函数结果
更改输入值后结果