大理住房和城乡建设部网站,wordpress目录顺序,织梦 企业网站,建设企业展示网站这个里面要学习和展示的内容会比较多#xff0c;需要好好的认真思考
第一个要思考的就是#xff1a;输入和输出相关性的理解#xff0c;我们先拿一层的神经网络来说明一下#xff0c;
输入有2个因素#xff0c;对应有两个权重#xff0c;输出有一个结果。
输入的两个因…这个里面要学习和展示的内容会比较多需要好好的认真思考
第一个要思考的就是输入和输出相关性的理解我们先拿一层的神经网络来说明一下
输入有2个因素对应有两个权重输出有一个结果。
输入的两个因素对应和两个权重乘积相加后就是我们的预测值这个过程大家应该是没有什么问题吧那么我们发现一个问题如果此时预测值和真实值的误差是一个负值那么也就是说现在的输入的两个因素中的权重较大的那个带来的误差比较大。
反过来说如果输入的2个因素和权重乘积后相加的预测值和真实值之间的误差是一个真值且误差很小那么说明此时的在输入中的权重大的那个值和输出的相关性就高。
这个里面就引入了相关性的问题因为我们在找误差最小值更新权重的时候其实就是在找每个输入的因素和输出因素的之间的相关性也就是找到决定性的因素。就如同红绿灯一样如果绿灯时亮输入绿灯为1那么现在就是可以行走输出结果是1。也就是是否可以行走和绿灯的亮灭是由关键作用的。相关性特别高。
第二个要思考的就是如果一个人在处理输入数据的时候他不知道输入和输出的相关性由多大。他给的数据很多有的输入和输出有相关性有的输入和输出没有相关性。没有相关性的输入就会把权重分走一部分那么就导致强相关的不能强影响。导致我们识别的概率变小。或者我们也识别不出来。就如同红绿灯的问题本来你只需看红绿灯就行但是你不仅仅观察了红绿灯的亮灭你又去观察了行人男人的数量或者是汽车的数量或者是马路的宽度或者是别的很多的输入值。那么这样你就输入值由2个变成了很多。如果数量足够多的时候你会发现绿灯和是否行走的权重被拉低了很多当绿灯的权重被拉低到0.5以下的时候即使现在是绿灯我们也不敢随便行走了。不知道大家是否明白可以自己再想想。
第三个要思考的就是基于上面的两个思考于是我们想到了一个办法一个可以增强和消弱权重的方法就是引入2层神经网络同时引入激活函数和反向传播。
为什么引入2层神经网络呢是因为如果一层神经网络输入和输出的值之间永远都是线性的就是没有办法排查其他干扰项。
如果引入了2层神经网络当输入和权重计算完成给第一层的输出时如果此时第一层的输出值大于0的那么说明你这个值会对第二层的预测值产生影响那么我们就保留这个值如果此时第一层的输出值小于0的我们就认为对输出没有影响或者由反的影响那我们就把第一层输出的小于0的值让它归0这样减少反向的影响。
同时在第二层输出到第一层输出的权重更新时如果第一层的输出值是大于0的那我们就把第一层的输出值变成1反向增强这个层的值在经过第一层输出层到输入层时就是把输入层到第一层输出层的权重进行加强。
这样经过多轮训练以后输入层和第一层输出层的权重大的就是相关性强的权重小的就是相关性弱的这样就权重弱的可以分的相关性会少很多。保证了输入和输出的强相关性。
在这里的使用的就是relu激活函数。
具体的程序如下
import numpy as npnp.random.seed(1)
def relu(x):return (x0)*xdef relu2deriv(output):return output0streetlights np.array([[1,0,1],#红灯亮绿灯灭黄灯亮[0,1,1],#红灯灭绿灯亮黄灯亮[0,0,1],#红灯灭绿灯灭黄灯亮[1,1,1]#红灯亮绿灯亮黄灯亮
])#沃恩会发现单单用肉眼观察我们是不知道输入和输出的相关性的但是经过处理之后我们依然可以得到强相关的输入因素绿灯。从最后的测试中我们也知道了我们计算权重是对的。walk_vs_stop np.array([0,1,0,1]).T
#print(walk_vs_stopstr(walk_vs_stop))
alpha 0.2hidden_size 4
weights_0_1 2*np.random.random((3,hidden_size)) - 1
#print(weight_0_1str(weights_0_1))
weights_1_2 2*np.random.random((hidden_size,1)) - 1
#print(weight_1_2str(weights_1_2))for interation in range(60):layer_2_error 0for i in range(len(streetlights)):layer_0 streetlights[i:i1]#print(streetlights[i:i1]str(streetlights[i:i1]))layer_1 relu(np.dot(layer_0,weights_0_1))#print(layer_1str(layer_1))layer_2 np.dot(layer_1,weights_1_2)#print(layer_2str(layer_2))layer_2_error np.sum((layer_2 - walk_vs_stop[i:i1])**2)#print(layer_2_errorstr(layer_2_error))#print(walk_vs_stop[i:i1]str(walk_vs_stop[i:i1]))layer_2_delta (layer_2 - walk_vs_stop[i:i1])#print(layer_2_deltastr(layer_2_delta))layer_1_delta layer_2_delta.dot(weights_1_2.T)*relu2deriv(layer_1)#print(relu2deriv(layer_1)str(relu2deriv(layer_1)))#print(layer_1_deltastr(layer_1_delta))weights_1_2 - alpha*layer_1.T.dot(layer_2_delta)#print(weights_1_2str(weights_1_2))weights_0_1 - alpha*layer_0.T.dot(layer_1_delta)#print(weights_0_1str(weights_0_1))if(interation%109):print(errorstr(layer_2_error))print(weights_0_1str(weights_0_1))print(weights_1_2str(weights_1_2))print()print()print()#代入数据测试使用如程序
#激活函数不能变延续使用激活函数可以得到最精确的数据在数据量不够的情况下
layer_text [0,1,0]
layer_0 layer_text
layer_1 relu(np.dot(layer_0,weights_0_1))
print(text_layer_1str(layer_1))
layer_2 np.dot(layer_1,weights_1_2)
print(textstr(layer_2))
运行结果为