Tensorflow实战学习(三十六)【实现Bidirectional LSTM Classifier】

双向 LSTM(Bidirectional LSTM)与普通 LSTM 公式过程 双向 LSTM 结构中有两个 LSTM 层,一个从前向后处理序列,另一个从后向前处理序列。在处理序列时,每个时间步的输入会被分别传递给两个 LSTM 层,然后它们的输出会被合并。双向 LSTM(Bidirectional LSTM)与普通 LSTM 有类似的公式过程,但有一些细微的差别。LSTM 是一种循环神经网络(RNN),用于处理序列数据。通过双向 LSTM,我们可以获得更全面的序列信息,有助于提高模型在序列任务中的性能。是前向 LSTM 在第。个时间步的向量表示,个时间步的细胞状态, 阅读详情

双向循环神经网络(Bidirectional Recurrent Neural Networks,Bi-RNN),Schuster、Paliwal,1997年首次提出,和LSTM同年。Bi-RNN,增加RNN可利用信息。普通MLP,数据长度有限制。RNN,可以处理不固定长度时序数据,无法利用历史输入未来信息。Bi-RNN,同时使用时序数据输入历史及未来数据,时序相反两个循环神经网络连接同一输出,输出层可以同时获取历史未来信息。

Language Modeling,不适合Bi-RNN,目标是通过前文预测下一单词,不能将下文信息传给模型。分类问题,手写文字识别、机器翻译、蛋白结构预测,Bi-RNN提升模型效果。百度语音识别,通过Bi-RNN综合上下文语境,提升模型准确率。

Bi-RNN网络结构核心,普通单向RNN拆成两个方向,随时序正向,逆时序反赂。当前时间节点输出,同时利用正向、反向两个方向信息。两个不同方向RNN不共用state,正向RNN输出state只传给正向RNN,反向RNN输出state只传给反向RNN,正反向RNN没有直接连接。每个时间节点输入,分别传给正反向RNN,根据各自状态产生输出,两份输出一起连接到Bi-RNN输出节点,共同合成最终输出。对当前时间节点输出贡献(或loss),在训练中计算出来,参数根据梯度优化到合适值。

Bi-RNN训练,正反向RNN没有交集,分别展开普通前馈网络。BPTT(back-propagation through time)算法训练,无法同时更新状态、输出。正向state在t=1时未知,反向state在t=T时未知,state在正反向开始处未知,需人工设置。正向状态导数在t=T时未知,反向状态导数在t=1时未知,state导数在正反向结晶尾处未知,需设0代表参数更新不重要。

开始训练,第一步,输入数据forward pass操作,inference操作,先沿1->T方向计算正向RNN state,再沿T->1方向计算反向RNN state,获得输出output。第二步,backward pass操作,目标函数求导操作,先求导输出output,先沿T->1方向计算正向RNN state导数,再沿1->T方向计算反向RNN state导数。第三步,根据求得梯度值更新模型参数,完成训练。

Bi-RNN每个RNN单元,可以是传统RNN,可以是LSTM或GRU单元。可以在一层Bi-RNN上再叠加一层Bi-RNN,上层Bi-RNN输出作下层Bi-RNN输入,可以进一步抽象提炼特征。分类任务,Bi-RNN输出序列连接全连接层,或连接全局平均池化Global Average Pooling,再接Softmax层,和卷积网络一样。

TensorFlow实现Bidirectional LSTM Classifier,在MNIST数据集测试。载入TensorFlow、NumPy、TensorFlow自带MNIST数据读取器。input_data.read_data_sets下载读取MNIST数据集。

设置训练参数。设置学习速率 0.01,优化器选择Adam,学习速率低。最大训练样本数 40万,batch_size 128,设置每间隔10次训练展示训练情况。

MNIST图像尺寸 28x28,输入n_input 28(图像宽),n_steps LSTM展开步数(unrolled steps of LSTM),设28(图像高),图像全部信息用上。一次读取一行像素(28个像素点),下个时间点再传入下一行像素点。n_hidden(LSTM隐藏节点数)设256,n_classes(MNIST数据集分类数目)设10。

