gpt4 book ai didi

python - 将队列附加到 tensorflow 中的 numpy 数组以获取数据而不是文件?

转载 作者:太空狗 更新时间:2023-10-29 18:18:33 26 4
gpt4 key购买 nike

我已阅读CNN Tutorial on the TensorFlow我正在尝试为我的项目使用相同的模型。现在的问题是数据读取。我有大约 25000 张用于训练的图像和大约 5000 张用于测试和验证的图像。这些文件是 png 格式,我可以读取它们并将它们转换成 numpy.ndarray。

教程中的 CNN 示例使用队列从提供的文件列表中获取记录。我试图通过将我的图像 reshape 为一维数组并在其前面附加一个标签值来创建我自己的二进制文件。所以我的数据看起来像这样

[[1,12,34,24,53,...,105,234,102],
[12,112,43,24,52,...,115,244,98],
....
]

上述数组的单行长度为 22501,其中第一个元素是标签。

我将文件转储到使用 pickle 并尝试使用tf.FixedLengthRecordReader 从文件中读取为 demonstrated in example

我正在做与 cifar10_input.py 中给出的相同的事情来读取二进制文件并将它们放入记录对象中。

现在,当我从文件中读取标签和图像值时,它们是不同的。我可以理解这是因为 pickle 也会在二进制文件中转储大括号和方括号的额外信息,并且它们会更改固定长度的记录大小。

上面的示例使用文件名并将其传递给队列以获取文件,然后队列从文件中读取单个记录。

我想知道我是否可以将上面定义的 numpy 数组而不是文件名传递给某些读取器,并且它可以从该数组而不是文件中一条一条地获取记录。

最佳答案

可能使您的数据与 CNN 示例代码一起工作的最简单方法是制作 read_cifar10() 的修改版本并改用它:

  1. 写出一个包含您的 numpy 数组内容的二进制文件。

    import numpy as np
    images_and_labels_array = np.array([[...], ...], # [[1,12,34,24,53,...,102],
    # [12,112,43,24,52,...,98],
    # ...]
    dtype=np.uint8)

    images_and_labels_array.tofile("/tmp/images.bin")

    此文件类似于 CIFAR10 数据文件中使用的格式。您可能想要生成多个文件以获得读取并行性。注意 ndarray.tofile()以行优先顺序写入二进制数据,没有其他元数据;对数组进行酸洗将添加 TensorFlow 的解析例程无法理解的特定于 Python 的元数据。

  2. 编写处理您的记录格式的 read_cifar10() 的修改版本。

    def read_my_data(filename_queue):

    class ImageRecord(object):
    pass
    result = ImageRecord()

    # Dimensions of the images in the dataset.
    label_bytes = 1
    # Set the following constants as appropriate.
    result.height = IMAGE_HEIGHT
    result.width = IMAGE_WIDTH
    result.depth = IMAGE_DEPTH
    image_bytes = result.height * result.width * result.depth
    # Every record consists of a label followed by the image, with a
    # fixed number of bytes for each.
    record_bytes = label_bytes + image_bytes

    assert record_bytes == 22501 # Based on your question.

    # Read a record, getting filenames from the filename_queue. No
    # header or footer in the binary, so we leave header_bytes
    # and footer_bytes at their default of 0.
    reader = tf.FixedLengthRecordReader(record_bytes=record_bytes)
    result.key, value = reader.read(filename_queue)

    # Convert from a string to a vector of uint8 that is record_bytes long.
    record_bytes = tf.decode_raw(value, tf.uint8)

    # The first bytes represent the label, which we convert from uint8->int32.
    result.label = tf.cast(
    tf.slice(record_bytes, [0], [label_bytes]), tf.int32)

    # The remaining bytes after the label represent the image, which we reshape
    # from [depth * height * width] to [depth, height, width].
    depth_major = tf.reshape(tf.slice(record_bytes, [label_bytes], [image_bytes]),
    [result.depth, result.height, result.width])
    # Convert from [depth, height, width] to [height, width, depth].
    result.uint8image = tf.transpose(depth_major, [1, 2, 0])

    return result
  3. 修改distorted_inputs()使用您的新数据集:

    def distorted_inputs(data_dir, batch_size):
    """[...]"""
    filenames = ["/tmp/images.bin"] # Or a list of filenames if you
    # generated multiple files in step 1.
    for f in filenames:
    if not gfile.Exists(f):
    raise ValueError('Failed to find file: ' + f)

    # Create a queue that produces the filenames to read.
    filename_queue = tf.train.string_input_producer(filenames)

    # Read examples from files in the filename queue.
    read_input = read_my_data(filename_queue)
    reshaped_image = tf.cast(read_input.uint8image, tf.float32)

    # [...] (Maybe modify other parameters in here depending on your problem.)

鉴于您的起点,这只是一组最少的步骤。使用 TensorFlow ops 进行 PNG 解码可能更有效,但这将是一个更大的变化。

关于python - 将队列附加到 tensorflow 中的 numpy 数组以获取数据而不是文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34631852/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com