边写代码边学习之Bidirectional LSTM

1.  什么是Bidirectional  LSTM

双向 LSTM (BiLSTM) 是一种主要用于自然语言处理的循环神经网络。 与标准 LSTM 不同,输入是双向流动的,并且它能够利用双方的信息。 它也是一个强大的工具,可以在序列的两个方向上对单词和短语之间的顺序依赖关系进行建模。

综上所述,BiLSTM 又增加了一层 LSTM,从而反转了信息流的方向。 简而言之,这意味着输入序列在附加的 LSTM 层中向后流动。 然后,我们以多种方式组合两个 LSTM 层的输出,例如平均、求和、乘法或串联。

为了说明这一点,展开的 BiLSTM 如下图所示:

这种类型的架构在现实世界的问题中具有许多优势,尤其是在 NLP 中。 主要原因是输入序列的每个组成部分都包含来自过去和现在的信息。 因此,BiLSTM 可以通过组合两个方向的 LSTM 层来产生更有意义的输出。

例如这句话:

Apple is something that…

可能是关于苹果作为水果或关于苹果公司。 因此,LSTM 不知道“Apple”是什么意思,因为它不知道未来的上下文。

相反,最有可能在这两个句子中:

Apple is something that competitors simply cannot reproduce.

Apple is something that I like to eat.

BiLSTM 对于序列(句子)的每个组成部分(单词)都会有不同的输出。 因此,BiLSTM 模型在一些 NLP 任务中是有益的,例如句子分类(sentence classification)、翻译(translation)和实体识别(entity recognition)。 此外,它还应用于语音识别(speech recognition)、蛋白质结构预测(protein structure prediction)、手写识别(handwritten recognition)和类似领域。

最后,关于 BiLSTM 与 LSTM 相比的缺点,值得一提的是 BiLSTM 是一个速度慢得多的模型,并且需要更多的训练时间。 因此,建议仅在确实有必要时才使用它。

2. 实验代码

2.1. Bidirectional layer 方法介绍

tf.keras.layers.Bidirectional(layer, merge_mode="concat", weights=None, backward_layer=None, **kwargs
)

参数

layer:keras.layers.RNN实例,例如keras.layers.LSTM或keras.layers.GRU。 它也可以是满足以下条件的 keras.layers.Layer 实例:
成为序列处理层(接受 3D+ 输入)。
有一个 go_backwards、return_sequences 和 return_state 属性(与 RNN 类具有相同的语义)。
有一个 input_spec 属性。
通过 get_config() 和 from_config() 实现序列化。 请注意,创建新 RNN 层的推荐方法是编写自定义 RNN 单元并将其与 keras.layers.RNN 一起使用,而不是直接子类化 keras.layers.Layer。 - 当 returns_sequences 为 true 时,无论该层的原始 Zero_output_for_mask 值如何,屏蔽时间步长的输出都将为零。
merge_mode:组合前向和后向 RNN 输出的模式。 {'sum'、'mul'、'concat'、'ave'、None} 之一。 如果没有,输出将不会被组合,它们将作为列表返回。 默认值为“concat”。
back_layer:可选的 keras.layers.RNN 或 keras.layers.Layer 实例,用于处理向后输入处理。 如果未提供backward_layer,则作为层参数传递的层实例将用于自动生成后向层。 请注意,提供的backward_layer层应具有与layer参数相匹配的属性,特别是它应具有相同的stateful、return_states、return_sequences等值。此外,backward_layer和layer应具有不同的go_backwards参数值。 如果不满足这些要求,将会引发 ValueError。

2.2. 搭建一个只有一层LSTM和Dense网络的模型。

def simple_lstm_layer():# Create a dense layer with 10 output neurons and input shape of (None, 20)model = Sequential()model.add(Bidirectional(LSTM(3, return_sequences=True), input_shape=(3, 2)))model.add(Dense(1))  # Output layer with one neuronprint(model.summary())
if __name__ == '__main__':simple_lstm_layer()

输出

Model: "sequential"
_________________________________________________________________Layer (type)                Output Shape              Param #   
=================================================================bidirectional (Bidirectiona  (None, 3, 6)             144       l)                                                              dense (Dense)               (None, 3, 1)              7         =================================================================
Total params: 151
Trainable params: 151
Non-trainable params: 0
_________________________________________________________________
None

