当前位置: 首页 > news >正文

15、深度学习-自学之路-反向传播程序展示、激活函数的应用,反向权重的更新、2层神经网络的应用,输入输出相关性的理解。

这个里面要学习和展示的内容会比较多,需要好好的认真思考

第一个要思考的就是:输入和输出相关性的理解,我们先拿一层的神经网络来说明一下,

输入有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 (x>0)*xdef relu2deriv(output):return output>0streetlights = 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_stop"+str(walk_vs_stop))
alpha = 0.2hidden_size = 4
weights_0_1 = 2*np.random.random((3,hidden_size)) - 1
#print("weight_0_1"+str(weights_0_1))
weights_1_2 = 2*np.random.random((hidden_size,1)) - 1
#print("weight_1_2"+str(weights_1_2))for interation in range(60):layer_2_error = 0for i in range(len(streetlights)):layer_0 = streetlights[i:i+1]#print("streetlights[i:i+1]"+str(streetlights[i:i+1]))layer_1 = relu(np.dot(layer_0,weights_0_1))#print("layer_1"+str(layer_1))layer_2 = np.dot(layer_1,weights_1_2)#print("layer_2"+str(layer_2))layer_2_error +=np.sum((layer_2 - walk_vs_stop[i:i+1])**2)#print("layer_2_error"+str(layer_2_error))#print("walk_vs_stop[i:i+1]"+str(walk_vs_stop[i:i+1]))layer_2_delta = (layer_2 - walk_vs_stop[i:i+1])#print("layer_2_delta"+str(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_delta"+str(layer_1_delta))weights_1_2 -= alpha*layer_1.T.dot(layer_2_delta)#print("weights_1_2"+str(weights_1_2))weights_0_1 -= alpha*layer_0.T.dot(layer_1_delta)#print("weights_0_1"+str(weights_0_1))if(interation%10==9):print("error"+str(layer_2_error))print("weights_0_1"+str(weights_0_1))print("weights_1_2"+str(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_1"+str(layer_1))
layer_2 = np.dot(layer_1,weights_1_2)
print("text"+str(layer_2))

运行结果为:

http://www.lryc.cn/news/535329.html

相关文章:

  • 【JavaEE进阶】依赖注入 DI详解
  • 医疗影响分割 | 使用 Swin UNETR 训练自己的数据集(3D医疗影像分割教程)
  • IGBT的两级关断
  • 微服务与网关
  • “云计算一哥”一口气发布6个大模型、3nm芯片!多模态还要搞Any-to-Any
  • pytest生成报告no tests ran in 0.01s
  • 如何修改DNS解析?
  • PyTorch 中 `torch.cuda.amp` 相关警告的解决方法
  • 微服务组件LoadBalancer负载均衡
  • 如何本地部署DeepSeek
  • vite + axios 代理不起作用 404 无效
  • centos7 升级openssl并安装python3
  • 使用 SDKMAN! 在 Mac(包括 ARM 架构的 M1/M2 芯片)上安装 Java 8
  • 【干活分享】2025年可以免费问答的一些GPT网站-deepseek等免费gpt
  • 20250211解决荣品的RK3566核心板在Android13下出现charge_extrem_low_power的问题
  • MapReduce到底是个啥?
  • 算法02-各种排序算法
  • python基础入门:8.1项目1:爬虫与数据分析
  • git 克隆指定 tag 的项目
  • DeepSeek学习笔记之——初识DeepSeek
  • Linux 调用可执行程序
  • MVCC面试怎么答
  • 用Go实现 SSE 实时推送消息(消息通知)——思悟项目技术4
  • 0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型
  • vue3:动态渲染后端返回的图片
  • DeepSeek小白初识指南
  • 图像锐化(QT)
  • 38.社区信息管理系统(基于springboothtml)
  • 游戏引擎学习第98天
  • 音频知识基础