RNN-循环神经网络

news2024/11/19 17:22:19

目录

词嵌入层

RNN网络层

RNN 网络原理


这一节我们学习循环神经网络,RNN~~ 

自然语言处理(Nature language Processing, NLP)研究的主要是通过计算机算法来理解自然语言。对于自然语言来说,处理的数据主要就是人类的语言,我们在进行文本数据处理时,需要将文本进行数据值化,然后进行后续的训练工作。

词嵌入层

词嵌入层首先会根据输入的词的数量构建一个词向量矩阵,例如: 我们有 100 个词,每个词希望转换成 128 维度的向量,那么构建的矩阵形状即为: 100*128,输入的每个词都对应了一个该矩阵中的一个向量。在 PyTorch 中,我们可以使用 nn.Embedding 词嵌入层来实现输入词的向量化。

nn.Embedding是用于创建词嵌入层的模块,它允许我们将词汇表中的每个词映射到一个高维向量空间中的向量,从而将离散的词表示转化为连续的向量表示,便于神经网络处理。

  1. 定义词汇表大小和词嵌入维度 
  2. 初始化词嵌入层

  3. 将词索引转换为词向量

nn.Embedding 对象构建时,最主要有两个参数:

  1. num_embeddings 表示词的数量
  2. embedding_dim 表示用多少维的向量来表示每个词
import torch
import torch.nn as nn
import jieba


if __name__ == '__main__':

    text = '北京冬奥的进度条已经过半,不少外国运动员在完成自己的比赛后踏上归途。'

    
    words = jieba.lcut(text)

    # 构建词表
    index_to_word = {}
    word_to_index = {}

    # 分词去重
    unique_words = list(set(words))
    for idx, word in enumerate(unique_words):
        index_to_word[idx] = word
        word_to_index[word] = idx

    # 词嵌入层
    embed = nn.Embedding(num_embeddings=len(index_to_word), embedding_dim=4)

    # 文本转换为词向量表示
    for word in words:
        # 获得词对应的索引
        idx = word_to_index[word]
        # 获得词嵌入向量
        word_vec = embed(torch.tensor(idx))
        print('%3s\t' % word, word_vec)

构建词嵌入层后的结果:

 北京     tensor([[ 0.4808,  0.7438,  1.0369, -2.5594]], grad_fn=<EmbeddingBackward0>)
 冬奥     tensor([[-2.0256, -0.4350,  0.5125, -0.3900]], grad_fn=<EmbeddingBackward0>)
  的     tensor([[ 0.9568, -1.1408,  0.8565,  2.3855]], grad_fn=<EmbeddingBackward0>)
进度条     tensor([[-1.9835, -0.3634,  0.5719,  0.1207]], grad_fn=<EmbeddingBackward0>)
 已经     tensor([[ 0.2160,  0.7646,  1.7570, -0.5448]], grad_fn=<EmbeddingBackward0>)
 过半     tensor([[ 2.9561,  0.7319,  1.4972, -0.9602]], grad_fn=<EmbeddingBackward0>)
  ,     tensor([[ 1.7826, -2.9717, -1.4483,  0.7267]], grad_fn=<EmbeddingBackward0>)
 不少     tensor([[ 0.5369, -0.5746,  0.9269,  0.0755]], grad_fn=<EmbeddingBackward0>)
 外国     tensor([[-1.2649,  0.7756,  1.2347, -0.1739]], grad_fn=<EmbeddingBackward0>)
运动员     tensor([[ 0.2955,  0.0700, -2.1510, -1.5085]], grad_fn=<EmbeddingBackward0>)
  在     tensor([[-0.7699,  2.0542, -0.1287, -1.9955]], grad_fn=<EmbeddingBackward0>)
 完成     tensor([[ 0.9891, -1.4077,  0.6338,  1.6555]], grad_fn=<EmbeddingBackward0>)
 自己     tensor([[-0.0085,  1.5657, -0.2206, -1.2746]], grad_fn=<EmbeddingBackward0>)
  的     tensor([[ 0.9568, -1.1408,  0.8565,  2.3855]], grad_fn=<EmbeddingBackward0>)
 比赛     tensor([[ 0.3898,  1.0648, -0.4216,  0.3976]], grad_fn=<EmbeddingBackward0>)
  后     tensor([[-1.4346, -0.2116, -1.9429,  0.0319]], grad_fn=<EmbeddingBackward0>)
 踏上     tensor([[ 0.6079, -1.0845,  0.2756,  1.9047]], grad_fn=<EmbeddingBackward0>)
 归途     tensor([[ 0.8438, -0.6323, -0.6122, -0.4104]], grad_fn=<EmbeddingBackward0>)
  。     tensor([[-0.4558,  0.7774, -1.6783,  0.0778]], grad_fn=<EmbeddingBackward0>)