创建输入x和学习目标y 的place_holder。输入x每个样本直接用二维结构。样本为一个时间序列,第一维度 时间点n_steps,第二维度 每个时间点数据n_input。设置Softmax层weights和biases,tf.random_normal初始化参数。双向LSTM,forward、backward两个LSTM cell,weights参数数量翻倍,2*n_hidden。

定义Bidirectional LSTM网络生成函数。形状(batch_size,n_steps,n_input)输入变长度n_steps列表,元素形状(batch_size,n_input)。输入转置,tf.transpose(x,[1,0,2]),第一维度batch_size,第二维度n_steps,交换。tf.reshape,输入x变(n_steps*batch_size,n_input)形状。 tf.split,x拆成长度n_steps列表,列表每个tensor尺寸(batch_size,n_input),符合LSTM单元输入格式。tf.contrib.rnn.BasicLSTMCell,创建forward、backward LSTM单元,隐藏节点数设n_hidden,forget_bias设1。正向lstm_fw_cell和反向lstm_bw_cell传入Bi-RNN接口tf.nn.bidirectional_rnn,生成双向LSTM,传入x输入。双向LSTM输出结果output做矩阵乘法加偏置,参数为前面定义weights、biases。

最后输出结果,tf.nn.softmax_cross_entropy_with_logits,Softmax处理计算损失。tf.reduce_mean计算平均cost。优化器Adam,学习速率learning_rate。tf.argmax得到模型预测类别,tf.equal判断是否预测正确。tf.reduce_mean求平均准确率。

执行训练和测试操作。执行初始化参数,定义一个训练循环,保持总训练样本数(迭代数*batch_size)小于设定值。每轮训练迭代,mnist.train.next_batch拿到一个batch数据,reshape改变形状。包含输入x和训练目标y的feed_dict传入,执行训练操作,更新模型参数。迭代数display_step整数倍,计算当前batch数据预测准确率、loss,展示。

全部训练迭代结果,训练好模型,mnist.test.images全部测试数据预测,展示准确率。

完成40万样本训练,训练集预测准确率基本是1,10000样本测试集0.983准确率。

