将Tensorflow输入管道更改为“数据集”-错误

将Tensorflow输入管道更改为“数据集”-错误,tensorflow,dataset,pipeline,Tensorflow,Dataset,Pipeline,到目前为止,我在tensorflow中使用了如下管道: queue_filenames = tf.train.string_input_producer(data) reader = tf.FixedLengthRecordReader(record_bytes=4*4) class Record(object): pass result = Record() result.ley, value = reader.read(queue_filenames) record = tf.de

到目前为止,我在tensorflow中使用了如下管道:

queue_filenames = tf.train.string_input_producer(data)
reader = tf.FixedLengthRecordReader(record_bytes=4*4)

class Record(object):
    pass
result = Record()
result.ley, value = reader.read(queue_filenames)
record = tf.decode_raw(value, tf.float32)
image = tf.reshape(tf.strided_slice(record,[0],[1]),[1])
label = tf.reshape(tf.strided_slice(record,[1],[4]),[3])

x, y = tf.train.shuffle_batch([image, label],
                              batch_size=batch_size,
                              capacity=batch_size*3,
                              min_after_dequeue=batch_size*2)
但是现在我想换一个数据集。我写道:

dataset = tf.data.FixedLengthRecordDataset(filenames=data,
                                           record_bytes=4*4)
dataset.map(_generate_x_y)
dataset.shuffle(buffer_size=batch_size*2)
dataset.batch(batch_size=batch_size)
dataset.repeat()
iterator = dataset.make_one_shot_iterator()
x, y = iterator.get_next()
与:

我的图表如下所示:

y_ = network(x)
以及:

我的会议是:

with tf.Session(graph=graph_train) as sess:
    tf.global_variables_initializer().run()
    for i in range(100):
        _, = sess.run([train_step])
它可以很好地处理旧管道,但对于新数据集,我得到以下错误:

File "C:/***/main.py", line 49, in <module>
x, y = iterator.get_next()
  File "C:\***\python\framework\ops.py", line 396, in __iter__
"`Tensor` objects are not iterable when eager execution is not "
TypeError: `Tensor` objects are not iterable when eager execution is not enabled. To iterate over this tensor use `tf.map_fn`.

感谢您的帮助:-

一个明显的问题可能是问题的原因,那就是您没有使用转换后的数据集。基本上,而不是

dataset = tf.data.FixedLengthRecordDataset(filenames=data,
                                           record_bytes=4*4)
dataset.map(_generate_x_y)
dataset.shuffle(buffer_size=batch_size*2)
你应该做:

dataset = tf.data.FixedLengthRecordDataset(filenames=data,
                                           record_bytes=4*4)
dataset = dataset.map(_generate_x_y)
dataset = dataset.shuffle(buffer_size=batch_size*2)

每个数据集操作都返回一个新的、已转换的数据集。原始对象不会被map和shuffle之类的操作修改。

好的,谢谢。那是个愚蠢的错误。但是现在我对map函数有一些问题。我不明白如何使_生成_x_y函数。也许你能给我一些提示?我希望使用与旧管道示例中相同的解码方式:/这就是它现在的工作方式:def _generate_x_ysample:bytes=tf.decode_rawsample,tf.float32 x=tf.reshagetf.strippetbytes,[0],[1],[1]y=tf.reshagetf.strippetbytes[1],[4],[3]返回x,是的,但我认为这不是故意的?有更好的方法吗?你看到了什么实际的错误?如果你问一个单独的问题并在这里发布一个链接,可能会更容易。另外,如果这回答了你原来的问题,那么接受这个答案是一种良好的礼仪。
dataset = tf.data.FixedLengthRecordDataset(filenames=data,
                                           record_bytes=4*4)
dataset.map(_generate_x_y)
dataset.shuffle(buffer_size=batch_size*2)
dataset = tf.data.FixedLengthRecordDataset(filenames=data,
                                           record_bytes=4*4)
dataset = dataset.map(_generate_x_y)
dataset = dataset.shuffle(buffer_size=batch_size*2)