首页 文章

Tensorflow:从图像张量列表中创建批处理

提问于
浏览
2

我有一个函数 get_image(...) ,它对我的输入图像执行预处理 . 我在列表中收集属于同一批次的所有图像,如下所示:

batch = [get_image(file_path) for file_path in batch_files]

现在我想将此列表转换为单个张量,第一个维度是批量大小维度,这样我就可以将它提供给网络的输入占位符 .

_ = self.sess.run([loss],feed_dict={ input_placeholder: batch })

知道我怎么能这样做吗?

batch_concat = tf.placeholder(shape=[None] + self.image_shape, dtype=tf.float32) 
            for i in xrange(0,self.batch_size):
                if i == 0:
                    tmp_batch = tf.expand_dims(batch[i], 0)
                    batch_concat = tmp_batch
                else:
                    tmp_batch = tf.expand_dims(batch[i], 0)                        
                    batch_concat = tf.concat(0, [batch_concat, tmp_batch])

当我尝试连接所有张量时,我收到以下错误:

TypeError: The value of a feed cannot be a tf.Tensor object. Acceptable feed values include Python scalars, strings, lists, or numpy ndarrays.

那么也许将张量转换回一个numpy数组就足够了,然后才能将它提供给网络?

3 回答

  • 0

    您可以使用tf.pack将批量列表打包到批次中 .

    image_list = [get_image(file_path) for file_path in batch_files]
    image_batch = tf.pack(image_list)
    

    您还可以使用tf.concat沿第一个维度连接列表并重新整形 .

  • 0

    在TF r1.1包中已被替换为tf.stack

  • 0

    这里的问题是使用张量作为feed_dict中的值 . 而不是将 batch 作为input_placeholder的值,为什么不使用 batch 而不是 input_placeholder ,假设 batch 是您的批量张量?

    所以,而不是:

    input_placeholder = tf.Placeholder(tf.int32)
    loss = some_function(input_placeholder)
    sess.run(loss, feed_dict={input_placeholder: batch})
    

    做:

    loss = some_function(batch)
    sess.run(batch)
    

相关问题