iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python中怎么使用tensorflow构建长短时记忆LSTM
  • 431
分享到

python中怎么使用tensorflow构建长短时记忆LSTM

PythonTensorFlowLSTM 2023-05-22 12:05:07 431人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

LSTM简介1、RNN的梯度消失问题在过去的时间里我们学习了RNN循环神经网络,其结构示意图是这样的:其存在的最大问题是,当w1、w2、w3这些值小于0时,如果一句话够长,那么其在神经网络进行反向传播与前向传播时,存在梯度消失的问题。0.9

LSTM简介

1、RNN的梯度消失问题

在过去的时间里我们学习了RNN循环神经网络,其结构示意图是这样的:

python中怎么使用tensorflow构建长短时记忆LSTM

其存在的最大问题是,当w1、w2、w3这些值小于0时,如果一句话够长,那么其在神经网络进行反向传播与前向传播时,存在梯度消失的问题。

0.925=0.07,如果一句话有20到30个字,那么第一个字的隐含层输出传递到最后,将会变为原来的0.07倍,相比于最后一个字的影响,大大降低。

其具体情况是这样的:

python中怎么使用tensorflow构建长短时记忆LSTM

长短时记忆网络就是为了解决梯度消失的问题出现的。

2、LSTM的结构

原始RNN的隐藏层只有一个状态h,从头传递到尾,它对于短期的输入非常敏感。

如果我们再增加一个状态c,让它来保存长期的状态,问题就可以解决了。

对于RNN和LSTM而言,其两个step单元的对比如下。

python中怎么使用tensorflow构建长短时记忆LSTM

我们把LSTM的结构按照时间维度展开:

python中怎么使用tensorflow构建长短时记忆LSTM

我们可以看出,在n时刻,LSTM的输入有三个:

1、当前时刻网络的输入值;

2、上一时刻LSTM的输出值;

3、上一时刻的单元状态。

LSTM的输出有两个:

1、当前时刻LSTM输出值;

2、当前时刻的单元状态。

3、LSTM独特的门结构

LSTM用两个门来控制单元状态cn的内容:

1、遗忘门(forget gate),它决定了上一时刻的单元状态cn-1有多少保留到当前时刻;

2、输入门(input gate),它决定了当前时刻网络的输入c’n有多少保存到单元状态。

LSTM用一个门来控制当前输出值hn的内容:

输出门(output gate),它决定了当前时刻单元状态cn有多少输出。

python中怎么使用tensorflow构建长短时记忆LSTM

Tensorflow中LSTM的相关函数

tf.contrib.rnn.BasicLSTMCell

tf.contrib.rnn.BasicLSTMCell(
    num_units,
    forget_bias=1.0,
    state_is_tuple=True,
    activation=None,
    reuse=None,
    name=None,
    dtype=None
)

num_units:RNN单元中的神经元数量,即输出神经元数量。

forget_bias:偏置增加了忘记门。手动将恢复的CudnnLSTM训练检查点(checkpoint)设置为0.0。

state_is_tuple:如果为True,则接受和返回的状态是c_state和m_state的2-tuple;如果为False,则他们沿着列轴连接。False即将弃用。

activation:激活函数。

reuse:描述是否在现有范围中重用变量。如果现有范围已经具有给定变量并且不为True,则会引发错误。

name:层的名称。

dtype:该层的数据类型。

在使用时,可以定义为:

lstm_cell = tf.contrib.rnn.BasicLSTMCell(self.cell_size, forget_bias=1.0, state_is_tuple=True)

在定义完成后,可以进行状态初始化:

self.cell_init_state = lstm_cell.zero_state(self.batch_size, dtype=tf.float32)

tf.nn.dynamic_rnn