Bidirectional LSTM Classifier,MNIST数据集表现不如卷积神经网络。Bi-RNN、双向LSTM网络,时间序列分类任务表现更好,同时利用时间序列历史和未来信息,结合上下文信息,结果综合判断。

    import tensorflow as tf
    import numpy as np
    # Import MINST data
    from tensorflow.examples.tutorials.mnist import input_data
    mnist = input_data.read_data_sets("/tmp/data/", one_hot=True)
    # Parameters
    learning_rate = 0.01
    max_samples = 400000
    batch_size = 128
    display_step = 10
    # Network Parameters
    n_input = 28 # MNIST data input (img shape: 28*28)
    n_steps = 28 # timesteps
    n_hidden = 256 # hidden layer num of features
    n_classes = 10 # MNIST total classes (0-9 digits)
    # tf Graph input
    x = tf.placeholder("float", [None, n_steps, n_input])
    y = tf.placeholder("float", [None, n_classes])
    # Define weights
    weights = {
        # Hidden layer weights => 2*n_hidden because of foward + backward cells
        'out': tf.Variable(tf.random_normal([2*n_hidden, n_classes]))
    }
    biases = {
        'out': tf.Variable(tf.random_normal([n_classes]))
    }
    def BiRNN(x, weights, biases):
        # Prepare data shape to match `bidirectional_rnn` function requirements
        # Current data input shape: (batch_size, n_steps, n_input)
        # Required shape: 'n_steps' tensors list of shape (batch_size, n_input)

        # Permuting batch_size and n_steps
        x = tf.transpose(x, [1, 0, 2])
        # Reshape to (n_steps*batch_size, n_input)
        x = tf.reshape(x, [-1, n_input])
        # Split to get a list of 'n_steps' tensors of shape (batch_size, n_input)
        x = tf.split(x, n_steps)
        # Define lstm cells with tensorflow
        # Forward direction cell
        lstm_fw_cell = tf.contrib.rnn.BasicLSTMCell(n_hidden, forget_bias=1.0)
        # Backward direction cell
        lstm_bw_cell = tf.contrib.rnn.BasicLSTMCell(n_hidden, forget_bias=1.0)
        # Get lstm cell output
    #    try:
        outputs, _, _ = tf.contrib.rnn.static_bidirectional_rnn(lstm_fw_cell, lstm_bw_cell, x,
                                           dtype=tf.float32)
    #    except Exception: # Old TensorFlow version only returns outputs not states
    #        outputs = rnn.bidirectional_rnn(lstm_fw_cell, lstm_bw_cell, x,
    #                                        dtype=tf.float32)
        # Linear activation, using rnn inner loop last output
        return tf.matmul(outputs[-1], weights['out']) + biases['out']

    pred = BiRNN(x, weights, biases)
    # Define loss and optimizer
    cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=pred, labels=y))
    optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)
    # Evaluate model
    correct_pred = tf.equal(tf.argmax(pred,1), tf.argmax(y,1))
    accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))
    # Initializing the variables
    init = tf.global_variables_initializer()
    # Launch the graph
    with tf.Session() as sess:
        sess.run(init)
        step = 1
        # Keep training until reach max iterations
        while step * batch_size < max_samples:
            batch_x, batch_y = mnist.train.next_batch(batch_size)
            # Reshape data to get 28 seq of 28 elements
            batch_x = batch_x.reshape((batch_size, n_steps, n_input))
            # Run optimization op (backprop)
            sess.run(optimizer, feed_dict={x: batch_x, y: batch_y})
            if step % display_step == 0:
                # Calculate batch accuracy
                acc = sess.run(accuracy, feed_dict={x: batch_x, y: batch_y})
                # Calculate batch loss
                loss = sess.run(cost, feed_dict={x: batch_x, y: batch_y})
                print("Iter " + str(step*batch_size) + ", Minibatch Loss= " + \
                      "{:.6f}".format(loss) + ", Training Accuracy= " + \
                      "{:.5f}".format(acc))
            step += 1
        print("Optimization Finished!")
        # Calculate accuracy for 128 mnist test images
        test_len = 10000
        test_data = mnist.test.images[:test_len].reshape((-1, n_steps, n_input))
        test_label = mnist.test.labels[:test_len]
        print("Testing Accuracy:", \
            sess.run(accuracy, feed_dict={x: test_data, y: test_label}))

参考资料:
《TensorFlow实战》

Tensorflow 使用Bidirectional()包装器构建双向LSTM模型,预测DNA序列功能 循环神经网络(RNN) 循环神经网络RNN能处理时间序列,过去几年中,应用 RNN 在语音识别,语言建模,翻译,图片描述等问题上已经取得一定成功,并且这个列表还在增长。RNN模型的一个代表是LSTM ,这是一种特别的 RNN,比标准的 RNN 在很多的任务上都表现得更好,因此获得了非常多的应用。值得一提的是,lstm的作者也Jürgen Schmidhuber 也是机器学习领域的大牛,名气比三巨头... 阅读详情

相关推荐

边写代码边学习之Bidirectional LSTM

参数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() 实现序列化。

Harry的博客 2522

lstm结构图_LSTM模型结构的可视化

目录: 1、传统的BP网络和CNN网络 2、LSTM网络 3、LSTM的输入结构 4、pytorch中的LSTM 4.1 pytorch中定义的LSTM模型 4.2 喂给LSTM的数据格式 4.3 LSTM的output格式 5、LSTM和其他网络组合最近在学习LSTM应用在时间序列的预测上,但是遇到一个很大的问题就是LSTM在传统BP网络上加上时间步后,其结构就很难理解了,同时其输入输出数据格式...

