展平多个文件张量流的数据集

时间:2019-01-07 20:19:57

标签: python tensorflow tensorflow-datasets

我正在尝试从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)

前两行基于this answer。我希望能够使用get_next()指定batch()生成的图像数,而不是每个.bin文件中的图像数,这里是2500。

关于扁平化数据集here的问题已经存在,但是答案对我来说还不清楚。特别是,这个问题似乎包含一个在别处定义的类函数的代码片段,我不确定如何实现它。

我也尝试过使用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)

但这不能解决问题。

任何帮助将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:1)

我不确定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