tensorflow中RNN和LSTM的实现
我一直在努力学习如何在tensorflow中编写RNN和LSTM。我在这篇博文的网上找到了一个例子 下面是我在理解最终用于字符rnn生成的LSTM网络时遇到的问题tensorflow中RNN和LSTM的实现,tensorflow,lstm,Tensorflow,Lstm,我一直在努力学习如何在tensorflow中编写RNN和LSTM。我在这篇博文的网上找到了一个例子 下面是我在理解最终用于字符rnn生成的LSTM网络时遇到的问题 x = tf.placeholder(tf.int32, [batch_size, num_steps], name='input_placeholder') y = tf.placeholder(tf.int32, [batch_size, num_steps], name='labels_placeholder'
x = tf.placeholder(tf.int32, [batch_size, num_steps], name='input_placeholder')
y = tf.placeholder(tf.int32, [batch_size, num_steps], name='labels_placeholder')
embeddings = tf.get_variable('embedding_matrix', [num_classes, state_size])
rnn_inputs = [tf.squeeze(i) for i in tf.split(1,
num_steps, tf.nn.embedding_lookup(embeddings, x))]
现在代码的不同部分定义了权重
x是要输入的数据,y是标签集。在lstm方程中,我们有一系列的门,x(t)乘以一系列,上一个隐藏状态乘以一组权重,添加偏差,应用非线性
以下是我的疑问
- 在这种情况下,只定义了一个权重矩阵,这是否意味着 适用于x(t)和上一个隐藏状态
- 对于嵌入矩阵,我知道它必须乘以 权重矩阵但为什么第一维度是num_类
- 对于rnn_输入,我们使用的是去除1维的挤压 但我为什么要在一个热编码中这样做呢
- 同样从拆分中,我了解到我们正在展开 将维度(批次大小X数量步数)分为离散维度(批次大小X 1) 向量,然后通过网络传递这些值 对
- 我能为您效劳吗
在这种情况下,只定义了一个权重矩阵,这是否意味着它也适用于x(t)和prev_hidden_状态。
当您调用
tf.nn.rnn\u cell.LSTMCell
时,会有更多权重。它们是RNN单元的内部权重,tensorflow在调用该单元时隐式创建了它
明确定义的权重矩阵是从隐藏状态到词汇表空间的转换
您可以查看重复零件的隐式权重,采用以前的隐藏状态和当前输入,并输出新的隐藏状态。您定义的权重矩阵将隐藏状态(即state\u size=200
)转换为更高的词汇空间(即vocab\u size=2000
)
有关更多信息,您可以查看本教程:
对于嵌入矩阵,我知道它必须乘以权重矩阵,但为什么第一维度是num_类
num_类说明了vocab_大小
,嵌入矩阵将词汇表转换为所需的嵌入大小(在本例中等于状态_大小
)
对于rnn_输入,我们使用的是压缩,它去除了1的维数,但为什么我要在一个热编码中这样做呢。
您需要去掉额外的维度,因为tf.nn.rnn
将输入作为(批大小,输入大小)
而不是(批大小,1,输入大小)
同样从拆分中,我了解到我们正在将维度的x(批次大小x数量步数)展开为离散(批次大小x 1)向量,然后通过网络传递这些值,对吗?
更精确,在嵌入之后<代码>(批次大小,数量步数,状态大小)变成一个num步数
元素列表,每个元素的大小(批次大小,1,状态大小)
流程如下所示:
state\u size
维度向量(矩阵的一行),使大小(vocab\u size,state\u size)
(批大小、步骤数、状态大小)
tf.split
将输入拆分为(批次大小,1,状态大小)
tf.squeeze
squeeze它们到(批大小、状态大小)
,形成tf.nn.rnn
所需的输入格式 with tf.variable_scope('softmax'):
W = tf.get_variable('W', [state_size, num_classes])
b = tf.get_variable('b', [num_classes], initializer=tf.constant_initializer(0.0))
logits = [tf.matmul(rnn_output, W) + b for rnn_output in rnn_outputs]
y_as_list = [tf.squeeze(i, squeeze_dims=[1]) for i in tf.split(1, num_steps, y)]