【问题标题】:tf.signal.rfft2d output shape?tf.signal.rfft2d 输出形状?
【发布时间】:2020-09-26 01:28:42
【问题描述】:

目前我正在努力实现Fourier CNN

对我来说第一步是了解real fourier transform生成的输出形状。

我在下面有一些代码sn-ps:

input = Input(shape=(150, 150, 3))
f = Lambda(lambda x: tf.signal.rfft2d(x))(input)
print(f.shape, f.dtype)
# > (None, 150, 150, 2) <dtype: 'complex64'>

最后一个维度:2 来自哪里?输出不应该仍然有三个通道导致 (None, 150, 150, 3) 吗?

我尝试了另一个 fft_length,看看它是否能为我带来一些启示,但它让我比开始时更加困惑


input = Input(shape=(150, 150, 3))
f = Lambda(lambda x: tf.signal.rfft2d(x, fft_length=[100, 100]))(input)
print(f.shape, f.dtype)
# > (None, 150, 100, 51) <dtype: 'complex64'>

我的问题主要是: 形状 (None, 150, 150, 2) 是从哪里来的?

作为奖励,我也很想了解为什么第二个代码 sn-p 会导致 (None, 150, 100, 51)

谢谢!

【问题讨论】:

  • 嗨卢克,2 来自 3/2+1 请参阅文档中的以下引用:由于真实信号的 DFT 是厄米对称的,RFFT2D 仅返回 fft_length / 2 + 1 唯一输出最内维的 FFT 分量:零频率项,然后是 fft_length / 2 个正频率项。 tensorflow.org/api_docs/python/tf/signal/rfft2d

标签: tensorflow machine-learning deep-learning signal-processing fft


【解决方案1】:

我已经通过一些额外的测试解决了我的问题。

您似乎需要确保其他频道必须位于最内层。我已经能够让上面的代码进行以下修改:

def fft_on_axis(x):
    x = tf.transpose(x, perm=[0, 3,  1, 2],)
    x_fft = tf.signal.rfft2d(x)
    result = tf.transpose(x_fft, perm=[0, 2, 3, 1])
    return result

i = Input(shape=(150, 150, 3), name='Input')
x = Lambda(fft_on_axis, name='fft2d')(i)
print(x.shape)
> (None, 150, 76, 3)

这符合我对文档的期望!第二维上的 fft_length 被减半加上零频率项。

【讨论】:

    猜你喜欢
    • 2012-03-28
    • 2019-07-04
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-01
    • 1970-01-01
    相关资源
    最近更新 更多