3 minute read

我真的是出离愤怒。我不知道最开始把 convolution 看做 dot product 的人是怎么想的!有 convolution 的公式不用,非要用这么蹩脚的 intuition?而且明显 convolution 和 Hadamard product 的关系更大一点呢,咋没见人提?

本文主要参考:

1-D ConvolutionPermalink

首先 convolution 不是限定于 matrix 间、也不是限定于 tensor 间的运算,它其实是两个 functions 之间的运算:

(fg)(t)=Δf(τ)g(tτ)dτ

在 engineering 领域也有 f(t)g(t) 的写法。

因为 (fg)(t)=(gf)(t),所以也可以有:

(fg)(t)=Δf(tτ)g(τ)dτ

物理上的一个 intuition 是:if signal f(t) is applied to an LTI (linear time-invariant) system with impluse response g(t), the final output is f(t)g(t).

For complex-valued functions f, g defined on Z, the discrete convolution of f and g is:

(fg)(n)=mf(m)g(nm)

2-D ConvolutionPermalink

一般有:

(fg)(x,y)=f(σ,τ)g(xσ,yτ)dσdτ

如果 f, g 是 discrete functions,则有:

(fg)(x,y)=στf(σ,τ)g(xσ,yτ)

Matrix 2-D Convolution for Image Processing / Image & KernelPermalink

如果我们把 matrix A 看做其自身 indice 的函数 (所以自然是 discrete 的函数) (而不是把 matrix A 看做是关于 vector x 的函数),比如最基本的:

A(i,j)=Ai,j

where 0i<m,0j<n. 那么两个 matrice 也可以做 convolution (以下下标都从 0 记起)。

但是要注意在 image processing 领域,这个 matrix 的函数式写法没有这么简单。一般有一个 image matrix AmA×nA,一个 kernel matrix KmK×nKmK<mA,nK<nA。然后我们有函数:

fA(i,j)=AmK+i,nK+jfK(i,j)=Ki,jHV=KmKi,nKj

where KHV=JKJ and J is the anti-diagonal “identity” matrix (或者看成是 row-reversed identity matrix) like [0110].

  • JK 的作用是将 K 上下翻转 (horizontally flip)
  • KJ 的作用是将 K 左右翻转 (vertically flip)

如果有 matrix C=fAfK,那么有:

C(i,j)=ijfK(i,j)fA(ii,jj)=ijKmKi,nKjAmKi+i,nKj+j
  • 注意,如果下标从 1 开始计的话,上面的下标都要 +1
  • 另外,参考 kernel method 的思想,实际应用中我们并不需要构造 fAfK,直接写出 C(i,j)=ijK?,?A?,? 的形式拿来用就好了

考虑个具体的例子,假设 K2×2,A3×3,则 C=(fAfK) 有:

C(0,0)=ijK2i,2jA2i,2j=K0,0A0,0+K0,1A0,1+K1,0A1,0+K1,1A1,1C(0,1)=ijK2i,2jA2i,3j=K0,0A0,1+K0,1A0,2+K1,0A1,1+K1,1A1,2C(1,0)=ijK2i,2jA3i,2j=K0,0A1,0+K0,1A1,1+K1,0A2,0+K1,1A2,1C(1,1)=ijK2i,2jA3i,3j=K0,0A1,1+K0,1A1,2+K1,0A2,1+K1,1A2,2

这个例子给出了一个很直观的 intuition:

  1. 把 kernel K 覆盖在 image A 之上,K0,0 对齐到 A0,0 (左上角对齐)
  2. 移动 kernel K 使 K0,0 对齐到 Ai,j,假设覆盖到的 image A 的部分是 Ai:i+mK,j:j+nK
  3. 那么 C(i,j)=sum(KAi:i+mK,j:j+nK) (sum of Hadamard product)
    • 我再次强调一遍,这不是 dot product!

很明显我们可以把 C 看做一个 matrix Ci,j=C(i,j)。最后考虑下这个 matrix C 的 size:

0i<mK0j<nK0mKi+i<mA0mKi+i<nA

进而有:

0i<mAmK0j<nAnK

所以 matrix C 最大的 size 只可能是 (mAmK+1)×(nAnK+1)

Categories:

Updated:

Comments