gpt4 book ai didi

tensorflow - 如何使用tensorflow的Dataset API Iterator作为(循环)神经网络的输入?

转载 作者:行者123 更新时间:2023-12-02 09:15:43 26 4
gpt4 key购买 nike

当使用tensorflow的Dataset API Iterator时,我的目标是定义一个RNN,该RNN对迭代器的get_next()张量进行操作作为其输入(请参阅中的(1)代码)。

但是,简单地使用 get_next() 定义 dynamic_rnn 作为其输入会导致错误:ValueError: Initializer for variable rnn/basic_lstm_cell/kernel/is从控制流构造内部,例如循环或条件。在循环或条件内创建变量时,请使用 lambda 作为初始值设定项。

现在我知道一种解决方法是简单地为 next_batch 创建一个占位符,然后为张量创建 eval() (因为您无法传递张量本身)并且使用 feed_dict 传递它(请参阅代码中的 X(2))。但是,如果我理解正确的话,这不是一个有效的解决方案,因为我们首先评估然后重新初始化张量。

有没有办法:

  1. 直接在迭代器的输出之上定义dynamic_rnn

或者:

  • 如何直接将现有的 get_next() 张量传递给作为 dynamic_rnn 输入的占位符?
  • 完整的工作示例; (1) 版本是我想要的,但它没有,而 (2) 是可行的解决方法。

    import tensorflow as tf

    from tensorflow.contrib.rnn import BasicLSTMCell
    from tensorflow.python.data import Iterator

    data = [ [[1], [2], [3]], [[4], [5], [6]], [[1], [2], [3]] ]
    dataset = tf.data.Dataset.from_tensor_slices(data)
    dataset = dataset.batch(2)
    iterator = Iterator.from_structure(dataset.output_types,
    dataset.output_shapes)
    next_batch = iterator.get_next()
    iterator_init = iterator.make_initializer(dataset)

    # (2):
    X = tf.placeholder(tf.float32, shape=(None, 3, 1))

    cell = BasicLSTMCell(num_units=8)

    # (1):
    # outputs, states = lstm_outputs, lstm_states = tf.nn.dynamic_rnn(cell, next_batch, dtype=tf.float32)

    # (2):
    outputs, states = lstm_outputs, lstm_states = tf.nn.dynamic_rnn(cell, X, dtype=tf.float32)

    init = tf.global_variables_initializer()
    with tf.Session() as sess:
    sess.run(init)
    sess.run(iterator_init)

    # (1):
    # o, s = sess.run([outputs, states])
    # o, s = sess.run([outputs, states])

    # (2):
    o, s = sess.run([outputs, states], feed_dict={X: next_batch.eval()})
    o, s = sess.run([outputs, states], feed_dict={X: next_batch.eval()})

    (使用tensorflow 1.4.0,Python 3.6。)

    非常感谢:)

    最佳答案

    事实证明,这个神秘错误很可能是 tensorflow 中的一个错误,请参阅 https://github.com/tensorflow/tensorflow/issues/14729 。更具体地说,错误实际上来自于提供了错误的数据类型(在上面的示例中, data 数组包含 int32 值,但它应该包含 float )。

    而不是得到 ValueError: Initializer for variable rnn/basic_lstm_cell/kernel/ is from inside a control-flow construct错误,
    tensorflow 应该返回:
    TypeError: Tensors in list passed to 'values' of 'ConcatV2' Op have types [int32, float32] that don't all match. (参见1)。

    要解决此问题,只需更改
    data = [ [[1], [2], [3]], [[4], [5], [6]], [[1], [2], [3]] ]

    data = np.array([[ [1], [2], [3]], [[4], [5], [6]], [[1], [2], [3]] ], dtype=np.float32)

    然后下面的代码应该可以正常工作:

    import tensorflow as tf
    import numpy as np

    from tensorflow.contrib.rnn import BasicLSTMCell
    from tensorflow.python.data import Iterator

    data = np.array([[ [1], [2], [3]], [[4], [5], [6]], [[1], [2], [3]] ], dtype=np.float32)
    dataset = tf.data.Dataset.from_tensor_slices(data)
    dataset = dataset.batch(2)
    iterator = Iterator.from_structure(dataset.output_types,
    dataset.output_shapes)
    next_batch = iterator.get_next()
    iterator_init = iterator.make_initializer(dataset)

    # (2):
    # X = tf.placeholder(tf.float32, shape=(None, 3, 1))

    cell = BasicLSTMCell(num_units=8)

    # (1):
    outputs, states = lstm_outputs, lstm_states = tf.nn.dynamic_rnn(cell, next_batch, dtype=tf.float32)

    # (2):
    # outputs, states = lstm_outputs, lstm_states = tf.nn.dynamic_rnn(cell, X, dtype=tf.float32)

    init = tf.global_variables_initializer()
    with tf.Session() as sess:
    sess.run(init)
    sess.run(iterator_init)

    # (1):
    o, s = sess.run([outputs, states])
    o, s = sess.run([outputs, states])

    # (2):
    # o, s = sess.run([outputs, states], feed_dict={X: next_batch.eval()})
    # o, s = sess.run([outputs, states], feed_dict={X: next_batch.eval()})

    关于tensorflow - 如何使用tensorflow的Dataset API Iterator作为(循环)神经网络的输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47393356/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com