tf.nn.dynamic_rnn(
    cell,
    inputs,
    sequence_length=None,
    initial_state=None,
    dtype=None,
    parallel_iterations=None,
    swap_memory=False,
    time_major=False,
    scope=None
)
  • cell:上文所定义的lstm_cell。

  • inputs:RNN输入。如果time_major==false(默认),则必须是如下shape的tensor:[batch_size,max_time,…]或此类元素的嵌套元组。如果time_major==true,则必须是如下形状的tensor:[max_time,batch_size,…]或此类元素的嵌套元组。

  • 矢量的大小由 sequence_length 参数决定,其类型为 Int32/Int64。用于在超过批处理元素的序列长度时复制通过状态和零输出。因此,它更多的是为了性能而不是正确性。

  • initial_state:上文所定义的_init_state。

  • dtype:数据类型。

  • parallel_iterations:并行运行的迭代次数。那些不具有任何时间依赖性并且可以并行运行的操作将是。这个参数用时间来交换空间。较大的值会消耗更多的内存,但运算速度更快,而较小的值则使用较少的内存,但需要更长的计算时间。

  • time_major:输入和输出tensor的形状格式。这些张量的形状必须为[max_time, batch_size, depth],若表述正确,则它为真。这些张量的形状必须是[batch_size,max_time,depth],如果为假。time_major=true可以提高效率,因为它避免了在RNN计算的开头和结尾进行转置操作。默认情况下,此函数为False,因为大多数的 TensorFlow 数据以批处理主数据的形式存在。

  • scope:创建的子图的可变作用域;默认为“RNN”。

在LSTM的最后,需要用该函数得出结果。

self.cell_outputs, self.cell_final_state = tf.nn.dynamic_rnn(
	lstm_cell, self.l_in_y, initial_state=self.cell_init_state, time_major=False)

返回的是一个元组 (outputs, state):

outputs:LSTM的最后一层的输出,是一个tensor。如果为time_major== False,则它的shape为[batch_size,max_time,cell.output_size]。如果为time_major== True,则它的shape为[max_time,batch_size,cell.output_size]。

states:states是一个tensor。state是最终的状态,也就是序列中最后一个cell输出的状态。一般情况下states的形状为 [batch_size, cell.output_size],但当输入的cell为BasicLSTMCell时,states的形状为[2,batch_size, cell.output_size ],其中2也对应着LSTM中的cell state和hidden state。

整个LSTM的定义过程为:

    def add_input_layer(self,):
        #X最开始的形状为(256 batch,28 steps,28 inputs)
        #转化为(256 batch*28 steps,128 hidden)
        l_in_x = tf.reshape(self.xs, [-1, self.input_size], name='to_2D') 

        #获取Ws和Bs
        Ws_in = self._weight_variable([self.input_size, self.cell_size])
        bs_in = self._bias_variable([self.cell_size])

        #转化为(256 batch*28 steps,256 hidden) 
        with tf.name_scope('Wx_plus_b'):
            l_in_y = tf.matmul(l_in_x, Ws_in) + bs_in
        
        # (batch * n_steps, cell_size) ==> (batch, n_steps, cell_size)
        # (256*28,256)->(256,28,256)
        self.l_in_y = tf.reshape(l_in_y, [-1, self.n_steps, self.cell_size], name='to_3D')

    def add_cell(self):
        #神经元个数
        lstm_cell = tf.contrib.rnn.BasicLSTMCell(self.cell_size, forget_bias=1.0, state_is_tuple=True)

        #每一次传入的batch的大小
        with tf.name_scope('initial_state'):
            self.cell_init_state = lstm_cell.zero_state(self.batch_size, dtype=tf.float32)

        #不是主列
        self.cell_outputs, self.cell_final_state = tf.nn.dynamic_rnn(
            lstm_cell, self.l_in_y, initial_state=self.cell_init_state, time_major=False)
    
    def add_output_layer(self):
        #设置Ws,Bs
        Ws_out = self._weight_variable([self.cell_size, self.output_size])
        bs_out = self._bias_variable([self.output_size])
        # shape = (batch,output_size)
        # (256,10)
        with tf.name_scope('Wx_plus_b'):
            self.pred = tf.matmul(self.cell_final_state[-1], Ws_out) + bs_out

全部代码

该例子为手写体识别例子,将手写体的28行分别作为每一个step的输入,输入维度均为28列。

import tensorflow as tf 
from tensorflow.examples.tutorials.mnist import input_data
import numpy as np

mnist = input_data.read_data_sets("MNIST_data",one_hot = "true")

