如何在 keras 中实现傅里叶卷积层?

数据挖掘 喀拉斯 美国有线电视新闻网
2021-10-01 11:41:57

我目前正在研究论文FCNN: Fourier Convolutional Neural Networks该论文的主要贡献是CNN训练完全转移到傅里叶域而不损失有效性。建议的架构如下所示:

在此处输入图像描述

作者指出,实现是在 keras 中完成的,但是,它不是公开的。我知道我可以通过以下方式定义傅立叶变换:

model.add(layers.Lambda(lambda v: tf.real(tf.spectral.rfft(v))))

但这不是傅立叶卷积,对吧?我应该怎么从这里走?

1个回答

基于 FFT 的卷积可以分为 3 个部分:输入图像和过滤器的 FFT,一堆元素乘积,然后是输入通道的总和,然后是输出的 IFFT ( Source )。

或者如论文中所写:

在此处输入图像描述

因此,对于傅立叶卷积层,您需要:

  1. 取输入层并将其转换为傅里叶域: input_fft = tf.spectral.rfft2d(input)
  2. 获取每个内核并将其转换为傅立叶域: weights_fft = tf.spectral.rfft2d(layer.get_weights()) 注意:输入的傅立叶域“图像”和内核需要具有相同的大小。

  3. 在输入的傅里叶变换和每个内核的傅里叶变换之间执行逐元素乘法: conv_fft = keras.layers.Multiply(input_fft, weights_fft)

  4. 执行傅里叶逆变换回到空间域。 layer_output = tf.spectral.irfft2d(conv_fft)

注意:我使用了伪代码,它可能需要一些调整才能真正工作。