LSTM ——作业

习题6-4  推导LSTM网络中参数的梯度, 并分析其避免梯度消失的效果

习题6-3P  编程实现下图LSTM运行过程 

 1. 使用Numpy实现LSTM算子

import numpy as np
# 创建一个numpy数组x,它是一个4x4的矩阵,包含9个元素
x = np.array([[1, 0, 0, 1],[3, 1, 0, 1],[2, 0, 0, 1],[4, 1, 0, 1],[2, 0, 0, 1],[1, 0, 1, 1],[3, -1, 0, 1],[6, 1, 0, 1],[1, 0, 1, 1]])# 创建i_w数组,它是一个权重向量,用于计算输入门
i_w = np.array([0, 100, 0, -10])# 创建o_w数组,它是一个权重向量,用于计算输出门
o_w = np.array([0, 0, 100, -10])# 创建f_w数组,它是一个权重向量,用于计算忘记门
f_w = np.array([0, 100, 0, 10])# 创建c_w数组,它是一个权重向量,用于计算候选细胞状态
c_w = np.array([1, 0, 0, 0])# 定义sigmoid函数,它是一个激活函数,用于将输入映射到[0, 1]范围内
def sigmoid(x):y = 1 / (1 + np.exp(-x))if y >= 0.5:return 1else:return 0# 初始化变量temp为0,它是用来存储临时结果的
temp = 0# 初始化空列表y和c,分别用来存储每个时间步的输出和细胞状态
y = []
c = []
# 对于x中的每个元素i进行循环处理
for i in x:c.append(temp)  # 将当前细胞状态添加到列表c中temp_c = np.sum(np.multiply(i, c_w))  # 计算候选细胞状态,它是通过将输入i与权重向量c_w相乘然后求和得到的temp_i = sigmoid(np.sum(np.multiply(i, i_w)))  # 计算输入门,它是通过将输入i与权重向量i_w相乘然后求和,然后应用sigmoid函数得到的temp_f = sigmoid(np.sum(np.multiply(i, f_w)))  # 计算忘记门,它是通过将输入i与权重向量f_w相乘然后求和,然后应用sigmoid函数得到的temp_o = sigmoid(np.sum(np.multiply(i, o_w)))  # 计算输出门,它是通过将输入i与权重向量o_w相乘然后求和,然后应用sigmoid函数得到的temp = temp_c * temp_i + temp_f * temp  # 更新细胞状态,它是基于候选细胞状态、输入门和忘记门的计算结果得到的y.append(temp_o * temp)  # 计算LSTM的输出,它是基于输出门和新的细胞状态的乘积得到的,并将结果添加到列表y中# 打印细胞状态列表c和输出列表y
print("memory", c)
print("y     ", y)

这段代码参考了同学的代码,在这段代码中,我自己跟着敲了一遍,但是结果不对

经过自己勘察发现是激活函数那块代码写错了

 

 然后此外发现

这一步有错误,没有经过tanh 的激活,于是添加代码

def tanh(x):return np.tanh(x)

并且 修改了一丢丢

temp = tanh(temp_c )* temp_i + temp_f * temp
y.append(temp_o *np.tanh(temp))

结果是这样的

再修改代码

# 打印细胞状态列表c和输出列表y
print("memory", [round(cell) for cell in c])
print("y     ", [round(output) for output in y])

2. 使用nn.LSTMCell实现 

import torch 
import torch.nn as nnx = torch.tensor([[1, 0, 0, 1],[3, 1, 0, 1],[2, 0, 0, 1],[4, 1, 0, 1],[2, 0, 0, 1],[1, 0, 1, 1],[3, -1, 0, 1],[6, 1, 0, 1],[1, 0, 1, 1]], dtype=torch.float)
# 在x的第二个维度上增加一个维度,这通常用于处理批次中的单个样本  
x = x.unsqueeze(1)# 设置输入和隐藏状态的尺寸  
i_size = 4
h_size = 1# 创建一个LSTMCell,这是一个基本的LSTM单元,用于处理时间序列数据  
lstm_cell = nn.LSTMCell(input_size=i_size, hidden_size=h_size, bias=False)# 为LSTM单元设置权重。这里的权重是硬编码的,通常这些权重是从训练过程中学习得到的。  
lstm_cell.weight_ih.data = torch.tensor([[0, 100, 0, 10],[0, 100, 0, -10],[1, 0, 0, 0],[0, 0, 100, -10]]).float()
# 设置隐层到隐层的权重,初始为零  
lstm_cell.weight_hh.data = torch.zeros([4 * h_size, h_size])# 初始化隐层和细胞状态为零张量  
hx = torch.zeros(1, h_size)
cx = torch.zeros(1, h_size)# 用于存储每个时间步的输出  
outputs = []# 在x的每个元素上运行LSTM单元  
for i in range(len(x)):# 使用LSTM单元处理输入和当前状态,返回下一个隐层状态和细胞状态  hx, cx = lstm_cell(x[i], (hx, cx))# 将输出添加到outputs列表中  outputs.append(hx.detach().numpy()[0][0])# 将outputs列表中的每个元素四舍五入到最近的整数,并存储到新的列表中  
outputs_rounded = [round(x) for x in outputs]# 打印四舍五入后的输出列表  
print(outputs_rounded)

