PyTorch深度学习(六)【循环神经网络-基础】

news2024/11/23 21:23:07

RNN Cell

h0和x1生成h1,把h1作为输出送到下一次的RNN Cell里面。(h1=linear(h0,x1))

RNN计算过程:

输入先做线性变换,循环神经网络常用的激活函数是tanh(±1区间)。

构造RNN Cell:

代码:

import torchbatch_size = 1seq_len = 3input_size = 4hidden_size = 2# Construction of RNNCellcell = torch.nn.RNNCell(input_size=input_size, hidden_size=hidden_size)# Wrapping the sequence into:(seqLen,batchSize,InputSize)dataset = torch.randn(seq_len, batch_size, input_size)  # (3,1,4)    ;  序列数据# Initializing the hidden to zerohidden = torch.zeros(batch_size, hidden_size)  # (1,2)  ;隐层,全0for idx, input in enumerate(dataset):    print('=' * 20, idx, '=' * 20)  #分割线,20个=号    print('Input size:', input.shape)  # (batch_size, input_size)    # 按序列依次输入到cell中,seq_len=3,故循环3次    hidden = cell(input, hidden)  # 返回的hidden是下一次的输入之一,循环使用同一个cell;这一次的输入+上一次的隐层    #隐层维度是batch_size×hidden_size,就是“torch.Size([1,2])”    print('output size:', hidden.shape)  # (batch_size, hidden_size)    print(hidden)

RNN本质是一个线性层。

用RNN首先要把维度搞清楚,数据集的维度多了序列这样一个维度。

每一层都有对应输出。同样颜色的RNN Cell都是一个线性层,也就是说一共只有3个线性层。

代码:

import torchbatch_size = 1    #参数构造seq_len = 3input_size = 4hidden_size = 2num_layers = 1  # RNN层数# Construction of RNNrnn = torch.nn.RNN(input_size=input_size, hidden_size=hidden_size, num_layers=num_layers)# Wrapping the sequence into:(seqLen,batchSize,InputSize)inputs = torch.randn(seq_len, batch_size, input_size)  # (3,1,4)# Initializing the hidden to zerohidden = torch.zeros(num_layers, batch_size, hidden_size)  # (1,1,2),隐层维数output, hidden = rnn(inputs, hidden)  # RNN内部包含了循环,故这里只需把整个序列输入即可print('Output size:', output.shape)  # (seq_len, batch_size, hidden_size)print('Output:', output)print('Hidden size:', hidden.shape)  # (num_layers, batch_size, hidden_size)print('Hidden:', hidden)

预测字符串(RNN Cell):

import torch# 1、确定参数input_size = 4hidden_size = 4batch_size = 1# 2、准备数据index2char = ['e', 'h', 'l', 'o']  #字典x_data = [1, 0, 2, 2, 3]  #用字典中的索引(数字)表示来表示helloy_data = [3, 1, 2, 3, 2]  #标签:ohlolone_hot_lookup = [[1, 0, 0, 0],  # 用来将x_data转换为one-hot向量的参照表                  [0, 1, 0, 0],                  [0, 0, 1, 0],                  [0, 0, 0, 1]]x_one_hot = [one_hot_lookup[x] for x in x_data]  #将x_data转换为one-hot向量inputs = torch.Tensor(x_one_hot).view(-1, batch_size, input_size)  #(𝒔𝒆𝒒𝑳𝒆𝒏,𝒃𝒂𝒕𝒄𝒉𝑺𝒊𝒛𝒆,𝒊𝒏𝒑𝒖𝒕𝑺𝒊𝒛𝒆)labels = torch.LongTensor(y_data).view(-1, 1)  # (seqLen*batchSize,𝟏).计算交叉熵损失时标签不需要我们进行one-hot编码,其内部会自动进行处理# 3、构建模型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):        hidden = self.rnncell(input, hidden)        return hidden    def init_hidden(self):  #生成初始化隐藏层,需要batch_size。        return torch.zeros(self.batch_size, self.hidden_size)net = Model(input_size, hidden_size, batch_size)# 4、损失和优化器criterion = torch.nn.CrossEntropyLoss()optimizer = torch.optim.Adam(net.parameters(), lr=0.1)  # Adam优化器# 5、训练for epoch in range(15):    loss = 0    optimizer.zero_grad()  #梯度清零    hidden = net.init_hidden()  # 初始化隐藏层    print('Predicted string:', end='')    for input, label in zip(inputs, labels):  #每次输入一个字符,即按序列次序进行循环。(input=seq×b×inputsize)        hidden = net(input, hidden)        loss += criterion(hidden, label)  # 计算损失,不用item(),因为后面还要反向传播        _, idx = hidden.max(dim=1)  # 选取最大值的索引        print(index2char[idx.item()], end='')  # 打印预测的字符    loss.backward()   # 反向传播    optimizer.step()  # 更新参数    print(', Epoch [%d/15] loss: %.4f' % (epoch + 1, loss.item()))

