卷积神经网络中的傅里叶变换:1024x1024 的傅里叶卷积
卷积神经网络 (CNN) 得到了广泛的应用并且事实证明他是非常成功的。但是卷积的计算很低效,滑动窗口需要很多计算并且限制了过滤器的大小,通常在 [3,3] 到 [7,7] 之间的小核限制了感受野(最近才出现的大核卷积可以参考我们以前的文章),并且需要许多层来捕获输入张量的全局上下文(例如 2D 图像)。图像越大小核的的表现就越差。这就是为什么很难找到处理输入高分辨率图像的 CNN模型。
有一种方法可以将核大小扩展到 [1024,1024] 及以上,并且这种方法可以增加给定输入分辨率的核大小并且对推理时间几乎没有影响,还可以大幅降低特征图的空间维度,并且不会丢失几乎任何信息,你相信吗?
所有这些特征都基于一个简单的数学性质:傅里叶变换的卷积定理(准确地说是互相关定理)
卷积的问题
让我们回顾一些基础知识。卷积是应用于两个函数的数学运算。让我们从一维案例开始:
连续一维卷积
离散一维卷积
换句话说:取两个信号,保留一个然后围绕坐标轴翻转另一个信号。将固定信号上的翻转信号从负无穷移动到正无穷(或直到信号的所有非零部分都已重叠)。对于每一步计算元素乘积并对所有值求和。结果值就是此步骤的卷积结果。
但是为什么我之前提到了互相关呢?那是因为卷积和互相关实际上是相以同的方式计算的,唯一的区别是过滤器(核)被翻转了。这由不同的符号表示:
TensorFlow 和 PyTorch 实际上是在计算输入信号和可学习卷积核的互相关,而不是卷积本身。由于卷积核是由网络学习的,因此卷积核是否翻转并不重要。网络会自己弄清楚什么是最好的结果。框架甚至可以节省一些计算而不进行翻转操作。但是有一个区别,如果卷积核是固定的,当你加载一个训练好的模型时,应该知道它是使用互相关还是卷积训练的,因为需要知道最终是否翻转的权重。
上面说的主要总结为两个问题:
- 计算输出序列中的单个点需要进行大量计算。
- 输入信号越大(即图像的分辨率越高),核必须更频繁地移动,因此需要更多的计算。同样适用于大核。
更多的计算意味着更多的内存和更大的计算延迟。CNN在较低的输入分辨率和更小的过滤器。更少的像素意味着更少的细节,更小的过滤器会导致更小的感受野。网络需要有多个连续的卷积层,以增加感受野。网络变得更深,这再次在训练期间带来了新的挑战。
二维离散傅里叶变换
从数学上讲,时间变量 t 的实数或复数函数 x(t) 的傅里叶变换是实数频率变量 f 的复数函数 X(f):
完整文章:
https://avoid.overfit.cn/post/503f3087e31c4b8fa6b53fee007559a0