“深度学习”学习日记。误差反向传播法--Affine/Softmax层的实现

news2024/11/22 21:01:38

2023.1.17

Affine层:

在神经网络的正向传播中,为了计算加权信号的总和,使用矩阵乘积运算。

比如:

import numpy as np

x = np.arange(6).reshape(2, 3)  # (2,3)
w = np.arange(6).reshape(3, 2)  # (3,2)
b = np.arange(4).reshape(2, 2)  # (2,2)

y = np.dot(x, w) + b  # 要符合线性代数运算规则

print(y)
# [[10 14]
#  [30 43]]

然后y传递到激活函数层转换后在传递给下一层神经网络。

在深度学习中,把正向传播中进行的矩阵乘积运算称为“仿射变换”。称仿射变换的处理实现称为Affine层。

仿射变换:一次线性变换(加权乘积)和一次平移(偏置)

Affine层的计算图:观察正向传播和反向传播,反向传播时,我们要结合线性代数考虑矩阵的形状,求出“dot 节点”的推导式子。

1式: \frac{\partial L}{\partial x} = \frac{\partial L}{\partial Y} \cdot W^{T};

2式:   \frac{\partial L}{\partial W} =x^{T} \cdot \frac{\partial L}{\partial Y} ;

3式:   \frac{\partial L}{\partial Y}

关于加法节点的传播在这篇文章:https://blog.csdn.net/m0_72675651/article/details/128695488

代码实现:

import numpy as np


class Affine:
    def __init__(self, w, b):
        self.w = w
        self.b = b
        self.x = None
        self.dw = None
        self.db = None

    def forward(self, x):
        self.x = x
        out = np.dot(x, self.w) + self.b

        return out

    def backward(self, dout):
        dx = np.dot(dout, self.w.T)
        self.dw = np.dot(self.x.T, dout)
        self.db = np.sum(dout, axis=0)

        return dx


x = np.arange(6).reshape(2, 3)
w = np.arange(6).reshape(3, 2)
b = np.arange(4).reshape(2, 2)
a = Affine(w, b)
y = a.forward(x)
y1 = a.backward(y)
print(y, '\n', y1)

输出结果:

[[10 14]
 [30 43]] 
 [[ 14  62 110]
 [ 43 189 335]]

Softmax层: 

我们都知道soft函数会将输入的值正规化后再输出。回忆一下Softmax函数:y_{k}=\frac{\exp (a_{k})}{\sum_{k=1}^{n}exp(a_{k})}

def softmax(x):
    if x.ndim == 2:
        x = x.T
        x = x - np.max(x, axis=0)
        y = np.exp(x) / np.sum(np.exp(x), axis=0)
        return y.T

    x = x - np.max(x)
    return np.exp(x) / np.sum(np.exp(x))

通过MNIST数据来演示: 

 

输入图像经过Affine层和ReLU层进行转换,因为MNIST数据有10类,输出层设计为Softmax层有10个输出,上层输入经过这里会有正规化过程。

在神经网络中,进行的处理有推理和学习两个阶段,其中推理阶段通常不需要softmax层,比如在上图中MNIST识别中以最后一个Affine层作为结果,其没有正规化,将这样的结果称为“得分”,也就是说,当神经网络的推理只需要一个答案(一个正确解标签)的情况下,我们只对“得分”的最大值感兴趣,所以不需要softmax层;

当我们在学习阶段时,我们需要softmax层,因为我们需要计算损失函数优化神经网络模型,我们就需要监督数据标签t和输出正确解标签y参与计算损失函数(y需要正规化) ;

Softmax-with-loss层: 

接下来实现Softmax层 ,但是这包含到损失函数,所以结合交叉熵误差函数,称为Softmax-with-loss层;交叉熵误差:y=-\sum_{k}^{}t_{k}\log y_{k} 。