weixin_39529463的博客 8299

学习笔记TF036:实现Bidirectional LSTM Classifier

双向循环神经网络(Bidirectional Recurrent Neural Networks,Bi-RNN),Schuster、Paliwal,1997年首次提出,和LSTM同年。Bi-RNN,增加RNN可利用信息。普通MLP,数据长度有限制。RNN,可以处理不固定长度时序数据,无法利用历史输入未来信息。Bi-RNN,同时使用时序数据输入历史及未来数据,时序相反两个循环神经网络连接同一输出,输出

利炳根 1052

TensorFlow实战12:Bidirectional LSTM Classifier

1.双向递归神经网络简介双向递归神经网络(Bidirectional Recurrent Neural Networks, Bi-RNN),是由Schuster和Paliwal于1997年首次提出的,和LSTM是在同一年被提出的。Bi-RNN的主要目标是增加RNN可利用的信息。RNN无法利用某个历史输入的未来信息,Bi-RNN则正好相反,它可以同时使用时序数据中某个输入的历史及未来数据。 Bi-R

Felaim的博客 1万+

【论文笔记】Bidirectional LSTM-CRF Models for Sequence Tagging

Bidirectional LSTM-CRF Models for Sequence Tagging 论文作者:Zhiheng Huang、Wei Xu 、Kai Yu 单位:百度 论文地址 论文源代码 文章目录Bidirectional LSTM-CRF Models for Sequence Tagging0 摘要1 引言2 模型2.1 LSTM Networks2.2 Bidirectional LSTM Networks2.3 CRF networks2.4 LSTM-CRF networks2

如是我闻__一时__的博客 1208

Bidirectional LSTM-CRF Models for Sequence Tagging 论文理解及翻译

Bidirectional LSTM-CRF Models for Sequence Tagging 论文翻译摘要介绍2 模型2.1LSTM网络2.2 双向 LSTM 网络2.3 CRF网络2.5 BI-LSTM-CRF网络训练过程4 实验4.1 数据4.2 特征4.2.1 拼写特征4.2.2 上下文特征4.2.3 词嵌入4.2.4 特征连接技巧4.3 结果4.3.1 与Conv-CRF网络的比较...

weixin_37195726的博客 3584

深度学习模型:BiLSTM (Bidirectional LSTM) - 双向长短时记忆网络详解

以股票价格预测为例,正向 LSTM 可以分析过去的价格走势对当前价格的影响,反向 LSTM 可以从未来的价格变化趋势中反推当前价格的潜在因素,两者结合可以更全面地预测股票价格的未来走势,提高预测的准确性和可靠性。例如,常见的做法是简单的拼接操作:,这样得到的隐藏状态 就同时包含了序列正向和反向的信息,能够更全面地捕捉序列的特征和上下文关系。BiLSTM 是在 LSTM 的基础上构建的,它在每个时间步上同时运行两个 LSTM,一个按照序列的正向顺序处理数据,另一个按照反向顺序处理数据。

池央的博客 1万+

Bidirectional Long ShortTerm Memory (LSTM) Architecture

作者:禅与计算机程序设计艺术 1.简介 文本分类(text classification)是自然语言处理中的一个重要任务。给定一段文字,需要自动地对其进行分类,即将该段文字划入某一类或多类。这一过程是用计算机或机器学习模型实现的,并涉及到对文本表示、文本特征提取、机器学习方法等方面的一些技术。其中,神经

AI天才研究院 2280

tensorflow中bidirectional_dynamic_rnn简单示例和相关参数

假设已具备循环神经网络基础知识 1 tensorflow文档链接 tensorflow手册链接:https://github.com/tensorflow/docs/tree/r1.13/site/en/api_docs/python/tf 2 RNN类单元 RNN是针对序列数据建模的一类神经网络模型框架。tensorflow提供了封装好的接口可以直接传入参数调用即可。 RNN包括简单RNN、LSTM、GRU等单元,调用方法类似。在需要对数据(变长序列)进行双向信息提取的时候可以调用bidirectiona

