【笔记】深度学习入门:基于Python的理论与实现(三)

误差反向传播法

一 个能够高效计算权重参数的梯度的方法

计算图

正向传播

太郎在超市买了 2 个 100 日元一个的苹果,消费税是 10%,请计 算支付金额。
在这里插入图片描述

反向传播(导数)

如果苹果的价格增加某个微小值, 则最终的支付金额将增加那个微小值的 2.2 倍
在这里插入图片描述

链式法则(可以了解下复合函数的链式求导法则)

反向传播的计算顺序是,将信号 E 乘以节点的局部导数 ( ),然后将结果传递给下一个节点
在这里插入图片描述

复合函数链式求导法则,这里略。

链式法则和计算图

在这里插入图片描述

反向传播

加法节点的反向传播将上游的值原封不动地输出到下游
在这里插入图片描述
乘法的反向传播会乘以输入信号的翻转值
在这里插入图片描述
简单例子:
在这里插入图片描述

简单层的实现

乘法层的实现

class MulLayer:def __init__(self):self.x = None self.y = Nonedef forward(self, x, y): self.x = xself.y = y out = x * yreturn outdef backward(self, dout):dx = dout * self.y # 翻转x和y dy = dout * self.xreturn dx, dy

例子:
在这里插入图片描述

# 正向传播
apple = 100 
apple_num = 2 
tax = 1.1
# layer
mul_apple_layer = MulLayer() 
mul_tax_layer = MulLayer()
# forward
apple_price = mul_apple_layer.forward(apple, apple_num) 
price = mul_tax_layer.forward(apple_price, tax)
print(price) # 220# 反向传播
dprice = 1
dapple_price, dtax = mul_tax_layer.backward(dprice)
dapple, dapple_num = mul_apple_layer.backward(dapple_price) 
print(dapple, dapple_num, dtax) # 2.2 110 200

加法层的实现

激活函数层的实现

ReLU 层

ReLU表达式、导数式、计算图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

python实现:

class Relu:def __init__(self):# 由 True/False 构成的 NumPy 数组self.mask = Nonedef forward(self, x): # 根据是否x<=0将x数组转化成True/False数组self.mask = (x <= 0) out = x.copy() # 是True的也就是x<=0的就输出0,其他的不变out[self.mask] = 0return outdef backward(self, dout): # 若为true则表示x<=0此时输出0 其他的不变dout[self.mask] = 0 dx = doutreturn dx

Sigmoid 层

表达式、计算图
在这里插入图片描述
在这里插入图片描述

其中一些注意的地方

  • “/”节点表示 y = 1/x,它的导数表达式为: 在这里插入图片描述
  • “exp”节点表示y = exp(x),导数仍为exp(x)
  • 反向的输出结果可以进行简化推导:在这里插入图片描述

可以得到完整的计算图为:
在这里插入图片描述
简化为:
在这里插入图片描述
Python 实现 Sigmoid 层

class Sigmoid:def __init__(self):self.out = Nonedef forward(self, x):out = 1 / (1 + np.exp(-x)) self.out = outreturn outdef backward(self, dout):dx = dout * (1.0 - self.out) * self.outreturn dx

Affine/Softmax 层的实现

Affine 层

神经网络的正向传播中进行的矩阵的乘积运算在几何学领域被称为“仿射变换”(几何中,仿射变换包括一次线性变换和一次平移,分别对应神经网络的加权和运算与加偏置运算)。因此,这里将进行仿射变换的处理实现为“Affine 层”。
复习一下内积
在这里插入图片描述

Affine层计算图(3,) = (1,3):
在这里插入图片描述

批版本的 Affine 层

N批:
在这里插入图片描述
正向传播时,偏置会被加到每一个数据(第 1 个、第 2 个…)上。因此, 反向传播时,各个数据的反向传播的值需要汇总为偏置的元素

>>> dY = np.array([[1, 2, 3,], [4, 5, 6]]) 
>>> dY
array([[1, 2, 3],[4, 5, 6]])
>>> dB = np.sum(dY, axis=0) 
>>> dB
array([5, 7, 9])

python实现:

class Affine:def __init__(self, W, b):self.W = W self.b = b self.x = None self.dW = None self.db = Nonedef forward(self, x): self.x = xout = np.dot(x, self.W) + self.breturn outdef backward(self, dout):# .T转置dx = np.dot(dout, self.W.T) self.dW = np.dot(self.x.T, dout) self.db = np.sum(dout, axis=0)return dx

Softmax-with-Loss 层

