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

问题描述 投票:1回答:1

我想在单个图像示例中使用函数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]

当我只想转变一个例子时,这感觉就像一个不必要的和昂贵的操作。

是否有一种简单/标准的方法可以做到这一点,不涉及重塑?

python tensorflow conv-neural-network convolution
1个回答
0
投票

AFAIK没有办法绕过它。似乎(herehere)第一个操作创建了一个副本(如果我错了,有人会纠正我)。你可以使用tf.expand_dims,因为它的冗长,它的IMO更具可读性。

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

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

BTW。其他现成的替代层,如tf.keras中的那些,也需要批量作为第一维。

© www.soinside.com 2019 - 2024. All rights reserved.