как

спользовании итератора API набора данных tenorflow моя цель - определить RNN, который работает с итератором.get_next() тензоры в качестве входных данных (см.(1) в коде).

Тем не менее, просто определяяdynamic_rnn с участиемget_next() поскольку его ввод приводит к ошибке:ValueError: Initializer for variable rnn/basic_lstm_cell/kernel/ is from inside a control-flow construct, such as a loop or conditional. When creating a variable inside a loop or conditional, use a lambda as the initializer.

Теперь я знаю, что один из обходных путей - просто создать заполнитель дляnext_batch а потомeval() тензор (потому что вы не можете передать сам тензор) и передать его с помощьюfeed_dict (видетьX а также(2) в коде). Однако, если я правильно понимаю, это неэффективное решение, так как мы сначала оцениваем, а затем повторно инициализируем тензор.

Есть ли способ либо:

Определите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()})

(Использование tensflow 1.4.0, Python 3.6.)

Большое спасибо :)

Ответы на вопрос(1)

Ваш ответ на вопрос