(交叉熵误差函数参考这篇文章:https://blog.csdn.net/m0_72675651/article/details/128592167)

我们先用计算图先观察: 

为了简化而细致的展现,我们假设最后一层Affine层只传递给softmax层3个得分;

“exp 节点”:在正向传播时表示y=exp(x),由指数函数的数学解析式可得  \frac{\partial y}{\partial x}=exp\left ( x \right ) ; 

 

我们可以观察到最后传播得到了\left ( y_{1} -t_{1}\right ) 的结果,是softmax层输出结果与监督数据的差分。因此,这里有一个重要的性质,神经网络会把这样的差分传递给前面的层。

假如这里有一个监督标签(0,1,0),而softmax层的输出结果是(0.1,0.1,0.8),显然这是没有正确分类,而他的差分是(0.1,-0.9,0.8),这个大差分会向前面传播的层传播,所以前面的层也会学习到这个“大”内容;假如这里有一个监督标签(0,1,0),而softmax层的输出结果是(0.005,0.99,0.05),显然这是正确分类,而他的差分是(0.005,-0.01,0.05),这个小差分会向前面传播的层传播,所以前面的层也会学习到这个“小”内容;

import numpy as np


def cross_entropy_error(y, t):
    delta = 1e-7
    return -1 * np.sum(t * np.log(y + delta))


def softmax(x):
    if x.ndim == 2:
        x = x.T
        x = x - np.max(x, axis=0)
        y = np.exp(x) / np.sum(np.exp(x), axis=0)
        return y.T

    x = x - np.max(x)
    return np.exp(x) / np.sum(np.exp(x))


class SoftmaxWithLoss:
    def __init__(self):
        self.loss = None
        self.y = None
        self.t = None

    def forward(self, x, t):
        self.t = t
        self.y = softmax(x)
        self.loss = cross_entropy_error(y, t)

        return self.loss

    def backward(self, dout=1):
        batch_size = self.t.shape[0]
        dx = (self.y - self.t) / batch_size

        return dx

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

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

相关文章

LeetCode083_83. 删除排序链表中的重复元素

LeetCode083_83. 删除排序链表中的重复元素 一、描述 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 示例 1: 输入:head [1,1,2] 输出:[1,2]示例 2&#xff1…

虚拟机或Linux安装Nginx及本地指定虚拟机域名

安装必要工具和依赖 yum -y install wget gcc gcc-c pcre pcre-devel zlib zlib-devel openssl openssl-devel -----------------------------------废话开始------------------------------------------------- 上面这句话的意思:以下当废话 yum ---在线安装命令 inst…

82.长短期记忆网络(LSTM)以及代码实现

1. 长短期记忆网络 忘记门:将值朝0减少输入门:决定不是忽略掉输入数据输出门:决定是不是使用隐状态 2. 门 3. 候选记忆单元 4. 记忆单元 5. 隐状态 6. 总结 7. 从零实现的代码 我们首先加载时光机器数据集。 import torch from torch imp…

基于python手撕实现BP 神经网络实现手写数字识别(不调库,附完整版本代码)

本项目使用python实现全连接网络和梯度优化 方向传播并且实现了 手写数字识别项目: 神经网络 model 先介绍个三层的神经网络,如下图所示输入层(input layer)有三个 units( 为补上的 bias,通常设为 1)

安卓影像飞升时刻:vivo X90 Pro+打通HDR任督二脉

在手机产业中,大多数人会有一种刻板印象:一项新技术/功能,苹果发布会上展示意味着已经成熟,具有很高的产品完成度,好用且有效;而安卓厂商在发布会上展示出的一些炫酷技术,往往还需要时间观望&am…

多目标建模算法PLE

1. 概述 在现如今的推荐系统或者搜索中,都存在多个目标,多目标的算法在现如今的系统中已然成为了标配。在多目标的建模过程中,如果不同的学习任务之间较为相关时,多个任务之间可以共享一部分的信息,这样最终能够提升整…

Vue7-el和data的两种写法

1.el的两种写法 1创建Vue实例的时候通过el指定属性 2. 创建Vue实例之后,通过vm.$mount(#demo)进行挂载 console.log(v):此处的v是Vue的实例对象 在往下看__proto__属性,这里是Vue构造类的方法,其中的方法vue实例都可以使用,比如$…

Spring cache整合Redis详解 动态设置失效时间

文章目录1.spring cache简介2.spring cache集成redis3.spring cache与redisTemple统一格式4.SpEL标签5.Cacheable注解实现6.CachePut注解实现7.CacheEvict注解实现8.Caching注解实现9.自定义key生成器KeyGenerator10.自定义前缀CacheKeyPrefix11.多个CacheManager实现不同失效时…

【微信小程序】收藏功能的实现(条件渲染、交互反馈)

🏆今日学习目标:第十九期——收藏功能的实现(条件渲染、交互反馈) 😃创作者:颜颜yan_ ✨个人主页:颜颜yan_的个人主页 ⏰预计时间:35分钟 🎉专栏系列:我的第一个微信小程序 文章目录…

django框架

目录简介MVC与MTV模型MVCMTV创建项目目录生命周期静态文件配置(无用)启动django[启动](https://www.cnblogs.com/xiaoyuanqujing/articles/11902303.html)路由分组无名分组有名分组路由分发反向解析反向解析结合分组名称空间re_path与path自定义转换器视…

vue3项目怎么写路由 + 浅析vue-router4源码

在SPA项目里,路由router基本是前端侧处理的,那么vue3项目中一般会怎么去写router呢,本文就来讲讲vue-router4的一些常用写法,以及和Composition API的结合使用,同时简单讲讲实现原理,让你轻松理解前端route…

【04】FreeRTOS的任务挂起与恢复

目录 1.任务的挂起与恢复的API函数 1.1任务挂起函数介绍 1.2任务恢复函数介绍(任务中恢复) 1.3任务恢复函数介绍(中断中恢复) 2.任务挂起与恢复实验 3.任务挂起和恢复API函数“内部实现”解析 3.1vTaskSuspend() 3.2&#…

Prometheus基础

一、何为Prometheus Prometheus受启发于Google的Brogmon监控系统(相似的Kubernetes是从Google的Brog系统演变而来),从2012年开始由前Google工程师在Soundcloud以开源软件的形式进行研发,并且于2015年早期对外发布早期版本。2016年…

【基础】Netty 的基础概念及使用

Netty基本概念理解阻塞与非阻塞同步与异步BIO 与 NIOReactor 模型Netty 基本概念Netty 的执行流程Netty 的模块组件Netty 工作原理Netty 的基本使用Netty ServerNetty Client参考文章基本概念理解 阻塞与非阻塞 阻塞与非阻塞是进程访问数据时的处理方式,根据数据是…

系分 - 案例分析 - 系统维护与设计模式

个人总结,仅供参考,欢迎加好友一起讨论 文章目录系分 - 案例分析 - 系统维护与设计模式典型例题 1题目描述参考答案典型例题 2题目描述参考答案系分 - 案例分析 - 系统维护与设计模式 典型例题 1 题目描述 某企业两年前自主研发的消防集中控制软件系统…

05-requests添加Cookies与正则表达式

第5讲 requests添加Cookies与正则表达式 整体课程知识点查看 :https://blog.csdn.net/j1451284189/article/details/128713764 本讲总结 request代理使用 request SSL request添加Cookies 数据解析方法简介 数据解析:正则表达式讲解 一、requests 代理 …

【23种设计模式】学习汇总(未完结+思维导图)

获取思维导图翻至底部底部,基本概览博客内容(暂未完全完善,期待你的持续关注) 写作不易,如果您觉得写的不错,欢迎给博主来一波点赞、收藏~让博主更有动力吧! 一.相关内容 在软件工程中&#xf…

关系型数据库RDBMS | 字节青训营笔记

一、经典案例 1、红包雨案例 每年春节,抖音都会有红包雨获得 2、事务 事务(Transaction): 是由一组SQL语句组成的一个程序执行单元(Unit),它需要满足ACID特性 BEGIN; UPDATE account table SET balance balance - 小目标 WHERE name “抖音; UPDATE…

指数加权平均、动量梯度下降法

目录1.指数加权平均(exponentially weighted averages)这里有一年的温度数据。如果想计算温度的趋势,也就是局部平均值(local average),或者说移动平均值(moving average),怎么做?:当天的温度,:…

交换机的基本原理(特别是动态ARP、静态ARP、代理ARP)

第六章:交换机的基本配置 二层交换设备工作在OSI模型的第二层,即数据链路层,它对数据包的转发是建立在MAC(Media Access Control )地址基础之上的。二层交换设备不同的接口发送和接收数据独立,各接口属于不…