从Tensorflow中的图像列表中提取批次

时间:2017-12-21 10:03:11

标签: python image tensorflow training-data

我有一个图像列表(尝试使用自定义图像训练CNN模型),由以下内容定义和重塑:

reader.images = tf.reshape(self.images, [-1, 256, 256, 3])

打印哪些:

reader.Images :
[[[[ 127.  255.  127.]
   [ 140.  255.  114.]
   [ 217.  255.   38.]
  ..., 
  [[ 255.  240.    0.]
   [ 255.  241.    0.]
   [ 249.  246.    6.]
   ..., 
   [ 203.  237.   52.]
   [ 152.  251.  102.]
   [ 143.  253.  111.]]

  [[ 255.  184.    0.]
   [ 248.  192.    7.]
   [ 205.  242.   50.]
   ..., 
   [ 255.  139.    0.]
   [ 255.  171.    0.]
   [ 255.  177.    0.]]

  [[ 255.  178.    0.]
   [ 237.  187.   18.]
   [ 131.  240.  124.]
   ..., 
   [ 255.  123.    0.]
   [ 255.  156.    0.]
   [ 255.  162.    0.]]]]

我想通过每次迭代提取一批来训练我的模型。但是当我使用时:

image_batch = tf.train.batch(
        [reader.images], batch_size=batch_size, dynamic_pad=True)

batch_size =1

我将整个图像作为输出(与上面打印的整个列表图像相同)。 我是Tensorflow的新手,所以欢迎任何提示。

1 个答案:

答案 0 :(得分:1)

简答:

根据您的要求,您应添加enqueue_many=True

答案很长:

tf.train.batch通常用于从单个项目张量创建批处理,例如来自队列。

所以你可以用图像张量([256,256,3])来提供它并获得批量张量([batch_size,256,256,3])。

它通常不用于从列表张量中分割批次。如果您以这种方式使用它,那么您必须将所有图像加载到内存中,而这些图像的扩展性不会很高。

至少是默认值enqueue_many=False

  

如果enqueue_many为False,则假定张量代表单个   例。具有形状[x,y,z]的输入张量将作为a输出   张量与形状[batch_size,x,y,z]。

如果您确实要将所有图片加载到内存中,可以将enqueue_many=True添加到tf.train.batch来电。

  

如果enqueue_many为True,则假定张量代表一批   示例,其中第一个维度通过示例索引,以及所有   张量的成员在第一维中应具有相同的大小。   如果输入张量具有形状[*,x,y,z],则输出将具有形状   [batch_size,x,y,z]。 capacity参数控制了多长时间   允许预取会使队列增长。

我建议阅读https://www.tensorflow.org/programmers_guide/datasets以获得进一步的指导(现在记录使用数据集而不是之前推荐的队列的新推荐方法 - 您可以直接从数据集创建批处理而不是调用tf.train.batch)