深度学习—神经网络基础原理及循环神经网络

news2024/12/28 20:57:34

前向传播(Forward)

为什么要有激活函数

这里用两层来代表多层的神经网络举例:第一层的输出是第二层的输入,其中MM的W*X矩阵乘法,ADD是向量加法即加上偏置,如果每一层都只有线性变换,那么最终无论多少层都可以化简成一层(见上图左边的公式),这样多层数就没有意义了,所以要在每一层都加上非线性函数即激活函数,才能保证每一层都有它独特的作用。

链式法则 

反向传播(Backward) 

  

当x是上一层的输出时也需要算,它这时就相当于是上一层的输出z一样。

损失L对z的偏导是从后面反向传播时传过来的,z对x的偏导是前面做前向传播时计算f这个函数时算出来的局部梯度。

下面举个具体例子:

比如在前向传播中,函数f=x*w,那么z对x的偏导为w,z对w的偏导为x,当传入的x=2,w=3时,输出z=x*w=6。

然后在反向传播中,我们拿到损失Loss,计算出L对z的偏导为5,接着计算出L对x的偏导为5*w即5*3=15,同理L对w的偏导为10,然后L对x的偏导的结果再继续往上一层传,这样每一层都通过对w的偏导就可以由此做权重w的更新了。

上面是前向和反向的整体流程,计算出loss对w的偏导就可以用梯度下降算法对w进行更新了。

上面是梯度下降算法的公式推导。

上面这个是随机梯度下降算法的公式。 

代码演示:

 

循环神经网络(RNN)

一般神经网络不能处理具有序列关系的数据,比如给一张图片用卷积神经网络然后输出该图片的类别,这个输出只跟该输入的图片有关,和之前输入了什么图片无关,这种就是没有序列关系的数据。而比如像自然语言,字词、语句之间存在明显的前后关系,这时就要用循环神经网络处理了。

RNN Cell就是一个线性变换层,上图右边的四个RNN Cell都是指同一个RNN Cell,其中h又叫hidden, 每次输入都是x_{i}与上一次的输出h_{i-1}一起放到RNN Cell里得出h_{i},然后到下一个序列的数据x_{i+1}又会与h_{i}一起得出h_{i+1},就这样循环往复,这样每次的输入都结合了上个序列的结果,体现了数据间的序列关系。

比如上图中有三层,第一层的RNN Cell接收的是原始的数据x和上个序列的输出h,第二层的RNN Cell接收的是上一层该序列的输出h和上个序列的输出h,第三层与第二层同理,以此类推。

实践举例

这里要求学习hello->ohlol的规律,其中Seq是序列的缩写。

具体实现代码 

import torch

input_size = 4
hidden_size = 3
batch_size = 1

#构建输入输出字典
idx2char_1 = ['e', 'h', 'l', 'o']
idx2char_2 = ['h', 'l', 'o']
x_data = [1, 0, 2, 2, 3]
y_data = [2, 0, 1, 2, 1]
# y_data = [3, 1, 2, 2, 3]
one_hot_lookup = [[1, 0, 0, 0],
                  [0, 1, 0, 0],
                  [0, 0, 1, 0],
                  [0, 0, 0, 1]]
#构造独热向量,此时向量维度为(SeqLen*InputSize)
x_one_hot = [one_hot_lookup[x] for x in x_data]
#view(-1……)保留原始SeqLen,并添加batch_size,input_size两个维度
inputs = torch.Tensor(x_one_hot).view(-1, batch_size, input_size)
#将labels转换为(SeqLen*1)的维度
labels = torch.LongTensor(y_data).view(-1, 1)

class Model(torch.nn.Module):
    def __init__(self, input_size, hidden_size, batch_size):
        super(Model, self).__init__()
        self.batch_size = batch_size
        self.input_size = input_size
        self.hidden_size = hidden_size

        self.rnncell = torch.nn.RNNCell(input_size = self.input_size,
                                        hidden_size = self.hidden_size)

    def forward(self, input, hidden):
        # RNNCell input = (batchsize*inputsize)
        # RNNCell hidden = (batchsize*hiddensize)
        hidden = self.rnncell(input, hidden)
        return hidden

    #初始化零向量作为h0,只有此处用到batch_size
    def init_hidden(self):
        return torch.zeros(self.batch_size, self.hidden_size)

