在TensorFlow中,我有一个形状为x
的张量[batch_of_batches_size,batch_of_images_size,image_height,image_width,nchannels]
。它代表了一批批次的图像。 x
的第一个索引,我将其称为"批量索引",指向特定批次,第二个索引指向批次内的特定图像。 x
的其余三个索引代表图像本身,其尺寸为image_height
- { - 1}}和image_width
个频道。
我想对图像应用2d卷积。过滤器的高度为nchannels
,宽度为filter_height
,我想使用filter_width
填充,所有步幅等于'SAME'
。但对于每个批处理索引1
,我想应用一组不同的过滤器。过滤器张量名为i
,其形状为w
。对于每个批处理索引[batch_of_batches_size,filter_height,filter_width,nchannels,nfilters]
,我想要的是应用于图像i
过滤器x[i,:,:,:,:]
(类似于我将如何应用函数w[i,:,:,:,:]
)。我希望所有结果都保存在形状为conv2d
的张量y
中,以便此[batch_of_batches_size,batch_of_images_size,image_height,image_width,nfilters]
的结果位于i
。
数学上,我想要的是:
y[i,:,:,:,:]
除了第一个索引y[i,j,k,l,m] = SUM_{a,b,u} x[i,j,a,b,u]*w[i,k+a,l+b,u,m]
之外,这与conv2d
相同。
我想知道是否有办法在TensorFlow中使用内置函数。我知道我可以在第一维(批量索引)上使用i
循环,并在每次迭代时对for
和conv2d
的rehspaed切片使用x
。但是,是否有更简单,更有效或更优雅的方式,不需要切片和索引到张量?
我有一些但我没有找到解决方案的想法是(1)重塑\转置filters
和x
,使用w
或{{1} },然后再次重塑\ transpose。 (2)在conv2d
和depthwise_conv2d
的填充版本上使用conv3d
。
答案 0 :(得分:1)
我找到了解决方案:
y = tf.map_fn(lambda u: tf.nn.conv2d(u[0],u[1],padding='SAME',strides=[1,1,1,1]),.elems=[x,w],dtype=tf.float32)
map_fn
功能允许将conv2d
运算符应用于x
和w
的每个第一维切片。