我们的词嵌入层是随机初始化的,现在还不能表示出文本的真正含义,当一个词输入进来之后,会使用随机产生的向量来表示该词,我们将该词向量参与到下游任务的计算,经过下游任务计算之后,会和目标结果进行对比产生损失,通过反向传播更新所有的网络参数,这里的参数就包括了 nn.Embedding 中的词向量表示。

RNN网络层

我们的文本数据是具有序列特性的,上面的词嵌入层将文本数据映射为数值向量,进而能够送入到网络进行计算,比如‘我爱你’是有顺序的,如果颠倒了顺序,那么可能就会表达不同的意思。

为了能够表示出数据的序列关系我们需要使用循环神经网络对数据进行建模,RNN 是一个具有记忆功能的网络,它作用于处理带有序列特点的样本数据。

RNN 网络原理

RNN的计算过程:

h 表示隐藏状态, 每一次的输入都会有包含两个值: 上一个时间步的隐藏状态、当前状态的输入值,最后输出当前时间步的隐藏状态。 

上面的神经元实际上只有一个神经元,只是时间不同的三个状态,"我爱你" 三个字是重复输入到同一个神经元中。

如果我们使用文本生成,输入 "我爱" 这两个字,来预测出 "你",我们首先初始化出第一个隐藏状态,一般都是全0的一个向量,然后将 "我" 进行词嵌入,转换为向量的表示形式,送入到第一个时间步,然后输出隐藏状态 h1,然后将 h1 和 "爱" 输入到第二个时间步,得到隐藏状态 h2, 将 h2 送入到全连接网络,得到 "你" 的预测概率。

循环网络网络可以有多个神经元,多少个神经元就相当于是输出多少维度的词。

每个神经元内部还是使用像以往神经网络的激活函数和w、b权重。

RNN 层输入的数据为三个维度: (seq_len, batch_size,input_size)

seq_len是一次处理的句子中有几个词,batch_size是几个句子;

import torch
import torch.nn as nn

def func():

    # 输入数据维度 128, 输出维度 256
    rnn = nn.RNN(input_size=128, hidden_size=256)

    inputs = torch.randn(1, 32, 128)
    hn = torch.zeros(1, 32, 256)  # 初始隐藏层为0

    output, hn = rnn(inputs, hn)
    print(output.shape)
    print(hn.shape)

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

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

相关文章

安卓绕过限制直接使用Android/data无需授权,支持安卓14(部分)

大家都知道&#xff0c;安卓每次更新都会给权限划分的更细、收的更紧。   早在安卓11的时候还可以直接通过授权Android/data来实现操作其他软件的目录&#xff0c;没有之前安卓11授权的图了&#xff0c;反正都长一个样&#xff0c;就直接贴新图了。   后面到了安卓12~13的…

基于语音识别的智能电子病历(三)之 M*Modal

讨论“基于语音识别的智能电子病历”&#xff0c;就绕不开 Nuance 和 M*Modal。这2个公司长时间的占据第一和第二的位置。下面介绍一下M*Modal。 这是2019年的一个新闻“专业医疗软件提供商3M公司为自己购买了一份圣诞礼物&#xff0c;即M*Modal IP LLC的医疗技术业务&#xf…

Github上传时报错The file path is empty的解决办法

问题截图 文件夹明明不是空的&#xff0c;却怎么都上传不上去。 解决方案&#xff1a; 打开隐藏文件的开关&#xff0c;删除原作者的.git文件 如图所示&#xff1a; 上传成功&#xff01;

溪谷联运SDK功能全面解析

近期&#xff0c;备受用户关注的手游联运10.0.0版本上线了&#xff0c;不少用户也选择了版本更新&#xff0c;其中也再次迎来了SDK的更新。溪谷软件和大家一起盘点一下溪谷SDK的功能都有哪些吧。 一、溪谷SDK具有完整的运营功能和高度扩展性 1.登录&#xff1a;登录是SDK最基础…

洗地机哪个牌子好?全面评测多款口碑洗地机

洗地机的出现&#xff0c;让人们摆脱了每天打扫卫生的繁琐&#xff0c;因为它只需轻轻一推&#xff0c;就能把扫地、拖地、擦地的活全做了&#xff0c;干垃圾湿垃圾统统都能一次清理干净&#xff0c;操作简单&#xff0c;更轻松。本文主要分享一些挑选洗地机的技巧&#xff0c;…

创建vue工程、Vue项目的目录结构、Vue项目-启动、API风格

环境准备 介绍&#xff1a;create-vue是Vue官方提供的最新的脚手架工具&#xff0c;用于快速生成一个工程化的Vue项目create-vue提供如下功能&#xff1a; 统一的目录结构 本地调试 热部署 单元测试 集成打包依赖环境&#xff1a;NodeJS 安装NodeJS 一、 创建vue工程 npm 类…

物体检测算法-R-CNN,SSD,YOLO

