如何卷积1xW并仅减小宽度?

时间:2018-01-05 07:01:36

标签: tensorflow deep-learning conv-neural-network convolution dimensionality-reduction

给定一个量[2, 2W, C],在应用2x2窗口和步幅2的池后,我现在离开了[1, W, C](高度= 1px,宽度=以前的一半,channels =保持不变。

我现在要做的是应用卷积操作,其唯一目的是减小宽度尺寸。这甚至可能吗?

1 个答案:

答案 0 :(得分:1)

是的,这是可能的(尽管因为它不寻常,解决方案有点hackish)。

从概念上来说,这里没有问题。这通常在深度/通道维度而不是宽度中完成,人们通常将其称为1x1卷积。同样,唯一的目的是减少维数。一篇关于它的好文章是http://iamaaditya.github.io/2016/03/one-by-one-convolution/(很清楚,我不是那个博客的作者)。也就是说,典型的1x1转化层实际上是一组大小为D2的{​​{1}}过滤器,并且1x1xD实现了维数降低。在这里,您需要相同但宽度相同的内容:D2 < D过滤器大小,1xWx1次。从概念上讲,那就是它;它应该很容易。

实际上当然,这并不是那么容易,因为在CNNs惯例中对宽度和深度的处理方式不同:一个在宽度上卷积,但过滤器总是在整个深度堆栈上运行;使1x1卷积更容易深入,但宽度很棘手。 W2中至少有两个选项:

  1. 使用没有零填充的全宽度过滤器

    tensorflow

    这样tf.nn.conv2d(input,filter,strides,padding="VALID",...) (如filter_width = W)。然后,您可以创建其中的几个,从而获得所需的输出信息。 Pro :这考虑了堆栈的整个宽度,因此可以作为典型(深度)1x1卷积的等效意义上的降维。 Con :这会将您的宽度信息移动到深度堆栈(每个过滤器的宽度为1,因此您的&#34;缩小&#34;尺寸不在宽度中,而是在深度中。这几乎肯定是不可取的。你可以[filter_height, filter_width, in_channels, out_channels]你的出路,但是很糟糕。

  2. 使用步幅来完成此任务

    tf.reshape

    其中tf.nn.conv2d(input, filter, [1,1,2,1],padding="VALID",...) 已指定为strides,您指定[1,1,2,1]其中filter。这将使您的宽度尺寸减小2(或3或任何其他均匀划分宽度的因子),使用与您的滤镜宽度匹配的步幅(以及将生效0的临界零填充)。 Pro 这是干净的,可以生成您想要的数据大小,而不会产生上述重塑烦恼。 Con 这并不是通常意义上的1x1卷积/降维。它成对地减小尺寸(每两个相邻尺寸变成一个),将所有尺寸混合在一起。这不是一个很好的降维方法,所以你可能会失去很多信号。可能你应该试试这个,因为它更清洁,但是要预先警告这个问题。