TensorFlow:将一批批次的过滤器应用于一批批次的图像

时间:2017-09-06 01:19:44

标签: tensorflow

在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循环,并在每次迭代时对forconv2d的rehspaed切片使用x。但是,是否有更简单,更有效或更优雅的方式,不需要切片和索引到张量?

我有一些但我没有找到解决方案的想法是(1)重塑\转置filtersx,使用w或{{1} },然后再次重塑\ transpose。 (2)在conv2ddepthwise_conv2d的填充版本上使用conv3d

1 个答案:

答案 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运算符应用于xw的每个第一维切片。