预测字符串(RNN)

import torch# 1、确定参数seq_len = 5input_size = 4hidden_size = 4batch_size = 1# 2、准备数据index2char = ['e', 'h', 'l', 'o']  #字典。将来可以根据索引把字母拿出来x_data = [1, 0, 2, 2, 3]  #用字典中的索引(数字)表示来表示helloy_data = [3, 1, 2, 3, 2]  #标签:ohlolone_hot_lookup = [[1, 0, 0, 0],  # 用来将x_data转换为one-hot向量的参照表                  [0, 1, 0, 0],  # 独热向量                  [0, 0, 1, 0],                  [0, 0, 0, 1]]x_one_hot = [one_hot_lookup[x] for x in x_data]  #将x_data转换为one-hot向量inputs = torch.Tensor(x_one_hot).view(seq_len, batch_size,                                      input_size)  #(𝒔𝒆𝒒𝑳𝒆𝒏,𝒃𝒂𝒕𝒄𝒉𝑺𝒊𝒛𝒆,𝒊𝒏𝒑𝒖𝒕𝑺𝒊𝒛𝒆)labels = torch.LongTensor(y_data)# 3、构建模型class Model(torch.nn.Module):    def __init__(self, input_size, hidden_size, batch_size, num_layers=1):        super(Model, self).__init__()        self.num_layers = num_layers   # 1        self.batch_size = batch_size   # 1        self.input_size = input_size   # 4        self.hidden_size = hidden_size # 4        self.rnn = torch.nn.RNN(input_size=self.input_size, hidden_size=self.hidden_size, num_layers=num_layers)    def forward(self, input):        hidden = torch.zeros(self.num_layers, self.batch_size, self.hidden_size)        out, _ = self.rnn(input, hidden)  # out: tensor of shape (seq_len, batch, hidden_size)        return out.view(-1, self.hidden_size)  # 将输出的三维张量转换为二维张量,(𝒔𝒆𝒒𝑳𝒆𝒏×𝒃𝒂𝒕𝒄𝒉𝑺𝒊𝒛𝒆,𝒉𝒊𝒅𝒅𝒆𝒏𝑺𝒊𝒛𝒆)    def init_hidden(self):  #初始化隐藏层,需要batch_size        return torch.zeros(self.batch_size, self.hidden_size)net = Model(input_size, hidden_size, batch_size)# 4、损失和优化器criterion = torch.nn.CrossEntropyLoss()optimizer = torch.optim.Adam(net.parameters(), lr=0.05)  # Adam优化器# 5、训练步骤for epoch in range(15):    optimizer.zero_grad()    outputs = net(inputs)    loss = criterion(outputs, labels)    loss.backward()    optimizer.step()    _, idx = outputs.max(dim=1)    idx = idx.data.numpy()    print('Predicted string: ', ''.join([index2char[x] for x in idx]), end='')    print(', Epoch [%d/15] loss: %.4f' % (epoch + 1, loss.item()))

使用embedding and linear layer:

import torch# 1、确定参数num_class = 4input_size = 4hidden_size = 8embedding_size = 10num_layers = 2batch_size = 1seq_len = 5# 2、准备数据index2char = ['e', 'h', 'l', 'o']  #字典x_data = [[1, 0, 2, 2, 3]]  # (batch_size, seq_len) 用字典中的索引(数字)表示来表示helloy_data = [3, 1, 2, 3, 2]  #  (batch_size * seq_len) 标签:ohlolinputs = torch.LongTensor(x_data)  # (batch_size, seq_len)labels = torch.LongTensor(y_data)  # (batch_size * seq_len)# 3、构建模型class Model(torch.nn.Module):    def __init__(self):        super(Model, self).__init__()        self.emb = torch.nn.Embedding(num_class, embedding_size)        self.rnn = torch.nn.RNN(input_size=embedding_size, hidden_size=hidden_size, num_layers=num_layers,                                batch_first=True)        self.fc = torch.nn.Linear(hidden_size, num_class)    def forward(self, x):        hidden = torch.zeros(num_layers, x.size(0), hidden_size)  # (num_layers, batch_size, hidden_size)        x = self.emb(x)  # 返回(batch_size, seq_len, embedding_size)        x, _ = self.rnn(x, hidden)  # 返回(batch_size, seq_len, hidden_size)        x = self.fc(x)  # 返回(batch_size, seq_len, num_class)        return x.view(-1, num_class)  # (batch_size * seq_len, num_class)net = Model()# 4、损失和优化器criterion = torch.nn.CrossEntropyLoss()optimizer = torch.optim.Adam(net.parameters(), lr=0.05)  # Adam优化器# 5、训练for epoch in range(15):    optimizer.zero_grad()    outputs = net(inputs)    loss = criterion(outputs, labels)    loss.backward()    optimizer.step()    _, idx = outputs.max(dim=1)    idx = idx.data.numpy()    print('Predicted string: ', ''.join([index2char[x] for x in idx]), end='')    print(', Epoch [%d/15] loss: %.4f' % (epoch + 1, loss.item()))

番外:LSTM

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

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

相关文章

亿纬锦能项目总结

项目名称:亿纬锦能 项目链接:https://www.evebattery.com 项目概况: 此项目用到了 wow.js/slick.js/swiper-bundle.min.js/animate.js/appear.js/fullpage.js以及 slick.css/animate.css/fullpage.css/swiper-bundle.min.css/viewer.css 本项目是一种…

【php经典算法】冒泡排序,冒泡排序原理,冒泡排序执行逻辑,执行过程,执行结果 代码

冒泡排序原理 每次比较两个相邻的元素,将较大的元素交换至右端 冒泡排序执行过程输出效果 冒泡排序实现思路 每次冒泡排序操作都会将相邻的两个元素进行比较,看是否满足大小关系要求,如果不满足,就交换这两个相邻元素的次序&…

海外问卷调查是真实的吗?应该如何参与?

大家好,我是橙河网络,这篇文章介绍一下海外问卷调查是真实的吗,应该怎么参与? 海外问卷调查是真实存在的一种商业行为,很多跨国的公司、政府、大学或研究机构会用这种方式来收集来自世界各地的人们对于某个产品、政策…

【Vue】如何搭建SPA项目--详细教程

🎬 艳艳耶✌️:个人主页 🔥 个人专栏 :《Spring与Mybatis集成整合》《springMvc使用》 ⛺️ 生活的理想,为了不断更新自己 ! 目录 1.什么是vue-cli 2.安装 2.1.创建SPA项目 2.3.一问一答模式答案 3.运行SPA项目 3…

python MP4视频转GIF动图

python MP4视频转GIF动图 引言一、转换代码二、PyQt界面编写2.1 效果展示2.2 源码 三、打包成可执行文件(.exe) 一个相当于原视频三倍速的GIF动图 引言 将MP4格式的视频转为GIF动图可以方便地向他人展示动画效果。GIF是网络上广泛使用的图像格式之一,几乎所有的网…

反爬指南:《孤注一掷》诈骗分子窃取用户信息的工具令人吃惊

目录 什么是网络爬虫 爬虫的非法盗取与平台反爬 全流程反爬方案 AI时代的验证码 《孤注一掷》 最近在火热上映中。影片讲述了程序员潘生在境外网络诈骗团队的高薪诱惑下被拐骗到境外“公司”,并在陆秉坤和安俊才的强迫下从事诈骗活动,最终在帮助同被…

You may use special comments to disable some warnings

You may use special comments to disable some warnings 方法1: 找到build目录下的webpack.base.conf.js文件,注释掉 方法2: 找到config目录下的index.js文件,useEslint:false

javabean项目专项练习(1) 文字格斗游戏

main中是这样写的 如下是character类的描述 总结一下(个人) : 这是一题面向对象的编程, 个人编程后感是: 核心就是在于自己会不会取定义一个类, 如果是多个对象(同一个类),能不能捋顺类的方法的关系,个人觉得黑马程序员up主给出来的分析方法特别好用. 步骤: 先把在类里该该…

