我正在Dataset
使用该from_generator
函数创建一个张量流。在图形/会话模式下,它工作正常:
import tensorflow as tf
x = {str(i): i for i in range(10)}
def gen():
for i in x:
yield x[i]
ds = tf.data.Dataset.from_generator(gen, tf.int32)
batch = ds.make_one_shot_iterator().get_next()
with tf.Session() as sess:
while True:
try:
print(sess.run(batch), end=' ')
except tf.errors.OutOfRangeError:
break
# 0 1 2 3 4 5 6 7 8 9
然而,令人惊讶的是,它使用急切执行失败了:
import tensorflow as tf
tf.enable_eager_execution()
x = {str(i): i for i in range(10)}
def gen():
for i in x:
yield x[i]
ds = tf.data.Dataset.from_generator(gen, tf.int32)
for x in ds:
print(x, end=' ')
# TypeError: Only integers, slices (`:`), ellipsis (`...`), tf.newaxis (`None`) and scalar tf.int32/tf.int64 tensors are valid indices, got '1'
我假设,由于生成器的主体是没有序列化的纯 python,所以 tensorflow 不会查看 - 实际上不在乎 - 生成器中的内容。但显然情况并非如此。那么为什么 tensorflow 会关心生成器内部的内容呢?假设无法更改生成器,有没有办法以某种方式解决这个问题?