我想在单个图像示例中使用函数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]
当我只对转换一个示例感兴趣时,这感觉像是一个不必要且昂贵的操作。
有没有一种不涉及重塑的简单/标准方法?
AFAIK 没有办法绕过它。似乎(在这里和这里(第一个操作创建了一个副本(如果我错了,有人纠正我(。不过,您可以使用tf.expand_dims
,由于它的冗长性,IMO 更具可读性。
另一方面,在这种情况下,从张量中获取0
元素不应该执行复制,并且几乎是免费的。
最重要的是,除了语法上的一些不便(例如 [0]
(这些操作绝对不是昂贵的,特别是在执行卷积的上下文中。
顺便说一句。其他现成的替代层,如tf.keras
中的层,也需要批处理作为第一维。