物体检测算法-R-CNN&#xff0c;SSD&#xff0c;YOLO 1 R-CNN2 SSD3 Yolo总结 1 R-CNN R-CNN&#xff08;Region-based Convolutional Neural Network&#xff09;是一种基于区域的卷积神经网络&#xff0c;是第一个成功将深度学习应用到目标检测上的算法。它主要由三个步骤组…

2024最新 Jenkins + Docker 实战教程(四) - 编写自己的Springboot项目实现自动化部署

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

v-md-editor和SSE实现ChatGPT的打字机式输出

概述 不论是GPT还是文心一言&#xff0c;在回答的时候类似于打字机式的将答案呈现给我们&#xff0c;这样的交互一方面比较友好&#xff0c;另一方面&#xff0c;当答案比较多、生成比较慢的时候也能争取一些答案的生成时间。本文后端使用express和stream&#xff0c;使用SSE将…

一文读懂Linux

前言 为了便于理解&#xff0c;本文从常用操作和概念开始讲起。虽然已经尽量做到简化&#xff0c;但是涉及到的内容还是有点多。在面试中&#xff0c;Linux 知识点相对于网络和操作系统等知识点而言不是那么重要&#xff0c;只需要重点掌握一些原理和命令即可。为了方便大家准…

【BSP开发经验】用户态栈回溯技术

前言 在内核中有一个非常好用的函数dump_stack, 该函数在我们调试内核的过程中可以打印出函数调用关系&#xff0c;该函数可以帮助我们进行内核调试&#xff0c;以及让我们了解内核的调用关系。同时当内核发生崩溃的时候就会自己将自己的调用栈输出到串口。 栈回溯非常有利于我…

Java基础(三)- 多线程、网络通信、单元测试、反射、注解、动态代理

多线程基础 线程&#xff1a;一个程序内部的一条执行流程&#xff0c;只有一条执行流程就是单线程 java.lang.Thread代表线程 主线程退出&#xff0c;子线程存在&#xff0c;进程不会退出 可以使用jconsole查看 创建线程 有多个方法可以创建线程 继承Thread类 优点&#x…

金丝雀发布(灰度发布)介绍 及 声明式管理方法简介

目录 一 应用发布策略 1&#xff0c;滚动发布&#xff08;k8s默认&#xff09; 2&#xff0c;蓝绿发布 3&#xff0c;金丝雀发布 二 金丝雀发布&#xff08;Canary Release&#xff09; &#xff08;灰度发布&#xff09; 1&#xff0c;金丝雀发布图解 2&#xff0…

LeetCode700二叉搜索树中的搜索

题目描述 给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和一个整数值 val。你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在&#xff0c;则返回 null 。 解析 最基本的二叉搜索树的应用&#xff0c;递归或者while循环都可以…

PostgreSQL 连接和管理问题解决方案

在使用PostgreSQL数据库时&#xff0c;可能会遇到一些连接和管理方面的问题。本文将详细介绍如何解决“Peer authentication failed”和“password authentication failed”错误&#xff0c;并提供卸载PostgreSQL的方法。 问题一&#xff1a;Peer Authentication Failed Peer …

2024最新彩虹聚合DNS管理系统源码v1.3 全开源

简介&#xff1a; 2024最新彩虹聚合DNS管理系统源码v1.3 全开源 聚合DNS管理系统可以实现在一个网站内管理多个平台的域名解析&#xff0c;目前已支持的域名平台有&#xff1a;阿里云、腾讯云、华为云、西部数码、DNSLA、CloudFlare。 本系统支持多用户&#xff0c;每个用户可…

创建一个python的Django项目文件

创建一个python的Django项目文件(内含conda) 文章目录 创建一个python的Django项目文件(内含conda)前言一、conda环境的下载二、配置conda的环境变量三、激活管理环境四、下载Django五、创建Django项目文件六、启动Django文件七、用pycharm直接创建Django文件 前言 大家好,今天…

WEB转Flutter基础学习笔记(内含vue和flutter对比)

一、Widget简要概括 如果说Vue的UI是template包裹的一个个组件 那么Flutter的UI就是baseBuild中return出来的嵌套罗列的widget StatelessWidget 用于不需要维护状态的场景&#xff0c;它通常在build方法中通过嵌套其他 widget 来构建UI&#xff0c;在构建过程中会递归的构建其…

Linux: network: send 失败的时候要不要close socket?

最近遇到一个例子&#xff0c;说有zerowindow出现&#xff1b;出现的原因是接收方的CPU被其他程序吃光&#xff0c;导致socket的read函数处理非常慢。说明接收端的接收缓存不够用。发送端自然而然的要停止发送。 但是如果在接收方的recv buff&#xff0c;以及发送方的send buf…

【深度学习】YOLOv8训练,交通灯目标检测

文章目录 一、数据处理二、环境三、训练 一、数据处理 import traceback import xml.etree.ElementTree as ET import os import shutil import random import cv2 import numpy as np from tqdm import tqdmdef convert_annotation_to_list(xml_filepath, size_width, size_he…