【问题标题】:Having trouble understanding lstm use in tensorflow code sample在 tensorflow 代码示例中无法理解 lstm 的使用
【发布时间】:2017-08-03 23:53:29
【问题描述】:

为什么在任何训练迭代发生之前计算pred 变量?我希望在每次迭代的每个数据传递期间都会生成一个pred(通过RNN() 函数)?

一定有我遗漏的东西。 pred 是不是类似于函数对象?我查看了tf.matmul() 的文档,它返回的是张量,而不是函数。

完整来源:https://github.com/aymericdamien/TensorFlow-Examples/blob/master/examples/3_NeuralNetworks/recurrent_network.py

代码如下:

def RNN(x, weights, biases):

    # Prepare data shape to match `rnn` function requirements
    # Current data input shape: (batch_size, n_steps, n_input)
    # Required shape: 'n_steps' tensors list of shape (batch_size, n_input)

    # Unstack to get a list of 'n_steps' tensors of shape (batch_size, n_input)
    x = tf.unstack(x, n_steps, 1)

    # Define a lstm cell with tensorflow
    lstm_cell = rnn.BasicLSTMCell(n_hidden, forget_bias=1.0)

    # Get lstm cell output
    outputs, states = rnn.static_rnn(lstm_cell, x, dtype=tf.float32)

    # Linear activation, using rnn inner loop last output
    return tf.matmul(outputs[-1], weights['out']) + biases['out']

pred = RNN(x, weights, biases)

# Define loss and optimizer
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=pred, labels=y))
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)

# Evaluate model
correct_pred = tf.equal(tf.argmax(pred,1), tf.argmax(y,1))
accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))

# Initializing the variables
init = tf.global_variables_initializer()

【问题讨论】:

    标签: python tensorflow lstm recurrent-neural-network rnn


    【解决方案1】:

    Tensorflow 代码有两个不同的阶段。首先,您构建一个“依赖关系图”,其中包含您将使用的所有操作。请注意,在此阶段您不会处理任何数据。相反,您只是定义要发生的操作。 TensorFlow 正在记录操作之间的依赖关系。

    例如,为了计算accuracy,您需要先计算correct_pred,要计算correct_pred,您需要先计算pred,以此类推。

    所以你在显示的代码中所做的只是告诉 tensorflow 你想要什么操作。您已将它们保存在“图形”数据结构中(这是一个 tensorflow 数据结构,基本上是一个包含所有数学运算和张量的存储桶)。

    稍后您将使用对sess.run([ops], feed_dict={inputs}) 的调用对数据运行操作。

    当您调用sess.run 时,请注意您必须告诉它您想要从图表中得到什么。如果你要accuracy

       sess.run(accuracy, feed_dict={inputs})
    

    Tensorflow 将尝试计算准确性。它将看到 accuracy 依赖于 correct_pred,因此它将尝试通过您定义的依赖关系图计算它,依此类推。

    您所犯的错误是您认为您列出的代码中的pred 正在计算某些东西。它不是。行:

       pred = RNN(x, weights, biases)
    

    只定义了操作和它的依赖。

    【讨论】:

    • 谢谢,这有很大帮助。最后一个问题:RNN() 不是返回张量的函数吗?因此,pred 应该是张量吧?从你的回答来看不是,我不知道怎么做。 pred 如何不使用 RNN() 函数返回张量?有没有我遗漏的语法?
    • 实际上它返回一个张量。但是张量只是一个对象,代表将来会发生的一些计算。如果您打印该张量,您将看到有关它的元信息,例如它的预期形状(如果它知道形状,它可能不知道,形状可能是动态的)。您将不会获得张量的值。如果你想要张量的 ,你需要让 tensorflow 用mytensors_value_as_a_numpy_array = sess.run(mytensor) 实际计算它。您需要将张量传递给 TF 计算它。您可以像在此代码中那样保留张量,也可以查找它们。
    猜你喜欢
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    相关资源
    最近更新 更多