展平多个文件的数据集tensorflow
Flatten Dataset of multiple files tensorflow
我正在尝试从 6 个 .bin 文件中读取 CIFAR-10 数据集,然后创建一个 initializable_iterator。 This 是我从中下载数据的站点,它还包含对二进制文件结构的描述。每个文件包含 2500 张图像。然而,生成的迭代器只为每个文件生成一个张量,一个大小为 (2500,3703) 的张量。这是我的代码
import tensorflow as tf
filename_dataset = tf.data.Dataset.list_files("cifar-10-batches-bin/*.bin")
image_dataset = filename_dataset.map(lambda x: tf.decode_raw(tf.read_file(x), tf.float32))
iter_ = image_dataset.make_initializable_iterator()
next_file_data = iter_.get_next()I
next_file_data = tf.reshape(next_file_data, [-1,3073])
next_file_img_data, next_file_labels = next_file_data[:,:-1], next_file_data[:,-1]
next_file_img_data = tf.reshape(next_file_img_data, [-1,32,32,3])
init_op = iter_.initializer
with tf.Session() as sess:
sess.run(init_op)
print(next_file_img_data.eval().shape)
_______________________________________________________________________
>> (2500,32,32,3)
前两行基于。我希望能够使用 batch()
指定 get_next()
生成的图像数量,而不是每个 .bin 文件中的图像数量,这里是 2500。
已经有一个关于扁平化数据集的问题here,但我不清楚答案。特别是,该问题似乎包含来自其他地方定义的 class 函数的代码片段,我不确定如何实现它。
我也试过用 tf.data.Dataset.from_tensor_slices()
创建数据集,用
替换上面的第一行
import os
filenames = [os.path.join('cifar-10-batches-bin',f) for f in os.listdir("cifar-10-batches-bin") if f.endswith('.bin')]
filename_dataset = tf.data.Dataset.from_tensor_slices(filenames)
但这并没有解决问题。
非常感谢任何帮助。谢谢。
我不确定您的 bin 文件的结构。我假设每个文件中每个图像有 32*32*3 = 3072 个点。所以每个文件中的数据都是 3072 的倍数。但是对于任何其他结构,操作的种类都是相似的,所以这仍然可以作为指导。
您可以进行一系列映射操作:
import tensorflow as tf
filename_dataset = tf.data.Dataset.list_files("cifar-10-batches-bin/*.bin")
image_dataset = filename_dataset.map(lambda x: tf.decode_raw(tf.read_file(x), tf.float32))
image_dataset = image_dataset.map(lambda x: tf.reshape(x, [-1, 32, 32, 3]) # Reshape your data to get 2500, 32, 32, 3
image_dataset = image_dataset.flat_map(lambda x: tf.data.Dataset.from_tensor_slices(x)) # This operation would give you tensors of shape 32,32,3 and put them all together.
image_dataset = image_dataset.batch(batch_size) # Now you can define your batchsize
我正在尝试从 6 个 .bin 文件中读取 CIFAR-10 数据集,然后创建一个 initializable_iterator。 This 是我从中下载数据的站点,它还包含对二进制文件结构的描述。每个文件包含 2500 张图像。然而,生成的迭代器只为每个文件生成一个张量,一个大小为 (2500,3703) 的张量。这是我的代码
import tensorflow as tf
filename_dataset = tf.data.Dataset.list_files("cifar-10-batches-bin/*.bin")
image_dataset = filename_dataset.map(lambda x: tf.decode_raw(tf.read_file(x), tf.float32))
iter_ = image_dataset.make_initializable_iterator()
next_file_data = iter_.get_next()I
next_file_data = tf.reshape(next_file_data, [-1,3073])
next_file_img_data, next_file_labels = next_file_data[:,:-1], next_file_data[:,-1]
next_file_img_data = tf.reshape(next_file_img_data, [-1,32,32,3])
init_op = iter_.initializer
with tf.Session() as sess:
sess.run(init_op)
print(next_file_img_data.eval().shape)
_______________________________________________________________________
>> (2500,32,32,3)
前两行基于batch()
指定 get_next()
生成的图像数量,而不是每个 .bin 文件中的图像数量,这里是 2500。
已经有一个关于扁平化数据集的问题here,但我不清楚答案。特别是,该问题似乎包含来自其他地方定义的 class 函数的代码片段,我不确定如何实现它。
我也试过用 tf.data.Dataset.from_tensor_slices()
创建数据集,用
import os
filenames = [os.path.join('cifar-10-batches-bin',f) for f in os.listdir("cifar-10-batches-bin") if f.endswith('.bin')]
filename_dataset = tf.data.Dataset.from_tensor_slices(filenames)
但这并没有解决问题。
非常感谢任何帮助。谢谢。
我不确定您的 bin 文件的结构。我假设每个文件中每个图像有 32*32*3 = 3072 个点。所以每个文件中的数据都是 3072 的倍数。但是对于任何其他结构,操作的种类都是相似的,所以这仍然可以作为指导。 您可以进行一系列映射操作:
import tensorflow as tf
filename_dataset = tf.data.Dataset.list_files("cifar-10-batches-bin/*.bin")
image_dataset = filename_dataset.map(lambda x: tf.decode_raw(tf.read_file(x), tf.float32))
image_dataset = image_dataset.map(lambda x: tf.reshape(x, [-1, 32, 32, 3]) # Reshape your data to get 2500, 32, 32, 3
image_dataset = image_dataset.flat_map(lambda x: tf.data.Dataset.from_tensor_slices(x)) # This operation would give you tensors of shape 32,32,3 and put them all together.
image_dataset = image_dataset.batch(batch_size) # Now you can define your batchsize