我正在使用Tensorflow构建标准图像分类模型.为此,我有输入图像,每个图像都分配有一个标签({0,1}中的数字).因此,可以使用以下格式将数据存储在列表中:
/path/to/image_0 label_0
/path/to/image_1 label_1
/path/to/image_2 label_2
...
Run Code Online (Sandbox Code Playgroud)
我想使用TensorFlow的排队系统来读取我的数据并将其提供给我的模型.忽略标签,可以通过使用string_input_producer和轻松实现这一点wholeFileReader.这里的代码:
def read_my_file_format(filename_queue):
reader = tf.WholeFileReader()
key, value = reader.read(filename_queue)
example = tf.image.decode_png(value)
return example
#removing label, obtaining list containing /path/to/image_x
image_list = [line[:-2] for line in image_label_list]
input_queue = tf.train.string_input_producer(image_list)
input_images = read_my_file_format(input_queue)
Run Code Online (Sandbox Code Playgroud)
但是,标签在该过程中丢失,因为图像数据被有意地作为输入管道的一部分混洗.通过输入队列将标签与图像数据一起推送的最简单方法是什么?
我想在TensorFlow中使用此功能,但它在3D张量而不是4D张量上运行:我有一个外部维度为batch_size.
tf.image.random_flip_left_right(input_image_data)
Run Code Online (Sandbox Code Playgroud)
也就是说,这个函数需要一个形状的张量(图像):
(width, height, channels)
Run Code Online (Sandbox Code Playgroud)
但我有多个图像,如:
(batch_size, width, height, channels)
Run Code Online (Sandbox Code Playgroud)
我怎样才能将随机翻转函数映射到我的批量大小的每个图像中,并获得具有我已经拥有的相同4D形状的张量作为输出?
我的猜测是它需要在函数入口处重新整形并在函数之后重新整形,但我不确定这是否会破坏数据的结构并在应用镜像时将批处理中的图像混合在一起.此外,这种方法可以在整个批次上进行单个随机化,而不是在每个图像的基础上进行.
任何建议表示赞赏!
python machine-learning image-processing computer-vision tensorflow
Tensorflow具有大量的变换,可以应用于表示图像([高度,宽度,深度])的3D张量,例如tf.image.rot90()或者tf.image.random_flip_left_right().
我知道它们意味着与队列一起使用,因此它们只能在一个图像上运行.
但是有没有办法对ops进行矢量化以将4D张量([batch_size,height,width,depth])转换为相同尺寸张量,并且沿着第一维应用图像,而不用明确地循环它们tf.while_loop()?
(编辑:关于rot90()从numpy rot90采取的聪明的黑客将是:
rot90=tf.reverse(x,tf.convert_to_tensor((False,False,True,False)))
rot90=tf.transpose(rot90,([0,2,1,3])
Run Code Online (Sandbox Code Playgroud)
编辑2:事实证明这个问题已经被回答了很多次(一个例子),map_fn如果你想要一个优化的版本,它似乎是要走的路.我已经看过了,但我已经忘记了.我想这会让这个问题重复......
然而,对于随机op或更复杂的op,有一个通用方法来矢量化现有函数会很好...)