2.3. 验证Bidirectional  LSTM里的逻辑

 假设我的输入数据是x = [1,0], 

forward_kernel = [[[2, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0],

              [1, 1, 0, 1, 1, 0, 0, 1, 1 ,0, 0, 0],]]

forward_recurrent_kernel = [[1, 0, 0, 1, 2,1,0,1,2,0,1,0],

                              [1, 1, 0, 0, 2,1,0,1,2,2,0,0],

                              [1, 0, 1, 2, 0,1,0,1,1,0,1,0]]

forward_biase = [3, 1, 0, 1, 1,0,0,1,0,2,0.0,0]

backward_kernel = [[[2, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0],

              [1, 1, 0, 1, 1, 0, 0, 1, 1 ,0, 0, 0],]]

backward_recurrent_kernel = [[1, 0, 0, 1, 2,1,0,1,2,0,1,0],

                              [1, 1, 0, 0, 2,1,0,1,2,2,0,0],

                              [1, 0, 1, 2, 0,1,0,1,1,0,1,0]]

backward_biase = [3, 1, 0, 1, 1,0,0,1,0,2,0.0,0]

通过下面手算,输出: [[[0. 4. 0. 0. 4. 0.]]],  forward/backward  memory_state的结果是[[0. 4. 0.]], forward/backward carry_state 的结果是 [[0. 4. 1.]].  注意无激活函数。

 代码验证上面的结果

def change_weight():# Create a simple Bidirectional LSTM layerlstm_layer = LSTM(units=3, input_shape=(3, 2), activation=None, recurrent_activation=None, return_sequences=True,return_state= True)bi_lstm_layer = Bidirectional(lstm_layer, merge_mode='concat')# Simulate input data (batch size of 1 for demonstration)input_data = np.array([[[1.0, 2], [2, 3], [3, 4]],[[5, 6], [6, 7], [7, 8]],[[9, 10], [10, 11], [11, 12]]])# Pass the input data through the layer to initialize the weights and biasesbi_lstm_layer(input_data)kernel = np.array([[2, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0],[1, 1, 0, 1, 1, 0, 0, 1, 1 ,0, 0, 0],])recurrent_kernel = np.array([[1, 0, 0, 1, 2,1,0,1,2,0,1,0],[1, 1, 0, 0, 2,1,0,1,2,2,0,0],[1, 0, 1, 2, 0,1,0,1,1,0,1,0]])biases = np.array([3, 1, 0, 1, 1,0,0,1,0,2,0.0,0])bi_lstm_layer.set_weights([kernel, recurrent_kernel, biases, kernel, recurrent_kernel, biases])print(bi_lstm_layer.get_weights())test_data = np.array([[[1,0.0]]])output, memory_state, carry_state, backward_memory_state, backward_carry_state  = bi_lstm_layer(test_data)print('output = ',output.numpy())print('forward memory_state = ', memory_state.numpy())print('forward carry_state = ',carry_state.numpy())print('backward memory state = ', backward_memory_state.numpy())print('backward carry state = ',backward_carry_state.numpy())if __name__ == '__main__':change_weight()

输出

[array([[2., 1., 1., 0., 0., 0., 0., 1., 1., 0., 1., 0.],[1., 1., 0., 1., 1., 0., 0., 1., 1., 0., 0., 0.]], dtype=float32), array([[1., 0., 0., 1., 2., 1., 0., 1., 2., 0., 1., 0.],[1., 1., 0., 0., 2., 1., 0., 1., 2., 2., 0., 0.],[1., 0., 1., 2., 0., 1., 0., 1., 1., 0., 1., 0.]], dtype=float32), array([3., 1., 0., 1., 1., 0., 0., 1., 0., 2., 0., 0.], dtype=float32), array([[2., 1., 1., 0., 0., 0., 0., 1., 1., 0., 1., 0.],[1., 1., 0., 1., 1., 0., 0., 1., 1., 0., 0., 0.]], dtype=float32), array([[1., 0., 0., 1., 2., 1., 0., 1., 2., 0., 1., 0.],[1., 1., 0., 0., 2., 1., 0., 1., 2., 2., 0., 0.],[1., 0., 1., 2., 0., 1., 0., 1., 1., 0., 1., 0.]], dtype=float32), array([3., 1., 0., 1., 1., 0., 0., 1., 0., 2., 0., 0.], dtype=float32)]
output =  [[[0. 4. 0. 0. 4. 0.]]]
forward memory_state =  [[0. 4. 0.]]
forward carry_state =  [[0. 4. 1.]]
backward memory state =  [[0. 4. 0.]]
backward carry state =  [[0. 4. 1.]]

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

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