Jerkang的博客 1023

from keras import layers

文本理解的方式越丰富越好,对同样的文本数据产生不同的表达方法(编码方式),组合型表达,不管是正序型循环表示还是倒序型表示,数据表达差异越多,提供足够的视角去看待数据本身,挖掘出来不同层面和角度的蕴含在数据中的信息。特别是时序在文本中有相对重要位置,对理解句子意义本身占据较大重要性时。 在keras中,双向循环LSTM是蕴含在Bidirectional层中的,我们只要调用keras.layers层...

AI工匠Book 4184

Python 音频: sounddevice 使用 左声道/右声道/立体声 --- 播放,录音

# coding: utf8 """ Python 音频: 使用 sounddevice 操作声卡的 左声道, 右声道, 立体声 仅限 MME, Windows DirectSound, Windows WASAPI, Windows WDM-KS 等支持双声道的驱动类型 """ import os import sounddevice as sd import soundfile mapping_left_ch = 1 # 左声道为 1 mapping_right_ch

weixin_42019925的博客 4926

论文阅读笔记(2)——Bidirectional LSTM-CRF Models for Sequence Tagging(用于序列标记的双向LSTM-CRF模型)

命名实体识别(Named Entity Recognition,简称NER),又称作“专名识别”,任务是识别出待处理文本中三大类(实体类、时间类和数字类)、七小类(人名、机构名、地名、时间、日期、货币和百分比)命名实体。 通常包括两部分:(1)实体边界识别;(2) 确定实体类别(人名、地名、机构名或其他)。 英语中的命名实体具有比较明显的形式标志(即实体中的每个词的第一个字母要大写),所以实体边界识别相对容易,任务的重点是确定实体的类别。和英语相比,汉语命名实体识别任务更加复杂,而且相对于实体类别标注子任.

strivequeen的博客 2096

Research Proposal:自动驾驶 行人运动预测

Research Proposal about Pedestrian/Cyclist Motion Prediction for Self-Driving Vehicles   If I can be provided with the opportunity to conduct PhD research in pedestrian/cyclist motion prediction for...

Poetry Wanderer的博客 3086

Bidirectional LSTM-CRF Models for Sequence Tagging

摘要 在本文中,我们提出了各种基于长短记忆(LSTM)的序列标记模型。这些模型包括LSTM网络、双向LSTM (BI-LSTM)网络、LSTM带条件随机场(CRF)层(LSTM-CRF)和双向LSTM带CRF层(BI-LSTM-CRF)。我们的工作是第一个将双向LSTM CRF(表示为Bi-LSTM-CRF)模型应用于NLP基准序列标记数据集。我们表明,由于双向LSTM组件,Bi-LSTM-CRF模型可以有效地使用过去和未来的输入特征。由于有CRF层,它还可以使用句子级别的标签信息。BI-LSTM-CRF.

发呆的比目鱼的博客 2034

密码学新手必看:三大顶级会议论文下载与阅读指南(附完整资源链接)

本文为密码学新手提供了系统性的三大顶级会议(Crypto、Eurocrypt、Asiacrypt)论文学习指南。内容涵盖如何高效获取最新论文资源、结构化精读论文的方法论,以及将理论转化为代码实践的路径,旨在帮助初学者快速构建密码学知识体系并应用于研究。

weixin_29214691的博客 317

(一篇即成功)Ubuntu下搭建qt环境和安装Qt Creator

只需一篇就成功搭建Ubuntu下的QT环境 你还在等什么

m0_73450461的博客 1万+

Tensorflow实现基于Bidirectional LSTM Classifier

数据集是在mnist上进行测试。先载入 Tensorflow、Numpy,以及Tensorflow自带的MNIST数据读取器。我们直接使用input_data.read_data_sets下载并读取mnist数据集。 import tensorflow as tf import numpy as np from tensorflow.examples.tutorials.mnist impo

河南骏的博客 1957

