tf.nn.dynamic_rnn的输出outputs和state含义

 代码解释:https://blog.csdn.net/u010960155/article/details/81707498

lsmt解释:https://blog.csdn.net/demons__/article/details/79208268

代码直接可用的,不懂的看注释,最好先看 LSTM 的结构解释

import tensorflow as tf
import numpy as np
import math

def dynamic_rnn(rnn_type='lstm'):
    # 创建输入数据,3代表batch size,6代表输入序列的最大步长(max time),8代表每个序列的维度
    X = np.random.randn(3, 6, 4)

    # 第二个输入的实际长度为4
    X[1, 4:] = 0

    # 记录三个输入的实际步长
    X_lengths = [6, 4, 6]

    rnn_hidden_size = 5
    if rnn_type == 'lstm':
        cell = tf.contrib.rnn.BasicLSTMCell(num_units=rnn_hidden_size, state_is_tuple=True)
    else:
        cell = tf.contrib.rnn.GRUCell(num_units=rnn_hidden_size)

    outputs, last_states = tf.nn.dynamic_rnn(
        cell=cell,
        dtype=tf.float64,
        sequence_length=X_lengths,
        inputs=X)

    with tf.Session() as session:
        session.run(tf.global_variables_initializer())
        o1, s1 = session.run([outputs, last_states])
        print(np.shape(o1))
        print(o1)
        print(np.shape(s1))
        print(s1)
# https://blog.csdn.net/u010960155/article/details/81707498



# 输入层 大小 加上 输出层的大小,然后开方
#  embeding_inputs: shape=(100, 50, 16)
embeding_inputs_x = np.random.randn(3, 6, 4)
embeding_inputs = tf.placeholder(tf.float32,shape=[3, 6, 4])
num_embedding_size = 4
num_timesteps = 6   # 在一个sentence中 有 50 个词语
num_lstm_layers = 2  # 和上句的len 是一致的
num_lstm_nodes = [5, 5]  # 每一层的size是多少
# 有 两层 神经单元,每一层都是 32 个 神经单元
scale = 1.0 / math.sqrt(num_embedding_size + num_lstm_nodes[-1]) / 3.0
# xavier初始化方法,均匀分布在【-a,+a】
# a = -根号 6/(n_k + n_k+1)
lstm_init = tf.random_uniform_initializer(-scale, scale)

with tf.variable_scope('lstm_nn', initializer = lstm_init):
    cells = [] # 保存两个lstm层
    # 循环这两层 lstm
    for i in range(num_lstm_layers):
        # BasicLSTMCell类是最基本的LSTM循环神经网络单元。
        # 输入参数和BasicRNNCell差不多, 设置一层 的 lstm 神经元

        cell = tf.contrib.rnn.BasicLSTMCell(
            num_lstm_nodes[i], # 每层的 节点个数
            state_is_tuple = True # 中间状态是否是一个元组
        )
        # cell = tf.contrib.rnn.DropoutWrapper( # 进行 dropout
        #     cell,
        #     output_keep_prob = 0.5 # dropout 的 比例
        # )
        cells.append(cell)

    cell = tf.contrib.rnn.MultiRNNCell(cells)
    # 该方法的作用是:将两层的lstm 连到一起,比如:上层的输出是下层的输入
    # 此时的cell,已经是一个多层的lstm,但是可以当做单层的来操作,比较简单

    # 保存中间的一个隐含状态,隐含状态在初始化的时候初始化为0,也就是零矩阵
    initial_state = cell.zero_state(3,  tf.float32)

    # rnn_outputs: [batch_size, num_timesteps, lstm_outputs[-1](最后一层的输出)]
    # _ 代表的是隐含状态
    rnn_outputs, rnn_state  = tf.nn.dynamic_rnn(
        cell, embeding_inputs, initial_state = initial_state  #  embeding_inputs: shape=(100, 50, 16)
    ) # 现在的rnn_outputs 代表了每一步的输出

    # 获得最后一步的输出,也就是说,最后一个step的最后一层的输出
    last = rnn_outputs[:, -1, :]
    # print(last) Tensor("lstm_nn/strided_slice:0", shape=(100, 32), dtype=float32)
# tf.train.AdamOptimizer( 0.01).apply_gradients()
with tf.Session() as session:
    session.run(tf.global_variables_initializer())
    o1, s1 = session.run([rnn_outputs, rnn_state], feed_dict={embeding_inputs:embeding_inputs_x})
    print(np.shape(o1))
    print(o1)
    print(np.shape(s1))
    print(s1)

if __name__ == '__main__':
    dynamic_rnn(rnn_type='lstm')

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值