使用时出现InvalidArgumentErrortensorflow.data.Dataset.从安根

2024-04-19 13:04:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试在单个GPU上使用Tensorflow数据集API生成自己的图像数据集来测量推理性能

resolutions = [
    (2048, 1080)
]

def generate_image(size, channels):
    image_value = random.random()
    image_shape = [1, size[1], size[0], channels]
    return tf.constant(
        value=image_value,
        shape=image_shape,
        dtype=tf.float32)

def generate_single_input(size):
    source = generate_image(size, 3)
    target = generate_image(size, 3)
    return source, target

def input_generator_fn():
    for res in resolutions:
        for i in range(10):
            yield generate_single_input(res)


def benchmark():
    ...
    ds = tf.data.dataset.from_generator(
        generator=input_generator_fn,
        output_types=(tf.float32, tf.float32),
        output_shapes=(tf.TensorShape([1, 1080, 2048, 3]),
                       tf.TensorShape([1, 1080, 2048, 3])))
    iterator = ds.make_one_shot_iterator()
    next_record = iterator.get_next()

    inputs = next_record[0]
    outputs = next_record[1]

    predictions = {
        'input_images': inputs
        'output_images': outputs
    }
    session = tf.Session()
    with session:
        tf.global_variables_initializer()
        for res in resolutions:
           for i in range(10):
               session.run(predictions)
               .....

但我在运行后观察到以下异常

^{pr2}$

Tags: inimageforinputsizevaluetfdef
2条回答

你知道了吗?在

我遇到了完全相同类型的问题,我的问题是生成器和输入到输出形状中的尺寸不匹配。在

再看看你的代码,我相信你必须输入有效的数据,比如numpy数组,而不是TensorFlow常量。在

简而言之,这是因为从_生成器可以展平NumPy数组而不是张量。在

下面是一个较短的代码,将重现错误:

import tensorflow as tf
import numpy as np

print(tf.__version__)
def g():
  img = tf.random_uniform([3])
  # img = np.random.rand(3)
  # img = tf.convert_to_tensor(img)
  yield img

dataset = tf.data.Dataset.from_generator(g, tf.float64, tf.TensorShape([3]))
iterator = dataset.make_one_shot_iterator()
next_iterator = iterator.get_next()

sess = tf.Session()
sess.run(next_iterator)

版本1.14中的错误消息非常有用。(确切的代码行会因版本不同而改变,但我已经检查了1.12和1.13,原因是一样的。)

^{pr2}$

当生成的元素是张量时,from_generator将把它展平为output_types。转换功能不起作用。在

要解决这个问题,只需在生成器生成张量时不要使用from_generator。您可以使用from_tensorsfrom_tensor_slices。在

img = tf.random_uniform([3])

dataset = tf.data.Dataset.from_tensors(img).repeat()
iterator = dataset.make_initializable_iterator()
next_iterator = iterator.get_next()

sess = tf.Session()
sess.run(iterator.initializer)
sess.run(next_iterator)

相关问题 更多 >