我一直在努力学习如何在张量流中编码RNN和LSTM . 我在这篇博客文章中找到了一个在线示例
http://r2rt.com/recurrent-neural-networks-in-tensorflow-ii.html
下面是我无法理解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')
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))]
代码的不同部分现在定义权重
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)]
x是要馈送的数据,y是标签集 . 在lstm方程中,我们有一系列门,x(t)乘以一系列,prev_hidden_state乘以一组权重,加上偏差并应用非线性 .
以下是我的疑虑
-
在这种情况下,只定义了一个权重矩阵,这意味着它同样适用于x(t)和prev_hidden_state .
-
对于嵌入矩阵,我知道它必须乘以权重矩阵但为什么是第一个维度num_classes
-
对于rnn_inputs,我们使用squeeze删除1的维度,但为什么我要在一个热编码中执行此操作 .
-
同样从分裂中我理解我们将维度x(batch_size X num_steps)展开为离散(batch_size X 1)向量,然后通过网络传递这些值是正确的
1 回答
我可以帮你吗 .
在这种情况下,只定义了一个权重矩阵,这意味着它同样适用于x(t)和prev_hidden_state .
调用
tf.nn.rnn_cell.LSTMCell
时有更多权重 . 它们是RNN单元的内部权重,当您调用单元格时,张量流会隐式创建它 .您明确定义的权重矩阵是从隐藏状态到词汇空间的转换 .
您可以查看重复部分的隐式权重,获取先前的隐藏状态和当前输入并输出新的隐藏状态 . 你定义的权重矩阵将隐藏状态(即
state_size = 200
)转换为更高的词汇空间 . (即vocab_size = 2000
)有关详细信息,您可以查看本教程:http://colah.github.io/posts/2015-08-Understanding-LSTMs/
对于嵌入矩阵,我知道它必须乘以权重矩阵但为什么是第一个维度num_classes
num_classes占
vocab_size
,嵌入矩阵正在将词汇表转换为所需的嵌入大小(在此示例中等于state_size
) .对于rnn_inputs,我们使用squeeze删除1的维度,但为什么我要在一个热编码中这样做 .
您需要摆脱额外的维度,因为
tf.nn.rnn
将输入视为(batch_size, input_size)
而不是(batch_size, 1, input_size)
.同样从分裂中我理解我们将维度x(batch_size X num_steps)展开为离散(batch_size X 1)向量,然后通过网络传递这些值是对的吗?
嵌入后更精确 .
(batch_size, num_steps, state_size)
变成num_step
元素列表,每个元素的大小为(batch_size, 1, state_size)
.流程如下:
嵌入矩阵将每个单词嵌入为
state_size
维度向量(矩阵的一行),大小为(vocab_size, state_size)
.检索x占位符指定的索引并获取rnn输入,其大小为
(batch_size, num_steps, state_size)
.tf.split
将输入拆分为(batch_size, 1, state_size)
tf.squeeze
sqeeze to(batch_size, state_size)
,为tf.nn.rnn
形成所需的输入格式 .如果tensorflow方法有任何问题,也许您可以在tensorflow API中搜索它们以获得更详细的介绍 .