我一直在努力学习如何在张量流中编码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乘以一组权重,加上偏差并应用非线性。
答案 0 :(得分:0)
我可以帮你。
调用tf.nn.rnn_cell.LSTMCell
时有更多权重。它们是RNN单元格的内部权重,当您调用单元格时,张量流会隐式地创建它。
您明确定义的权重矩阵是从隐藏状态到词汇空间的转换。
您可以查看计算重复部分的隐式权重,采用先前的隐藏状态和当前输入并输出新的隐藏状态。你定义的权重矩阵将隐藏状态(即state_size = 200
)转换为更高的词汇空间。(即vocab_size = 2000
)
有关详细信息,您可以查看本教程:http://colah.github.io/posts/2015-08-Understanding-LSTMs/
num_classes考虑vocab_size
,嵌入矩阵正在将词汇表转换为所需的嵌入大小(在此示例中等于state_size
)。
您需要摆脱额外维度,因为tf.nn.rnn
将输入视为(batch_size, input_size)
而不是(batch_size, 1, input_size)
。
嵌入后更精确。 (batch_size, num_steps, state_size)
变成num_step
个元素列表,每个元素的大小为(batch_size, 1, state_size)
。
state_size
维度向量(矩阵的一行),大小为(vocab_size, state_size)
。(batch_size, num_steps, state_size)
。tf.split
将输入拆分为(batch_size, 1, state_size)
tf.squeeze
将它们平铺到(batch_size, state_size)
,形成tf.nn.rnn
所需的输入格式。如果tensorflow方法有任何问题,也许您可以在tensorflow API中搜索它们以获得更详细的介绍。