1x1 卷积。数学是如何工作的?

数据挖掘 机器学习 卷积 卷积神经网络
2021-10-07 03:08:44

所以我偶然发现了 Andrew Ng课程1X1卷积。在那里,他解释说你可以使用1X1X192卷积来缩小它。

但是当我这样做时:

input_ = torch.randn([28, 28, 192])
filter = torch.zeros([1, 1, 192])

out = torch.mul(input_,filter)

我显然得到28X28X192矩阵。那么如何缩小呢?

只需添加每个的结果1X1X192*1X1X192内核结果?所以我会得到一个28X28X1矩阵?

1个回答

让我们回到正常的卷积:假设你有一个 28x28x3 的图像(3 = R,G,B)。

我不使用torch,而是使用keras,但我认为该原则适用。

当您应用 2D 卷积并传递过滤器的大小(例如 3x3)时,框架会将您的过滤器从 3x3 调整为 3x3x 3最后3个是由于图像的部门。

同样的情况发生在,在使用 100 个过滤器的第一层卷积之后,您获得大小为 28x28x100 的图像,在第二个卷积层您只决定过滤器的前两个维度,比如说 4x4。相反,框架应用尺寸为 4x4x100 的过滤器!

因此,回答您的问题,如果您将 1x1 卷积应用于 28x28x100,则传递k的过滤器数量。您获得尺寸为 28x28x k的激活图(结果) 。

这就是 Ng 建议的收缩。

再次完全回答您的问题,数学很简单,只需使用 3D 过滤器应用卷积理论即可。过滤器和图像之间重叠元素的乘积之和。

Edit: Simple example

我将向您展示一个简单的示例,说明在M之间的深度卷积过程中发生的操作,这是一个维度 ( z = 2, x =2, y =2) 的张量,您可以将z视为您想要的k缩小到1W,尺寸为 (2, 1, 1) 的过滤器。您必须使用循环实现自己的函数来操作过滤器的步幅。

import numpy as np

M = np.array([[[1, 2],[3, 4]], [[5, 6],[7, 8]]])
W = np.array([[[2.]],[[3.]]])

C = np.ones(shape=(2, 2))

c[0,0] = np.sum(M[:, 0, 0]*w.T)
c[0,1] = np.sum(M[:, 0, 1]*w.T)
c[1,0] = np.sum(M[:, 1, 0]*w.T)
c[1,1] = np.sum(M[:, 1, 1]*w.T)

在此处输入图像描述