Softmax 层。考虑到这里也包含作为损失函数的交叉熵误差(cross entropy error),所以称为“Softmax-with-Loss层”

计算图:
在这里插入图片描述
简化版:
在这里插入图片描述

由于(y1, y2, y3)是 Softmax 层的输出,(t1, t2, t3)是监督数据,所以(y1 − t1, y2 − t2, y3 − t3)是 Softmax 层的输 出和教师标签的差分

python实现:

class SoftmaxWithLoss: def __init__(self):self.loss = None # 损失self.y = None # softmax的输出self.t = None # 监督数据(one-hot vector)def forward(self, x, t): self.t = tself.y = softmax(x)self.loss = cross_entropy_error(self.y, self.t)return self.lossdef backward(self, dout=1):batch_size = self.t.shape[0]# 批的大小(batch_size)dx = (self.y - self.t) / batch_sizereturn dx

误差反向传播法的实现

在步骤2(计算损失函数关于各个权重参数的梯度)计算梯度中,数值微分虽然实现简单,但是计算要耗费较多的时间。和需要花费较多时间的数值微分不同,误差反向传播法可以快速高效地计算梯度。

对应误差反向传播法的神经网络的实现

主要在于这里使用了层。通过使用层,获得识别结果的处理(predict())和计算梯度的处理(gradient())只需通过层之间的传递就能完成

import sys, os
sys.path.append(os.pardir)
import numpy as np
from common.layers import *
from common.gradient import numerical_gradient from collections import OrderedDict
class TwoLayerNet:def __init__(self, input_size, hidden_size, output_size, weight_init_std=0.01):# 初始化权重 self.params = {} self.params['W1'] = weight_init_std * \ np.random.randn(input_size, hidden_size)self.params['b1'] = np.zeros(hidden_size)self.params['W2'] = weight_init_std * \ np.random.randn(hidden_size, output_size)self.params['b2'] = np.zeros(output_size)# 生成层# OrderedDict 是有序字典,“有序”是指它可以记住向字典里添加元素的顺序self.layers = OrderedDict() self.layers['Affine1'] = \Affine(self.params['W1'], self.params['b1']) self.layers['Relu1'] = Relu() self.layers['Affine2'] = \Affine(self.params['W2'], self.params['b2']) self.lastLayer = SoftmaxWithLoss()def predict(self, x):for layer in self.layers.values(): x = layer.forward(x)return x# x:输入数据, t:监督数据 def loss(self, x, t):y = self.predict(x)return self.lastLayer.forward(y, t)def accuracy(self, x, t):y = self.predict(x)y = np.argmax(y, axis=1)if t.ndim != 1 : t = np.argmax(t, axis=1)accuracy = np.sum(y == t) / float(x.shape[0])return accuracy# 通过数值微分计算关于权重参数的梯度 x:输入数据, t:监督数据def numerical_gradient(self, x, t):loss_W = lambda W: self.loss(x, t)grads = {}grads['W1'] = numerical_gradient(loss_W, self.params['W1']) grads['b1'] = numerical_gradient(loss_W, self.params['b1']) grads['W2'] = numerical_gradient(loss_W, self.params['W2']) grads['b2'] = numerical_gradient(loss_W, self.params['b2'])return grads# 通过误差反向传播法计算关于权重参数的梯度def gradient(self, x, t):# forward self.loss(x, t)# backwarddout = 1dout = self.lastLayer.backward(dout)layers = list(self.layers.values()) layers.reverse()for layer in layers:dout = layer.backward(dout)# 设定grads = {}grads['W1'] = self.layers['Affine1'].dW grads['b1'] = self.layers['Affine1'].db grads['W2'] = self.layers['Affine2'].dW grads['b2'] = self.layers['Affine2'].dbreturn grads

误差反向传播法的梯度确认

确认数值 微分求出的梯度结果和误差反向传播法求出的结果是否一致(严格地讲,是 非常相近)的操作称为梯度确认(gradient check)

python代码实现:

import sys, os sys.path.append(os.pardir)
import numpy as np
from dataset.mnist import load_mnist from two_layer_net import TwoLayerNet
# 读入数据
(x_train, t_train), (x_test, t_test) = \ load_mnist(normalize=True, one_ hot_label = True)
network = TwoLayerNet(input_size=784, hidden_size=50, output_size=10) 
x_batch = x_train[:3]
t_batch = t_train[:3]
grad_numerical = network.numerical_gradient(x_batch, t_batch)
grad_backprop = network.gradient(x_batch, t_batch)
# 求各个权重的绝对误差的平均值
for key in grad_numerical.keys():diff = np.average( np.abs(grad_backprop[key] - grad_numerical[key]) ) print(key + ":" + str(diff))

