如何将TensorFlow 2D卷积(tf.nn.conv2d)应用于单个(非批处理)2D图像?

时间:2019-04-29 18:47:55

标签: python tensorflow conv-neural-network convolution

我想在单个图片示例中使用函数tf.nn.conv2d(),但是TensorFlow文档似乎只提到将这种转换应用于批量图片。

文档提到输入图像必须为[batch, in_height, in_width, in_channels]形状,内核必须为[filter_height, filter_width, in_channels, out_channels]形状。但是,用输入形状[in_height, in_width, in_channels]实现2D卷积的最直接方法是什么?

以下是当前方法的示例,其中img具有形状(高度,宽度,通道):

img = tf.random_uniform((10,10,3))  # a single image
img = tf.nn.conv2d([img], kernel)[0] # creating a batch of 1, then indexing the single example

我正在重塑输入,如下所示:

[in_height, in_width, in_channels]->[1, in_height, in_width, in_channels]->[in_height, in_width, in_channels]

当我只想转换一个示例时,这感觉像是不必要且昂贵的操作。

是否有一种简单/标准的方法来执行此操作而不涉及重塑?

1 个答案:

答案 0 :(得分:0)

AFAIK无法解决。似乎(herehere)的第一个操作创建了一个副本(如果我错了,请纠正我)。不过,您可以使用tf.expand_dims,因为它的冗长性使IMO更具可读性。

另一方面,从张量中提取0元素在这种情况下不应该执行复制,并且几乎是免费的。

最重要的,除了语法上的一些不便(例如[0]),这些操作肯定不昂贵,尤其是在进行卷积的情况下。

顺便说一句。其他tf.keras中可用的备用图层也需要将批次作为第一维。