net = Model(input_size, hidden_size, batch_size)

criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(net.parameters(), lr=0.1)

for epoch in range(15):
    #损失及梯度置0,创建前置条件h0
    loss = 0
    optimizer.zero_grad()
    hidden = net.init_hidden()

    print("Predicted string: ",end="")
    #inputs=(seqLen*batchsize*input_size) labels = (seqLen*1)
    #input是按序列取的inputs元素(batchsize*inputsize)
    #label是按序列去的labels元素(1)
    for input, label in zip(inputs, labels):
        hidden = net(input, hidden)
        #序列的每一项损失都需要累加
        loss += criterion(hidden, label)
        #多分类取最大
        _, idx = hidden.max(dim=1)
        print(idx2char_2[idx.item()], end='')

    loss.backward()
    optimizer.step()

    print(", Epoch [%d/15] loss = %.4f" % (epoch+1, loss.item()))

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

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

相关文章

RabbitMQ入门(详细)

RabbitMQ入门(详细) 初始消息队列消息队列初识为什么要使用消息队列?消息队列的特性 RabbitMQ介绍特点核心概念 Linux(CentOs7) 下安装:安装前配置:Erlang下载安装RabbitMQ下载安装linux下安装r…

泰安柒柒:国外问卷调查都有哪些题?

提到问卷调查我们并不陌生,它经常被用作调查市场、商品意见等多种调查中。不过,提到国外问卷调查,大家就比较陌生了。简单来说就是国外的一些企业或机构为了改进自己的商品或服务,会列出一些问题来让大众回答,并用付费…

配置 Ubuntu 的网络

一、三种联网的模式 1. 桥接 VMnet0------> 主机和 Ubuntu 都有一个 ip 地址 2. NAT 模式 VMnet8-------->Ubuntu 和主机是同一个 ip 地址 3. 主机模式 VMnet1-------> 只能和主机进行通信 二、网络配置 1. 虚拟机----->设置 2. 确保网络适配器是桥接模式或…

网络基础学习:osi网络七层模型

osi网络七层模型 什么是OSI,什么是ISO?为什么ISO要提出OSI网络七层模型?OSI七层的划分以及具体内容第七层 应用层第六层 表示层第五层 会话层第四层 传输层第三层 网络层第二层 数据链路层第一层 物理层 每一层与设备的对应关系 什么是OSI,什…

央国企专场培训:太极信创研习院第33期ITAIP信创精华班培训在常州成功举办

4月25-27日,由太极计算机股份有限公司(太极信创研习院)联合中国中车集团有限公司(科技质量与信息化部)、中车信息技术有限公司(中车学习培训发展中心)共同举办的“信息技术应用创新专业人员&…

Java并发编程实践学习笔记(三)——共享对象之可见性

目录 1 过期数据 2 非原子的64位操作 3 锁和可见性 4 Volatile变量(Volatile Variables) 在单线程环境中,如果向某个变量写入值,在没有其他写入操作的情况下读取这个变量,那么总能得到相同的值。然而&…

java状态机实现订单状态转移

一、状态机 状态机是状态模式的一种应用,相当于上下文角色的一个升级版。在工作流或游戏等各种系统中有大量使用,如各种工作流引擎,它几乎是状态机的子集和实现,封装状态的变化规则。状态机可以帮助开发者简化状态控制的开发过程…

APP界面设计都有哪些好用的软件推荐

基于APP界面的不同功能,所选择的APP界面设计软件也会有所不同。然而,并不是说所有的APP界面设计软件都非常精通,熟练地学习几个常用的APP界面设计软件。以下10个APP界面设计软件将为您的团队提供绘制APP界面所需的必要功能。 1.即时设计 即…