结果一致,所以答案正确。  

3. 使用nn.LSTM实现

import torch
import torch.nn as nnx = torch.tensor([[1, 0, 0, 1],[3, 1, 0, 1],[2, 0, 0, 1],[4, 1, 0, 1],[2, 0, 0, 1],[1, 0, 1, 1],[3, -1, 0, 1],[6, 1, 0, 1],[1, 0, 1, 1]], dtype=torch.float)
# 在x的第二个维度上增加一个维度,这通常用于处理批次中的单个样本
x = x.unsqueeze(1)# 设置输入和隐藏状态的尺寸
i_size = 4
h_size = 1# 创建一个LSTMCell,这是一个基本的LSTM单元,用于处理时间序列数据
lstm= nn.LSTM(input_size=i_size, hidden_size=h_size, bias=False)# 为LSTM单元设置权重。这里的权重是硬编码的,通常这些权重是从训练过程中学习得到的。# 设置 LSTM 的权重矩阵
lstm.weight_ih_l0.data = torch.tensor([[0, 100, 0, 10],   [0, 100, 0, -10],  [1, 0, 0, 0],      [0, 0, 100, -10]]).float()
# 设置隐层到隐层的权重,初始为零
lstm.weight_hh_l0.data = torch.zeros([4 * h_size, h_size])
# 初始化隐层和细胞状态为零张量
hx = torch.zeros(1,1, h_size)
cx = torch.zeros(1,1, h_size)
# 前向传播
outputs, (hx, cx) = lstm(x, (hx, cx))
outputs = outputs.squeeze().tolist()
# 将outputs列表中的每个元素四舍五入到最近的整数,并存储到新的列表中
outputs_rounded = [round(x) for x in outputs]
# 打印四舍五入后的输出列表
print(outputs_rounded)

总结:

 1、推导还是那样先把流程中用到的所有式子写出来,然后倒着找相关的往后推导

2、代码看的熬夜患者的,跟着打了一遍,其实第二个第三个很相似,3使用了封装的nn.LSTM来定义和计算LSTM模型的前向传播,而2代码使用nn.LSTMCell来手动计算LSTM的前向传播。

参考链接:

PyTorch - torch.nn.LSTMCell (runebook.dev)

DL Homework 11-CSDN博客

【23-24 秋学期】NNDL 作业11 LSTM-CSDN博客

                                                      

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

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

相关文章

Unity中URP下的菲涅尔效果实现(URP下的法线和视线向量怎么获取)

文章目录 前言一、实现思路二、实现原理我们可以由下图直观的感受到 N 与 L夹角越小,点积越接近(白色)1。越趋近90,点积越接近0(黑色) 三、实现URP下的菲涅尔效果1、我们新建一个Shader,修改为最…

安全密码(字符串)

#include <stdio.h> #include <stdbool.h> #include <string.h> bool is_secure_password(const char* password); int main() {int M;char password[51];// 读取输入中的密码数量 Mscanf("%d", &M);// 处理每个密码for (int i 0; i < M; …

Pytorch:Tensorboard简要学习

目录 一、TensorBoard简介二、TensorBoard的安装与启动Tensorboard的安装Tensorboard的启动 三、TensorBoard的简单使用3.1 SummaryWriter()3.2 add_scalar()和add_scalars()3.3 add_histogram()3.4 模型指标监控 四、总结参考博客 一、TensorBoard简介 TensorBoard 是Google开…

17.Oracle中instr()函数查询字符位置

1、instr()函数的格式 &#xff08;俗称&#xff1a;字符查找函数&#xff09; 格式一&#xff1a;instr( string1, string2 ) // instr(源字符串, 目标字符串) 格式二&#xff1a;instr( string1, string2 [, start_position [, nth_appearance ] ] ) // instr(源字符…

typescript使用解构传参

