我目前正在研究论文FCNN: Fourier Convolutional Neural Networks。该论文的主要贡献是CNN训练完全转移到傅里叶域而不损失有效性。建议的架构如下所示:
作者指出,实现是在 keras 中完成的,但是,它不是公开的。我知道我可以通过以下方式定义傅立叶变换:
model.add(layers.Lambda(lambda v: tf.real(tf.spectral.rfft(v))))
但这不是傅立叶卷积,对吧?我应该怎么从这里走?
我目前正在研究论文FCNN: Fourier Convolutional Neural Networks。该论文的主要贡献是CNN训练完全转移到傅里叶域而不损失有效性。建议的架构如下所示:
作者指出,实现是在 keras 中完成的,但是,它不是公开的。我知道我可以通过以下方式定义傅立叶变换:
model.add(layers.Lambda(lambda v: tf.real(tf.spectral.rfft(v))))
但这不是傅立叶卷积,对吧?我应该怎么从这里走?
基于 FFT 的卷积可以分为 3 个部分:输入图像和过滤器的 FFT,一堆元素乘积,然后是输入通道的总和,然后是输出的 IFFT ( Source )。
或者如论文中所写:
因此,对于傅立叶卷积层,您需要:
input_fft = tf.spectral.rfft2d(input)
获取每个内核并将其转换为傅立叶域:
weights_fft = tf.spectral.rfft2d(layer.get_weights())
注意:输入的傅立叶域“图像”和内核需要具有相同的大小。
在输入的傅里叶变换和每个内核的傅里叶变换之间执行逐元素乘法:
conv_fft = keras.layers.Multiply(input_fft, weights_fft)
layer_output = tf.spectral.irfft2d(conv_fft)
注意:我使用了伪代码,它可能需要一些调整才能真正工作。