假设你有一个存储数据集的文件夹(包含大量图像)。你希望将这些图像输入到深度神经网络中进行训练(我目前使用Tensorflow)。
首先想到的解决方案(非常初级且不雅的解决方案)是将图像存储在一个数组中。对于小数据集来说这是可以的,但当数据集很大且图片很大时,这不是一个可行的解决方案,因为我们将没有足够的内存。
解决方案是分批读取数据。
我正在尝试实现这一点。我感兴趣的数据集是cultech的Caltech-UCSD Birds 200。这个数据集提供了一个文本文件,每行包含每张图像的路径。这简化了事情。我的解决方案(我正在尝试实现的)是定义一个类。模板是这样的:
class Dataset : 属性 : images_paths labels current_batch_index batch_size classes_names 方法 : get_next_batch() shuffle() normalize()
一旦我实例化这个类的对象,所有图像的路径就会存储在images_paths变量中,真实标签(one_hot_encoded)存储在labels中。get_next_batch()方法将使用current_batch_index返回一个数组,我们使用路径存储实际的图像。数组的大小是batch_size,从images_path和labels读取的索引是(current_batch_index, current_batch_index+batch_size)。(我使用scipy.misc.imread读取图像,并使用scipy.misc.reshape将它们调整为固定形状(200×200)。)
这样,我将只在内存中存储一个批次,并在训练循环中使用它来输入网络。
问题:你觉得这个怎么样?你通常如何将图像输入到网络中?有相关的工具吗?有用于分割数据集的工具吗?
供参考:我使用的是Python和Tensorflow。也希望了解这些问题的C++答案。
谢谢,抱歉这篇文章有点长
回答:
Tensorflow允许按需从磁盘读取数据,并具有预先缓冲数据以减少延迟的方法(例如,当批次3通过网络运行时,批次4在内存中,而批次5正在加载到批次2之前所在的内存中)。查看tf.data
库。cifar10示例做了类似你所问的事情,但cifar10格式有些奇怪,需要进行一些调整。
有没有更好的例子?