使用误差反向传播法的学习

# 通过误差反向传播法求梯度(在实现基础上的替换)
grad = network.gradient(x_batch, t_batch)

小结

• 通过使用计算图,可以直观地把握计算过程。
• 计算图的节点是由局部计算构成的。局部计算构成全局计算。
• 计算图的正向传播进行一般的计算。通过计算图的反向传播,可以计算各个节点的导数。
• 通过将神经网络的组成元素实现为层,可以高效地计算梯度(反向传播法)。
• 通过比较数值微分和误差反向传播法的结果,可以确认误差反向传播法的实现是否正确(梯度确认)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2813211.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【JavaSE】实用类——String、日期等

目录 String类常用方法String类的equals()方法String中equals()源码展示 “”和equals()有什么区别呢&#xff1f; StringBuffer类常用构造方法常用方法代码示例 面试题&#xff1a;String类、StringBuffer类和StringBuilder类的区别&#xff1f;日期类Date类Calendar类代码示例…

Redis学习------实战篇----2024/02/27

1.导入项目 2.基于Session实现登录 手机验证码完整实现 /*** 发送验证码* param phone* param session* return*/Overridepublic Result sendCode(String phone, HttpSession session) {//1.校验手机号if(RegexUtils.isPhoneInvalid(phone)){//2.如果不符合&#xff0c;返回错…

非常好!超齐全的故障诊断数据集及相关实验平台介绍

故障诊断数据集目录 一. 故障诊断数据集库介绍 二. 轴承故障诊断数据集 1.美国-凯斯西储大学轴承数据中心轴承数据集 2.SUDA试验台数据集 3.美国-机械故障预防技术学会MFPT 4.德国-帕德伯恩大学Paderborn轴承数据集 5.SDUST山东科技大学数据集 6.SEU东南大学轴承数据集 …

ARMv8-AArch64 的异常处理模型详解之异常处理详解(同步异常和异步异常的分析和处理)

这里写目录标题 一&#xff0c;同步异常的分析1.1 同步异常分析-异常链接寄存器ELR1.2 同步异常分析-异常综合寄存器ESR&#xff0c;Exception Syndrome Register1.3 同步异常分析-错误地址寄存器FAR,Fault Address Register 二&#xff0c; 同步异常的处理示例 Synchronous ex…

windows 11+docker desktop+grafana+influxDB+python写入

下载安装docker desktop 出现WSL相关的错误。WSL是一个linux内核的子系统&#xff0c;docker是基于linux内核的&#xff0c;所以运行docker需要WSL。 以管理员权限打开powershell&#xff0c;查看WSL状态 wsl --status 我遇到的错误是因为我关闭了windows的某些更新 执行上…

SAP Business Technology Platform (BTP)的架构理解

长期以来&#xff0c;我在与客户和伙伴的沟通交流中发现大家依然对SAP业务技术平台 - SAP Business Technology Platform (以下简称BTP)纯有各种疑惑&#xff0c;借此机会借助我原来作为SAP内部IT开发的经验和近期一年来在客户前线的经验&#xff0c;简要聊一下我对BTP的架构理…

工厂安全智能巡检机器人系统开发及其对您的价值体现

在工厂生产环境中&#xff0c;安全生产一直是业主、采购商以及中间商们十分关注的焦点。为了提升工厂生产线的安全性、效率和可追溯性&#xff0c;一款工厂安全智能巡检机器人系统应运而生&#xff0c;旨在为需求方带来全新的生产安全管理模式。 自动巡检增加效率 传统的工厂…

SD-WAN技术:优化国内外服务器访问的关键

在全球化的商业环境中&#xff0c;企业经常需要在国内访问国外的服务器。然而&#xff0c;由于地理位置和网络架构的限制&#xff0c;这种跨国访问往往会遇到速度慢、延迟高等问题。SD-WAN&#xff08;软件定义广域网&#xff09;技术的兴起&#xff0c;为企业提供了一种新的解…

大文件传输之udp如何传输大量数据

在数字化时代&#xff0c;对大文件传输的需求正以前所未有的速度增长。无论是个人用户还是企业&#xff0c;都急切寻求一种能够快速且稳定地处理大量数据的传输方法。UDP&#xff08;用户数据报协议&#xff09;以其无连接的特性和高效的数据传输能力&#xff0c;成为了大文件传…

C语言自定义数据类型(三)结构体指针

所谓结构体指针就是指向结构体变量的指针&#xff0c;一个结构体变量的起始地址就是这个结构体变量的指针。如果把一个结构体变量的起始地址存放在一个指针变量中&#xff0c;那么&#xff0c;这个指针变量就指向该结构体变量。 目录 一、指向结构体变量的指针 1.1举例说明 …

就业班 2401--2.26 Linux Day5--进程管理一

一、权限扩展 文件权限管理之&#xff1a; 隐藏权限防止root误删除 文件属性添加与查看 [rootlinux-server ~]# touch file1 file2 file3 1.查看文件属性 [rootlinux-server ~]# lsattr file1 file2 file3 ---------------- file1 ---------------- file2 ----------------…

【吴恩达·机器学习】第四章:详解神经网络:推理和训练

博主简介&#xff1a;努力学习的22级计算机科学与技术本科生一枚&#x1f338;博主主页&#xff1a; Yaoyao2024每日一言&#x1f33c;: 勇敢的人&#xff0c;不是不落泪的人&#xff0c;而是愿意含着泪继续奔跑的人。 ——《朗读者》 0、声明 本系列博客文章是博主本人根据吴…

RubyMine 2023:让Ruby编程变得更简单 mac/win版

JetBrains RubyMine 2023是一款专为Ruby开发者打造的强大集成开发环境&#xff08;IDE&#xff09;。这款工具集成了许多先进的功能&#xff0c;旨在提高Ruby编程的效率和生产力。 RubyMine 2023软件获取 RubyMine 2023的智能代码编辑器提供了丰富的代码补全和提示功能&#…

深度学习基础(三)循环神经网络(RNN)

之前的章节我们初步介绍了卷积神经网络&#xff08;CNN&#xff09;&#xff1a; 深度学习基础&#xff08;二&#xff09;卷积神经网络&#xff08;CNN&#xff09;-CSDN博客文章浏览阅读2次。卷积神经网络&#xff08;CNN&#xff09;的应用领域广泛&#xff0c;尤其在图像处…

Delphi 报错 Type androidx.collection.ArraySet is defined multiple times

Delphi 11 建立一个新的 Multi-Device Application 编译成app的时候报错 报错信息 [PAClient Error] Error: E7688 Unable to execute "E:\Program\Java\jdk1.8.0_301\bin\java.exe" -cp "e:\program\embarcadero\studio\22.0\bin\Android\r8-3.3.28.jar"…

git push提交后GitHub没有统计我的Contributions

我在家里的电脑上创建了一个仓库&#xff0c;然后在笔记本上录取下来并进行提交合并等操作&#xff0c;但是发现笔记本上提交的记录并没有被github记录&#xff0c;就是那个绿色的点没有 就是提交完之后 没有出现当天的绿色的点 通过git log 后发现&#xff0c;提交记录中存在…

【pytorch】常用代码

文章目录 条件与概率torch.tensor()torch.rand()torch.randn()torch.randint()torch.multinominal() 逻辑运算torch.argmax()torch.max()torch.sum()torch.tanh()torch.pow() 功能性操作 torch.nn.functionalF.normalize()F.elu()F.relu()F.softmax() 张量计算torch.zeros()tor…

Yolov8有效涨点:YOLOv8-AM,添加多种注意力模块提高检测精度,含代码,超详细

前言 2023 年&#xff0c;Ultralytics 推出了最新版本的 YOLO 模型。注意力机制是提高模型性能最热门的方法之一。 本次介绍的是YOLOv8-AM&#xff0c;它将注意力机制融入到原始的YOLOv8架构中。具体来说&#xff0c;我们分别采用四个注意力模块&#xff1a;卷积块注意力模块…

《猎冰》难以狂飙,2024年开年剧集没有爆款

从2022年开始&#xff0c;剧集开年一爆成为惯例。 这很大程度取决于当时的环境。由于疫情原因&#xff0c;更多用户选择在家娱乐&#xff0c;剧集成为了家人、朋友相处间最好的娱乐消费品。 优秀的剧集&#xff0c;在多人共同的认可下得以快速传播。 也因为此&#xff0c;20…

幻兽帕鲁服务器多少钱?有买过的吗?

幻兽帕鲁服务器多少钱&#xff1f;太卷了&#xff0c;降价到24元1个月&#xff0c;阿里云4核16G10M游戏服务器26元1个月、149元半年&#xff0c;腾讯云4核16G游戏服务器32元、312元一年&#xff0c;华为云26元&#xff0c;京东云主机也是26元起。云服务器吧yunfuwuqiba.com给大…