相关文章

基于前端技术原生HTML、JS、CSS 电子病历编辑器源码

电子病历系统采取结构化与自由式录入的新模式,自由书写,轻松录入。实现病人医疗记录(包含有首页、病程记录、检查检验结果、医嘱、手术记录、护理记录等等。)的保存、管理、传输和重现,取代手写纸张病历。不仅实现了纸…

使用VisualStudio制作上位机(三)

文章目录 使用VisualStudio制作上位机(三)第三部分:GUI内部函数设计使用VisualStudio制作上位机(三) Author:YAL 第三部分:GUI内部函数设计 这一部分,主要实现CAN设备的打开 将CAN厂家的二次开发文件添加到工程里调用相关函数打开或关闭CAN首先,添加“类文件”,类主…

MinIO【部署 01】MinIO安装及SpringBoot集成简单测试

MinIO安装及SpringBoot集成测试 1.下载安装1.1 Install the MinIO Server1.2 Launch the MinIO Server1.3 Connect Your Browser to the MinIO Server 2.SpringBoot集成2.1 依赖及配置2.2 代码2.3 测试结果 1.下载安装 下载 https://min.io/download#/linux; 安装文…

Unity解决:3D开发模式第三人称视角 WASD控制角色移动旋转 使用InputSystem

Unity版本:2019.2.3f1 目录 安装InputSystem 1:创建InputHander.cs脚本 挂载到Player物体上 获取键盘输入WADS 2.创建PlayerLocomotion.cs挂载到Player物体上,控制物体移动转向 安装InputSystem 菜单栏/Window/Package Manager/Input Syst…

一款打工人必备的电脑端自律软件!!冲鸭打工人!!

你!有没有渴望进步!! 你!有没有渴望变强!!! 成为大佬!!!超越巨佬!!! 这就是一款为这样的你量身定做的程序:输入…

solidity0.8.0的应用案例9:代理合约

代码由OpenZeppelin的Proxy合约简化而来。 代理模式 Solidity合约部署在链上之后,代码是不可变的(immutable)。这样既有优点,也有缺点: 优点:安全,用户知道会发生什么(大部分时候)。坏处:就算合约中存在bug,也不能修改或升级,只能部署新合约。但是新合约的地址与…

数字孪生技术对旅游行业能起到什么作用?

随着疫情对我们生活影响的淡化,旅游行业迎来了新的春天,暑期更是旅游行业的小高潮,那么作为一个钻研数字孪生行业的小白,本文就着旅游的话题以及对旅游的渴望带大家一起探讨一下数字孪生对智慧旅游发展的作用~ 数字孪生作为一种虚…

DBi Tech Studio Controls for .NET Crack

DBi Tech Studio Controls for .NET Crack Studio Controls for.NET为企业开发人员提供了一套全面的Windows布局和信息表示软件元素,面向搜索业务分析商业调度和UI表示控制器的程序员。Studio Controls for.NET包含17个免版税的.NET Windows窗体控件,用于…

SpringBoot 学习(04):Idea 中控制启动命令的详细过程 环境区分案例

IDEA 启动SpringBoot的命令 C:\Users\Administrator\.jdks\corretto-17.0.8\bin\java.exe -XX:TieredStopAtLevel1 -Dspring.output.ansi.enabledalways -Dcom.sun.management.jmxremote -Dspring.jmx.enabledtrue -Dspring.liveBeansView.mbeanDomain -Dspring.applica…

为什么需要单元测试?

为什么需要单元测试? 从产品角度而言,常规的功能测试、系统测试都是站在产品局部或全局功能进行测试,能够很好地与用户的需要相结合,但是缺乏了对产品研发细节(特别是代码细节的理解)。 从测试人员角度而言…

vue3 tailwindcss的使用

首先安装依赖: npm install -D tailwindcsslatest postcsslatest autoprefixerlatestnpm i -D unocss 然后vite.config.ts中 引入 import Unocss from unocss/viteexport default defineConfig({plugins: [Unocss(),],})终端执行: npx tailwindcss in…