Deepseek接入QQ机器人:实现拟人化概率回复的完整指南

大语言模型API正在快速改变即时通讯工具的交互方式。通过标准化的OpenAI兼容接口,开发者可以将Deepseek等AI服务嵌入到QQ机器人等IM场景中,实现自然语言对话能力。其核心原理在于事件驱动架构:消息接收层通过OneBot协议获取群聊内容,业务层利用概率过滤与冷却机制控制回复节奏,再由大模型生成拟人化文本。这种设计不仅避免了机器人刷屏,还能通过系统提示词塑造性格,营造真实的社群陪伴体验。适用于粉丝群互动、内容订阅、小规模客服等场景,同时支持多群独立配置、关键词加权回复及上下文记忆扩展。在实际工程中,

weixin_29051245的博客 457

tensorflow学习之bidirectional_dynamic_rnn使用详解

tf.nn.bidirectional_dynamic_rnn tf.nn.bidirectional_dynamic_rnn(     cell_fw,     cell_bw,     inputs,     sequence_length=None,     initial_state_fw=None,     initial_state_bw=None,     dtype=None...

大雄没有叮当猫的博客 6133

matlab 点云均值、中值、高斯滤波【2024最新版】

点云均值滤波、中值滤波、高斯滤波的matlab自带函数实现。博客长期更新,本文最近一次更新时间为:2024年11月9日。

点云侠的博客 5258

Python爬取谷歌学术全攻略:基于Playwright与Asyncio的高效、抗反爬虫实践

同时,文章将详细解析爬虫过程中可能遇到的各种挑战,如IP封锁、验证码、动态内容加载等,并提供切实可行的解决方案。self.logger.info(f"第 {current_page} 页解析完成,共找到 {len(page_results)} 条结果。:谷歌学术的HTML结构并非一成不变,其CSS类名和标签结构可能会发生变化,且不同地区、不同语言的界面可能存在差异,增加了数据解析的难度。self.logger.info(f"开始搜索关键词: '{keyword}',计划爬取 {max_pages} 页")

2201_76125261的博客 1550

LSTM输入输出详解,tensorflow.nn.bidirectional_dynamic_rnn()函数的用法

LSTM结构 参数介绍: 数学原理: 公式参数: xt∈Rdxt∈Rd{\displaystyle x_{t}\in \mathbb {R} ^{d}}: input vector to the LSTM unit ft∈Rhft∈Rhft∈Rhft∈Rh{\displaystyle f_{t}\in \mathbb {R} ^{h}} {\displaystyle f_{t...

Mr番茄蛋的博客 1万+

基于CANopen协议,实现机器人500-1000Hz高频控制(附实操实例) (1)

基于CANopen协议实现机器人500-1000Hz高频控制,核心不是“协议本身的性能极限”,而是“通过优化配置、硬件适配、软件调优,最大化发挥协议的实时性优势”。关键在于:以PDO为核心实现实时数据传输,以SYNC帧锁定高频同步周期,以精简冗余、优化硬件降低总线负载,同时通过实操调试解决周期漂移、延迟、干扰等问题。

start_up_go的博客 91

【论文学习】Bidirectional LSTM-CRF Models for Sequence Tagging(论文翻译)

Bidirectional LSTM-CRF Models for Sequence Tagging(论文翻译) Abstract In this paper, we propose a variety of Long Short-Term Memory (LSTM) based models for sequence tagging. These models include LSTM netw...

Elvira521yan的博客 6299

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

基于LSTM的多变量多步预测模型

♚作者:沂水寒城,优快云博客专家,个人研究方向:机器学习、深度学习、NLP、CVBlog:http://yishuihancheng.blog.youkuaiyun.com本文主...

Python中文社区 2万+

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

上一篇: Tensorflow实战学习(三十五)【实现基于LSTM语言模型】
下一篇: Tensorflow实战学习(三十七)【实现强化学习策略网络】
.NET跨平台
博客等级 码龄15年 6066粉丝 738原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值