文档链接,原文 16×9 的矩阵有一处写错了。
CNN 的卷积是执行了 w′i,j=∑x,ywi+x,j+y×Cx,y,有人认为每次平移卷积核,运算量很大,又是乘法又是加法。
现在我们把 wx,y 展开形成一个 [n×m,1] 的向量 V,然后构造一个大小为 [(n+1)×(m+1),n×m] 矩阵 P 使得 X=PV 得到的 X 压缩成 [n+1,m+1] 矩阵之后取右下部分能得到正确的 w′
虽然我感觉变成矩阵乘向量之后运算更多了啊。
这个矩阵 P 可以通过把 teoplitz 矩阵拼起来得到(或者说叫做 doubly block matrix,那么先给出一个 teoplitz 矩阵的示例:
⎛⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜⎝a0a−1a−2⋯⋯⋯a−(N−1)a1a0a−1a−2⋮a2a1a0a−1⋮⋮⋱⋱⋱⋱⋱⋮⋮⋱a0a−1a−2⋮a1a0a−1aM−1⋯⋯⋯a2a1a0⎞⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟⎠
不难发现:ai,j=Vi−j,所以说该矩阵也可以被压缩成一个向量。上面提到了,doubly block teoplitz 矩阵是由若干块 teoplitz 矩阵拼起来的,即现有若干大小相同的 teoplitz matrix A−(M−1),…AN−1,那么一个 doubly block teoplitz 矩阵可以如下:
⎛⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜⎝A0A−1A−2⋯⋯⋯A−(N−1)A1A0A−1A−2⋮A2A1A0A−1⋮⋮⋱⋱⋱⋱⋱⋮⋮⋱A0A−1A−2⋮A1A0A−1AM−1⋯⋯⋯A2A1A0⎞⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟⎠.
注意无论是 teoplitz 矩阵还是拼起来的新矩阵,我们都不要求它是方阵,或者说,只要满足 ai,j=Vi−j 即可
记卷积核为(k1,1k1,2k2,1k2,2) ,我们将卷积核展开成一个大小 [n+1,m+1] 的矩阵 K=⎛⎜
⎜
⎜
⎜⎝k2,2k2,100k1,2k1,10000000000⎞⎟
⎟
⎟
⎟⎠,左上角把卷积核中心对称了,剩下的全是 0
取出它的所有列向量,展开成一个 teoplitz 矩阵:
F0=⎛⎜
⎜
⎜⎝k2200k21k2200k21k2200k21⎞⎟
⎟
⎟⎠F1=⎛⎜
⎜
⎜⎝k1200k11k1200k11k1200k11⎞⎟
⎟
⎟⎠F2=F3=⎛⎜
⎜
⎜⎝000000000000⎞⎟
⎟
⎟⎠
然后把这些碎片拼成:
F=⎛⎜
⎜
⎜⎝F0F3F2F1F0F3F2F1F0F3F2F1⎞⎟
⎟
⎟⎠
第一列是依次 F0…F3,右上角你可以理解成把矩阵接到下面再让对角线延申得到的。
不妨假设你现在的二位图片大小为 3×3,把它展开成一个大小为 [9,1] 的向量,于是我们通过
⎛⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜⎝k2200000000k21k2200000000k21k2200000000k21000000k1200k2200000k11k120k21k2200000k11k120k21k2200000k1100k21000000k1200k2200000k11k120k21k2200000k11k120k21k2200000k1100k21000000k1200000000k11k1200000000k11k1200000000k11⎞⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟⎠⋅⎛⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜⎝i11i12i13i21i22i23i31i32i33⎞⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟⎠
得到卷积结果,新向量大小是 [16,1],理论上是取右下角。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律