BATCH_SIZE = 256     # 每一个batch的数据数量
TIME_STEPS = 28      # 图像共28行,分为28个step进行传输
INPUT_SIZE = 28      # 图像共28列
OUTPUT_SIZE = 10     # 共10个输出
CELL_SIZE = 256      # RNN 的 hidden unit size,隐含层神经元的个数
LR = 1e-3            # learning rate,学习率

def get_batch():    #获取训练的batch
    batch_xs,batch_ys = mnist.train.next_batch(BATCH_SIZE)      
    batch_xs = batch_xs.reshape([BATCH_SIZE,TIME_STEPS,INPUT_SIZE])
    return [batch_xs,batch_ys]

class LSTMRNN(object):  #构建LSTM的类
    def __init__(self, n_steps, input_size, output_size, cell_size, batch_size):
        self.n_steps = n_steps 
        self.input_size = input_size
        self.output_size = output_size
        self.cell_size = cell_size
        self.batch_size = batch_size

        #输入输出
        with tf.name_scope('inputs'):
            self.xs = tf.placeholder(tf.float32, [None, n_steps, input_size], name='xs')
            self.ys = tf.placeholder(tf.float32, [None, output_size], name='ys')
        #直接加层
        with tf.variable_scope('in_hidden'):
            self.add_input_layer()
        #增加LSTM的cell
        with tf.variable_scope('LSTM_cell'):
            self.add_cell()
        #直接加层
        with tf.variable_scope('out_hidden'):
            self.add_output_layer()
        #计算损失值
        with tf.name_scope('cost'):
            self.compute_cost()
        #训练
        with tf.name_scope('train'):
            self.train_op = tf.train.AdamOptimizer(LR).minimize(self.cost)
        #正确率计算
        self.correct_pre = tf.equal(tf.argmax(self.ys,1),tf.argmax(self.pred,1))
        self.accuracy = tf.reduce_mean(tf.cast(self.correct_pre,tf.float32))

    def add_input_layer(self,):
        #X最开始的形状为(256 batch,28 steps,28 inputs)
        #转化为(256 batch*28 steps,128 hidden)
        l_in_x = tf.reshape(self.xs, [-1, self.input_size], name='to_2D') 

        #获取Ws和Bs
        Ws_in = self._weight_variable([self.input_size, self.cell_size])
        bs_in = self._bias_variable([self.cell_size])

        #转化为(256 batch*28 steps,256 hidden) 
        with tf.name_scope('Wx_plus_b'):
            l_in_y = tf.matmul(l_in_x, Ws_in) + bs_in
        
        # (batch * n_steps, cell_size) ==> (batch, n_steps, cell_size)
        # (256*28,256)->(256,28,256)
        self.l_in_y = tf.reshape(l_in_y, [-1, self.n_steps, self.cell_size], name='to_3D')

    def add_cell(self):
        #神经元个数
        lstm_cell = tf.contrib.rnn.BasicLSTMCell(self.cell_size, forget_bias=1.0, state_is_tuple=True)

        #每一次传入的batch的大小
        with tf.name_scope('initial_state'):
            self.cell_init_state = lstm_cell.zero_state(self.batch_size, dtype=tf.float32)

        #不是主列
        self.cell_outputs, self.cell_final_state = tf.nn.dynamic_rnn(
            lstm_cell, self.l_in_y, initial_state=self.cell_init_state, time_major=False)
    
    def add_output_layer(self):
        #设置Ws,Bs
        Ws_out = self._weight_variable([self.cell_size, self.output_size])
        bs_out = self._bias_variable([self.output_size])
        # shape = (batch,output_size)
        # (256,10)
        with tf.name_scope('Wx_plus_b'):
            self.pred = tf.matmul(self.cell_final_state[-1], Ws_out) + bs_out

    def compute_cost(self):
        self.cost =  tf.reduce_mean(
            tf.nn.softmax_cross_entropy_with_logits(logits = self.pred,labels = self.ys)
            )

    def _weight_variable(self, shape, name='weights'):
        initializer = np.random.nORMal(0.0,1.0 ,size=shape)
        return tf.Variable(initializer, name=name,dtype = tf.float32)

    def _bias_variable(self, shape, name='biases'):
        initializer = np.ones(shape=shape)*0.1
        return tf.Variable(initializer, name=name,dtype = tf.float32)