Python灰帽子编程————网页信息爬取

爬取图片,问题分解: 获取网页内容;从网页内容中提取图片地址;通过图片地址,将图片下载到本地。 1. 相关模块 1.1 requests 模块 获取网页内容。 requests 模块:主要是用来模拟浏览器行为,发…

专业软件测评中心:关于软件性能测试的实用建议

软件性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。性能测试在软件的质量保证中起着重要的作用,它包括的测试内容丰富多样。 一、软件性能测试的实用建议   1、制定清晰的测试目标:明确测试目标…

数据结构与算法——14.栈

目录 1.概述 2.栈的接口设计 3.用链表来实现栈 4.用数组来实现栈 5.用两个栈来实现一个队列 6.用一个队列来实现一个栈 7.总结 1.概述 计算机科学中,stack是一种线性的数据结构,只能在其一端添加数据和移除数据。习惯来说,这一端称之…

主打低功耗物联网国产替代,纵行科技ZT1826芯片以速率和灵敏度出圈

在低功耗物联网领域,国产替代的趋势越演越烈。 9月20日,纵行科技在“IOTE 2023深圳物联网通信技术与应用高峰论坛”发表了“自主原创Advanced M-FSK调制技术助力国产替代和泛在物联”的演讲,并推出了ZT1826芯片,以“更低功耗、更…

【lesson8】操作系统的理解和类比

文章目录 操作系统是什么?为什么要有操作系统?怎么做?学校的例子(理解管理)银行的例子(类比操作系统) 操作系统是什么? 操作系统是一款软件,是为了进行软硬件资源管理的…

CentOS下Redis6.x安装教程

Redis安装教程 文章目录 Redis安装教程一、安装包下载地址二、安装2.1上传服务器解压2.2安装编译所需依赖2.3编译安装 三、启动与停止3.1守护进程启动3.2开机自启动 一、安装包下载地址 https://redis.io/download/ 目前最新的版本是7.0以上的版本,本次使用redis6…

python3+selenium自动化测试介绍详解!

自动化测试是什么? 自动化测试简单来说就是借助工具的方式来辅助手动测试的行为就可以看做是自动化测试。 自动化测试工具有哪些? 现在常用的自动化测试工具包括: QTP:主要用于回归测试和测试同一软件的新版本Robot Framework…

vue2 provide/inject watch 监控inject中值变化

在Vue 2.x中,使用inject注入的值默认情况下是不能被watch直接监控到的,因为inject提供的值不是响应式的。这是Vue 2.x的设计,与Vue 3.x中的provide和inject不同,Vue 3.x中的inject提供的值是响应式的,可以直接被watch监…

【Java 基础篇】Java同步代码块解决数据安全

多线程编程是现代应用程序开发中的常见需求,它可以提高程序的性能和响应能力。然而,多线程编程也带来了一个严重的问题:数据安全。在多线程环境下,多个线程同时访问和修改共享的数据可能导致数据不一致或损坏。为了解决这个问题&a…

心理咨询预约微信小程序开发制作步骤

随着互联网的普及和人们对心理健康的重视,越来越多的心理咨询需求在日常生活中涌现。为了满足这一需求,开发一款心理咨询预约微信小程序势在必行。本文将介绍使用乔拓云网这个第三方制作平台来制作这款小程序的具体步骤。 1. 找一个合适的第三方制作平台…

竞赛选题 基于深度学习的动物识别 - 卷积神经网络 机器视觉 图像识别

文章目录 0 前言1 背景2 算法原理2.1 动物识别方法概况2.2 常用的网络模型2.2.1 B-CNN2.2.2 SSD 3 SSD动物目标检测流程4 实现效果5 部分相关代码5.1 数据预处理5.2 构建卷积神经网络5.3 tensorflow计算图可视化5.4 网络模型训练5.5 对猫狗图像进行2分类 6 最后 0 前言 &#…

ChatGPT追祖寻宗:GPT-3技术报告要点解读

论文地址:https://arxiv.org/abs/2005.14165 往期相关文章: ChatGPT追祖寻宗:GPT-1论文要点解读_五点钟科技的博客-CSDN博客ChatGPT追祖寻宗:GPT-2论文要点解读_五点钟科技的博客-CSDN博客 本文的标题之所以取名技术报告而不是论文…