所以我偶然发现了 Andrew Ng的课程卷积。在那里,他解释说你可以使用卷积来缩小它。
但是当我这样做时:
input_ = torch.randn([28, 28, 192])
filter = torch.zeros([1, 1, 192])
out = torch.mul(input_,filter)
我显然得到矩阵。那么如何缩小呢?
只需添加每个的结果内核结果?所以我会得到一个矩阵?
所以我偶然发现了 Andrew Ng的课程卷积。在那里,他解释说你可以使用卷积来缩小它。
但是当我这样做时:
input_ = torch.randn([28, 28, 192])
filter = torch.zeros([1, 1, 192])
out = torch.mul(input_,filter)
我显然得到矩阵。那么如何缩小呢?
只需添加每个的结果内核结果?所以我会得到一个矩阵?
让我们回到正常的卷积:假设你有一个 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缩小到1和W,尺寸为 (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)