例如,Tensorflow图像字幕示例模型状态的comments:
NOTE: This script will consume around 100GB of disk space because each image
in the MSCOCO dataset is replicated ~5 times (once per caption) in the output.
This is done for two reasons:
1. In order to better shuffle the training data.
2. It makes it easier to perform asynchronous preprocessing of each image in
TensorFlow.
这个问题的主要目标是看看是否有替代这种类型的重复。在我的用例中,以这种方式存储数据将要求每个图像在TFRecord文件中复制多次,大约20-50次。
我首先要注意的是,我已经通过VGGnet提供图像以提取4096个暗淡的特征,并且我将这些存储为文件名和矢量之间的映射。
在切换到Tensorflow之前,我一直在提供包含文件名字符串的批次,然后按批次查找相应的向量。这允许我将所有图像数据存储在~15GB中,而无需复制磁盘上的数据。
我在Tensorflow中首次尝试这样做涉及将索引存储在TFExample缓冲区中,然后执行"预处理"步骤切入相应的矩阵:
img_feat = pd.read_pickle("img_feats.pkl")
img_matrix = np.stack(img_feat)
preloaded_images = tf.Variable(img_matrix)
first_image = tf.slice(preloaded_images, [0,0], [1,4096])
但是,在这种情况下,Tensorflow不允许大于2GB的变量。所以我的下一个想法是将它分成几个变量:
img_tensors = []
for i in range(NUM_SPLITS):
with tf.Graph().as_default():
img_tensors.append(tf.Variable(img_matrices[i], name="preloaded_images_%i"%i))
first_image = tf.concat(1, [tf.slice(t, [0,0], [1,4096//NUM_SPLITS]) for t in img_tensors])
在这种情况下,我被迫将每个分区存储在一个单独的图形上,因为似乎任何一个图形都不能这么大。但是,现在concat
失败了,因为我连接的每个张量都在一个单独的图上。
关于在Tensorflow图表中加入大量(~15GB)预装的任何建议。
潜在相关的是this question;但是在这种情况下,我想用张量操作中的预处理值覆盖实际JPEG文件的解码。