【问题标题】:Changing Tensorflow Input Pipeline to "Datasets" - Error将 TensorFlow 输入管道更改为“数据集” - 错误
【发布时间】:2018-08-16 20:42:04
【问题描述】:

直到现在我在 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()

与:

def _generate_x_y(sample):
    features = {"x": tf.FixedLenFeature([1], tf.float32),
                "y": tf.FixedLenFeature([3], tf.float32)}
    parsed_features = tf.parse_single_example(sample,features)
    return parsed_features["x"], parsed_features["y"]

我的图表是这样的:

y_ = network(x)

和:

loss = tf.losses.softmax_cross_entropy(y,y_)
train_step = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(loss=loss)

我的会话是:

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`.

感谢您的帮助:-)

【问题讨论】:

    标签: tensorflow dataset pipeline


    【解决方案1】:

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

    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)
    

    每个数据集操作都会返回一个新的、已转换的数据集。原始对象未被mapshuffle 等操作修改。

    【讨论】:

    • 好的,谢谢。这是一个愚蠢的错误。但是现在我对地图功能有一些问题。我不明白如何制作 _generate_x_y 函数。也许你可以给我一些提示?我想像旧管道示例一样进行解码:/
    • 这就是它现在的工作方式: def _generate_x_y(sample): bytes = tf.decode_raw(sample, tf.float32) x = tf.reshape(tf.strided_slice(bytes,[0] ,[1]), [1]) y = tf.reshape(tf.strided_slice(bytes, [1], [4]), [3]) return x, y 但我认为这不是故意的?有没有更好的办法?
    • 您看到了什么实际错误?如果您提出单独的问题并在此处发布链接,可能会更容易。此外,如果这回答了您最初的问题,那么接受答案是一种很好的礼仪。
    猜你喜欢
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    • 2011-05-24
    • 2018-05-18
    • 2017-04-25
    • 2017-08-18
    相关资源
    最近更新 更多