看下面这个函数 interface Student {id: number;name: string;class: string;sex: string;}function matriculation(student: Student) {//...}我们要调用它,就需要传递一个实现了Student约束的对象进去 interface Student {id: number;name: string;class: string;sex: string…

C语言:将三个数从大到小输出

#include<stdio.h> int main() {int a 0;int b 0;int c 0;printf("请输入abc的值&#xff1a;");scanf_s("%d%d%d", &a, &b, &c);if (b > a){int tmp a;a b;b tmp;}if (c > a){int tmp a;a c;c tmp;}if (b < c){int t…

app分发平台哪个好点?手机app应用内测分发平台支持负载均衡的重要性

随着互联网的快速发展&#xff0c;内测分发平台扮演着越来越重要的角色。而在现代应用程序的开发和运营过程中&#xff0c;负载均衡技术是不可或缺的一部分。内测分发平台支持负载均衡对于提高系统的稳定性、可靠性和性能至关重要。那么什么是负载均衡又有哪些重要性。 图片来源…

在线学习平台,云课堂云教育类网站源码,在线题库+随身携带的刷题神器+视频安装教程

源码介绍 在线题库&#xff1a;由传统的线下学习模式改为在线学习。能够实现学员在线学习、练习、考试 优点&#xff1a;方便、便宜、自我管理、选择性更多 、成人教育 &#xff08;1&#xff09;公考&#xff1a;国考、省考、事业单位… &#xff08;2&#xff09;升学&…

数据结构期末考题之001

算法复杂度就是n&#xff08;0&#xff09;

C++ Qt开发:自定义Dialog对话框组件

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍自定义Dialog组件的常用方法及灵活运用。 在…

【上海大学数字逻辑实验报告】七、中规模元件及综合设计

一、实验目的 掌握中规模时序元件的测试。学会在Quartus II上设计序列发生器。 二、实验原理 74LS161是四位可预置数二进制加计数器&#xff0c;采用16引脚双列直插式封装的中规模集成电路&#xff0c;其外形如下图所示&#xff1a; 其各引脚功能为&#xff1a; 异步复位输…

在做题中学习(33):只出现一次的数字 II

137. 只出现一次的数字 II - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 1.首先想到出现三次的数&#xff0c;它们仨的任意一位都是相同的&#xff08;1/0&#xff09; 2.可以发现出现三次的数的某一位和a某一位在所有情况下%3最后的结果都和a的那一位相同&…

PMP项目管理 - 风险管理

系列文章目录 PMP项目管理 - 质量管理 PMP项目管理 - 采购管理 PMP项目管理 - 资源管理 PMP项目管理 - 风险管理 现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everything is for the future of dream weaving wings, let the dream fly in…

Java技术栈 —— Log4j 2、Logpack、SLF4j日志框架介绍

Log4j 2、Logpack、SLF4j日志框架介绍 Log4j 2、Logpack、SLF4j日志框架&#xff0c;及其区别1.1 Log4j 21.1.1 日志级别1.1.2 日志输出目标位置1.1.3 日志刷新机制1.1.4 结构化打印日志1.1.5 异步打印日志1.1.6 在Cloud云环境汇集日志信息 1.2 LogPack1.3 SLF4j1.4 区别 Log4j…

从数据应用案例出发,探索2024年及未来的数据科学转型

如今&#xff0c;数据科学已经取得了长足的进步&#xff01;回顾数据科学的发展史&#xff0c;19世纪&#xff0c;人们使用基本统计模型收集、存储和处理数据。后来&#xff0c;当计算机进入万千家庭&#xff0c;数字时代正式到来&#xff0c;并由此产生了大量数据。互联网上数…

数据库——关系数据的规范化:范式判断【知识点罗列+例题讲解】

知识点罗列&#xff1a; 各种范式之间的关系 1.第一范式1NF&#xff1a; 如果关系模式R中所有的属性都具有原子性&#xff0c;均是不可再分的&#xff08;一个属性不能再被分解成更小的数据单元&#xff09;&#xff0c;则称R属于第一范式&#xff0c;简称1NF&#xff0c;记作R…

基于urllib库的网页数据爬取

实验名称&#xff1a; 基于urllib库的网页数据爬取 实验目的及要求&#xff1a; 【实验目的】 通过本实验了解和掌握urllib库。 【实验要求】 1. 使用urllib库爬取百度搜索页面。 2. 使用urllib库获取百度搜索的关键字搜索结果&#xff08;关键字任选&#xff09;。 实验原理及…

vite原理

一、依赖预构建 1、为什么需要依赖预构建 CommonJS和UMD兼容性 在开发阶段中&#xff0c;vite的开发服务器将所有的代码视为原生ES模块。因此&#xff0c;vite必须先将作为CommonJS或者UMD发布的依赖项转换为ESM。 这是vite的一个特色&#xff0c;也是为什么会相对于webpack比…

[足式机器人]Part4 南科大高等机器人控制课 Ch08 Rigid Body Dynamics

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;CLEAR_LAB 笔者带更新-运动学 课程主讲教师&#xff1a; Prof. Wei Zhang 南科大高等机器人控制课 Ch08 Rigid Body Dynamics 1. Spatial Vecocity1.1 Spatial vs. Conventional Accel1.2 Plueker Coordinate System and…

C语言学习NO.-操作符(二)二进制相关的操作符,原码、反码、补码是什么,左移右移操作符、按位与,按位或,按位异或,按位取反

一、操作符的分类 操作符的分类 算术操作符&#xff1a; 、- 、* 、/ 、%移位操作符: << >>位操作符: & | ^ 赋值操作符: 、 、 - 、 * 、 / 、% 、<< 、>> 、& 、| 、^单⽬操作符&#xff1a; &#xff01;、、–、&、*、、-、~ 、siz…