OpenCV-Python实战(7) —— OpenCV 实现抖音视频倒放效果

1. 需求分析 参考:十行Python代码制作一个视频倒放神器,由于最近在学习 OpenCV ,因此试着使用 OpenCV 进行实现,学以致用(胡乱折腾)。 需要视频倒放,因此需要读取视频cv.VideoCapture&#xff1…

一键docker搭建mysql主从环境

一键docker搭建mysql主从环境 初衷准备阶段操作阶段注意事项 初衷 一开始为了玩一下shared-jdbc,要搭Mysql主从环境,这玩意虽然搭好,之后使用要是网络问题,或者sql执行出错,还得重新调Binlog位置,麻烦得很…

接口自动化测试之HTTP协议详解(敢称全网最全)

目录 协议 OSI模型 HTTP URL 报文 响应报文 HTTP扩展 协议 简单理解,计算机与计算机之间的通讯语言就叫做协议,不同的计算机之间只有使用相同的协议才能通信。所以网络协议就是为计算机网络中进行数据交换而建立的规则,标准或约定的集…

Node.js 使用RSA加密/解密

在本文中,我们将探讨如何在 Node.js 中使用 RSA 加密和解密。RSA 是一种非对称加密算法,它可以确保数据的安全传输。使用 RSA,我们可以在不直接传输密钥的情况下安全地加密和解密数据。 一、安装依赖 我们将使用 node-rsa 库来执行加密和解密…

2023 年Java经典面试题,基础篇01(持续更新)

本篇文章主要讲的是 2023 年Java最新面试题,持续更重中 基础概念与常识 原文地址:https://github.com/Snailclimb/JavaGuide Java 语言有哪些特点? 简单易学;面向对象(封装,继承,多态)&#…

《LeetCode》—— LeetCode刷题日记

本期,我给大家讲述的是关于 n数之和这类题目的讲解,我会给大家讲解两数之和,三数之和和四数之和这三道题目。 目录 (一)两数之和 (二)三数之和 (三)四数之和 &#xf…

NodeJs 最近各版本特性汇总

(预测未来最好的方法就是把它创造出来——尼葛洛庞帝) NodeJs 官方链接 github链接 V8链接 Node.js发布于2009年5月,由Ryan Dahl开发,是一个基于Chrome V8引擎的JavaScript运行环境,使用了一个事件驱动、非阻塞式I/O模…

对象应用:C++字符串和vector,对象的new与delete重构

对象应用 C字符串和vector字符串创建方式字符串拼接字符串追加 字符串截断autovector创建方式vector操作 new与delete重构new与delete的工作步骤new与delete重构应用只能生成栈对象只能生成堆对象 C字符串和vector C的字符串是一个对象,存在于std标准库中&#xff0…

Python基础入门(4)—— 什么是偷懒编程法?是类、对象和继承

文章目录 00 | 😃为什么学习类?😃01 | 😄创建类😄02 | 😆创建对象😆03 | 😉访问对象属性和方法😉04 | 😊构造函数😊05 | 😋继承&#…

Shell编程之数组

目录 一、数组的基本概念 二、定义数组的方法 方法一: ​编辑 方法二: 方法三: ​编辑 方法四: 三、 数组的输出,删除和长度统计 1)数组元素的输出 2)数组全部元素输出 3&#xff0…

一种用于提高无线传感器网络寿命的改进LEACH协议(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨‍💻4 Matlab代码 💥1 概述 无线传感器网络具有网络灵活性强、网络规模可变等优点,广泛应用于军事、工业等领域。无线传感器网络的基本网络路由…

Mybatis一级缓存详解

目录 一级缓存 一级缓存的组织 一级缓存的生命周期 一级缓存的工作流程 Cache接口的设计以及CacheKey的定义 一级缓存的性能分析 一级缓存与Spring 事务一级缓存存在的弊端 官方文档分析 Spring通过Mybatis调用数据库的过程 一级缓存 对于会话(Session&am…