if __name__ == '__main__':
    #搭建 LSTMRNN 模型
    model = LSTMRNN(TIME_STEPS, INPUT_SIZE, OUTPUT_SIZE, CELL_SIZE, BATCH_SIZE)
    sess = tf.Session()

    sess.run(tf.global_variables_initializer())
    
    #训练10000次
    for i in range(10000):
        xs, ys = get_batch()  #提取 batch data
        if i == 0:
        #初始化data
            feed_dict = {
                    model.xs: xs,
                    model.ys: ys,
            }
        else:
            feed_dict = {
                model.xs: xs,
                model.ys: ys,
                model.cell_init_state: state    #保持 state 的连续性
            }
        
        #训练
        _, cost, state, pred = sess.run(
            [model.train_op, model.cost, model.cell_final_state, model.pred],
            feed_dict=feed_dict)
        
        #打印精确度结果
        if i % 20 == 0:
            print(sess.run(model.accuracy,feed_dict = {
                    model.xs: xs,
                    model.ys: ys,
                    model.cell_init_state: state    #保持 state 的连续性
            }))

以上就是python中怎么使用tensorflow构建长短时记忆LSTM的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: python中怎么使用tensorflow构建长短时记忆LSTM

本文链接: https://www.lsjlt.com/news/216074.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • python中怎么使用tensorflow构建长短时记忆LSTM
    LSTM简介1、RNN的梯度消失问题在过去的时间里我们学习了RNN循环神经网络,其结构示意图是这样的:其存在的最大问题是,当w1、w2、w3这些值小于0时,如果一句话够长,那么其在神经网络进行反向传播与前向传播时,存在梯度消失的问题。0.9...
    99+
    2023-05-22
    Python TensorFlow LSTM
  • python神经网络使用tensorflow构建长短时记忆LSTM
    目录LSTM简介1、RNN的梯度消失问题2、LSTM的结构tensorflow中LSTM的相关函数tf.contrib.rnn.BasicLSTMCelltf.nn.dynamic_...
    99+
    2024-04-02
  • 手机使用云服务器怎么设置时间长短
    1. 了解云服务器的使用时间 在使用云服务器时,通常会有一个使用时间的限制。这个时间限制是由云服务提供商设定的,可以是按小时、按天、按月等不同的时间段。在使用云服务器时,需要根据自己的需求选择合适的使用时间。 2. 设置云服务器的使用时间...
    99+
    2023-10-26
    长短 服务器 时间
  • 怎么控制腾讯云服务器使用时间长短
    选择适当的云服务器提供商 选择适当的云服务器提供商是非常重要的。选择提供商时,需要考虑以下几个因素: 提供商的信誉度和历史记录。在选择提供商时,用户需要考虑他们提供的服务是否符合其需求和标准。 提供商的安全措施是否足够强大。如果提供...
    99+
    2023-10-28
    腾讯 长短 服务器
  • 怎么控制腾讯云服务器使用时间长短呢
    一、服务器硬件配置 腾讯云服务器硬件配置是腾讯云服务器的核心,是服务器性能的保障。腾讯云服务器的硬件配置包括服务器CPU、内存、硬盘等,以下是腾讯云服务器硬件配置的详细介绍: CPU:腾讯云服务器CPU是腾讯云服务器的核心,它决定了服务...
    99+
    2023-10-27
    腾讯 长短 服务器
  • 手机使用云服务器怎么设置时间长短呢
    如果您是在办公室或者家里使用云服务器,可以使用手机的闹钟功能来设置定时开关机。首先需要打开手机闹钟功能,然后将闹钟设定为每天早上6点。每天早上6点准时响起,手机会自动同步云端数据,将您从睡梦中唤醒。这样,您就可以享受到一个比较准时的起床提醒...
    99+
    2023-10-28
    长短 服务器 时间
  • 手机使用云服务器怎么设置时间长短显示
    首先,打开手机上的“设置”应用,进入“通用”选项卡,在这里可以看到“时间和日期”选项。点击进入后,找到“时间和日期”选项,在该选项下可以看到“云服务器时间”选项,点击它进入云服务器设置页面。 在该页面中,我们可以看到手机云服务器的时间设置...
    99+
    2023-10-28
    长短 服务器 时间
  • 怎么使用Python构建GUI
    本篇内容介绍了“怎么使用Python构建GUI”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Streamlit我喜欢使用的包是 Stream...
    99+
    2023-07-06
  • 手机怎么控制腾讯云服务器使用时间长短
    首先,在手机上下载一个名为“腾讯云服务器”的应用程序。打开应用程序后,进入主页面,选择需要控制的服务器。在主页面上,可以看到一个“实时监控”选项,点击进入。在这个页面上,可以选择服务器的实时状态,包括服务器的使用时间、流量、带宽等。点击“实...
    99+
    2023-10-28
    腾讯 长短 服务器
  • 华为云服务器怎么用手机控制平板使用时间长短
    1. 了解华为云服务器 华为云服务器是一种云计算服务,可以让用户在云端租用虚拟服务器,以便在云端运行应用程序和存储数据。华为云服务器提供了高性能、高可靠性、高安全性的云计算服务,可以满足用户的各种需求。 2. 使用手机控制平板使用时间长短...
    99+
    2023-10-26
    华为 用手 长短
  • 华为云服务器怎么用手机控制电脑使用时间长短
    要使用华为云服务器中的“手机控制电脑使用时间长短”功能,需要先安装华为云服务器的客户端,并将其连接到电脑并打开客户端,在“设置”界面中进行相关设置,如下图所示: 添加设备:在客户端中选择要连接的云服务器,并输入连接密码,如下图所示: 连...
    99+
    2023-10-26
    华为 用手 长短
  • 云服务器怎么远程控制手机屏幕使用时间长短
    首先,要实现云服务器的远程控制,用户需要使用云服务器提供的远程管理工具,例如Trello、Asana等,通过该工具可以方便地创建、管理和删除云服务器上的应用程序。这些应用程序可以是简单的Web应用,也可以是复杂的Web应用,例如虚拟桌面、视...
    99+
    2023-10-28
    长短 远程控制 手机屏幕
  • Python闭眼时长标准差脚本怎么使用
    这篇文章主要介绍“Python闭眼时长标准差脚本怎么使用”,在日常操作中,相信很多人在Python闭眼时长标准差脚本怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python闭眼时长标准差脚本怎么使用...
    99+
    2023-07-05
  • 腾讯云服务器怎么远程控制手机屏幕使用时间长短
    首先,在使用腾讯云服务器之前,我们需要准备一些必要的工具和资源,如云账号、密码、远程桌面连接等。这些工具和资源可以帮助我们轻松地连接到云服务器并远程控制我们的手机屏幕。 在使用腾讯云服务器时,我们需要设置一个云账号,以便能够在不同的设备之...
    99+
    2023-10-27
    腾讯 长短 远程控制
  • 怎么使用Python构建一个仪表板
    本篇内容主要讲解“怎么使用Python构建一个仪表板”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用Python构建一个仪表板”吧!简介如果你目前在一个数据或商业智能团队工作,你的任务之一...
    99+
    2023-07-05
  • 怎么在python中利用pathlib构建路径
    怎么在python中利用pathlib构建路径?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。python主要应用领域有哪些1、云计算,典型应用OpenStack...
    99+
    2023-06-14
  • python神经网络怎么使用Keras构建RNN
    这篇文章主要介绍“python神经网络怎么使用Keras构建RNN”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“python神经网络怎么使用Keras构建RNN”文章能帮助大家解决问题。Keras中...
    99+
    2023-06-30
  • 怎么使用Python构建电影推荐系统
    这篇文章主要讲解了“怎么使用Python构建电影推荐系统”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用Python构建电影推荐系统”吧!导入数据导入和合并数据集并创建 Pandas ...
    99+
    2023-07-06
  • python中怎么使用tensorflow实现数据下载与读取
    本篇内容介绍了“python中怎么使用tensorflow实现数据下载与读取”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、mnist数据...
    99+
    2023-07-02
  • Docker镜像构建中docker commit怎么使用
    这篇“Docker镜像构建中docker commit怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Doc...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作