首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我们能在角点上使用tf.spectral傅里叶函数吗?

我们能在角点上使用tf.spectral傅里叶函数吗?
EN

Stack Overflow用户
提问于 2018-04-24 21:25:48
回答 3查看 5.8K关注 0票数 9

让我们从一个输入开始,这是一个简单的时间序列,并尝试构建一个自动编码器,简单的傅立叶变换,然后取消我们的数据转换角。

如果我们尝试这样做:

代码语言:javascript
复制
inputs = Input(shape=(MAXLEN,1), name='main_input')
x = tf.spectral.rfft(inputs)
decoded = Lambda(tf.spectral.irfft)(x)

然后第三行在输入时抛出一个错误:

代码语言:javascript
复制
>> ValueError: Tensor conversion requested dtype complex64 for Tensor with dtype float32

你看,tf.spectral.irfft的输出是float32,但是看起来Lambda认为它是complex64?(Complex64是上一步的输入x)

我们可以通过以下方法在模型输入时修复该错误:

代码语言:javascript
复制
inputs = Input(shape=(MAXLEN,1), name='main_input')
x = tf.spectral.rfft(inputs)
decoded = Lambda(tf.cast(tf.spectral.irfft(x),dtype=tf.float32)))

这在输入时被接受,但是当我们试图构建模型时:

代码语言:javascript
复制
autoencoder = Model(inputs, decoded)

它生成错误:

代码语言:javascript
复制
TypeError: Output tensors to a Model must be Keras tensors. Found: <keras.layers.core.Lambda object at 0x7f24f0f7bbe0>

我想这是合理的,也是我一开始不想投的原因。

主要问题:如何成功包装输出float32的float32函数?

关于学习的更普遍的问题:假设我实际上想在rfft和irfft之间做一些事情,我如何才能在不破坏角角的情况下将那些虚数转换成绝对值,这样我就可以应用各种卷积等等?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-04-26 16:53:14

我认为您只需要更多的Lambda包装(使用tf.keras,因为这是我安装的):

代码语言:javascript
复制
import numpy
import tensorflow as tf
K = tf.keras

inputs = K.Input(shape=(10, 8), name='main_input')
x = K.layers.Lambda(tf.spectral.rfft)(inputs)
decoded = K.layers.Lambda(tf.spectral.irfft)(x)
model = K.Model(inputs, decoded)
output = model(tf.ones([10, 8]))
with tf.Session():
  print(output.eval())

irfft的输出应该是真实的,所以可能不需要转换它。但是,如果您确实需要转换它(或者通常需要在Lambda层中组合操作),我会将其封装在Python:K.layers.Lambda(lambda v: tf.cast(tf.spectral.whatever(v), tf.float32))

例如,如果您知道您的中间值(在rfftirfft之间)将有一个虚分量为零,您可以截断它:

代码语言:javascript
复制
import numpy
import tensorflow as tf
K = tf.keras

inputs = K.Input(shape=(10, 8), name='main_input')
x = K.layers.Lambda(lambda v: tf.real(tf.spectral.rfft(v)))(inputs)
decoded = K.layers.Lambda(
    lambda v: tf.spectral.irfft(tf.complex(real=v, imag=tf.zeros_like(v))))(x)
model = K.Model(inputs, decoded)
output = model(tf.reshape(tf.range(80, dtype=tf.float32), [10, 8]))
with tf.Session():
  print(output.eval())

请注意,对于一般序列,这不是正确的,因为即使是实值输入,一旦转换,也可以有假想的分量。它适用于上面的tf.ones输入,但是tf.range输入出现了故障:

代码语言:javascript
复制
[[ 0.  4.  4.  4.  4.  4.  4.  4.]
 [ 8. 12. 12. 12. 12. 12. 12. 12.]
 [16. 20. 20. 20. 20. 20. 20. 20.]
 [24. 28. 28. 28. 28. 28. 28. 28.]
 [32. 36. 36. 36. 36. 36. 36. 36.]
 [40. 44. 44. 44. 44. 44. 44. 44.]
 [48. 52. 52. 52. 52. 52. 52. 52.]
 [56. 60. 60. 60. 60. 60. 60. 60.]
 [64. 68. 68. 68. 68. 68. 68. 68.]
 [72. 76. 76. 76. 76. 76. 76. 76.]]

(没有铸造,我们得到0。到79岁。重建完美)

票数 8
EN

Stack Overflow用户

发布于 2019-04-13 10:16:30

当我试图解决同样的问题时,我偶然发现了这个问题。您可以通过将tf.realtf.imag封装到Lambda层(我使用的是stft,因为没有真正的值等效)来实现转换的无损:

代码语言:javascript
复制
x = tf.keras.layers.Lambda(
    lambda v: tf.signal.stft(
        v,
        frame_length=1024,
        frame_step=256,
        fft_length=1024,
    ), name='gen/FFTLayer')(inputs)
real = tf.keras.layers.Lambda(tf.real)(x)
imag = tf.keras.layers.Lambda(tf.imag)(x)
...
# transform real and imag either separately or by concatenating them in the feature space.
...
x = tf.keras.layers.Lambda(lambda x: tf.complex(x[0], x[1]))([real, imag])
x = tf.keras.layers.Lambda(
    lambda v: tf.signal.inverse_stft(
        v,
        frame_length=1024,
        frame_step=256,
        fft_length=1024,
    ))(x)
票数 2
EN

Stack Overflow用户

发布于 2018-05-03 18:32:52

只是想为任何从搜索引擎获得信息的人提供更多的信息。下面是在这次谷歌小组讨论中提供的,它将运行rfft,然后使用卷积和其他层在中间运行ifft:

代码语言:javascript
复制
inputs = Input(shape=(10, 8), name='main_input')
x = Lambda(lambda v: tf.to_float(tf.spectral.rfft(v)))(inputs)
x = Conv1D(filters=5, kernel_size=3, activation='relu', padding='same')(x)
x = Lambda(lambda v: tf.to_float(tf.spectral.irfft(tf.cast(v, dtype=tf.complex64))))(x)
x = Flatten()(x)
output = Dense(1)(x)
model = Model(inputs, output)
model.summary()

它使用与Allen的答案相同的概念,但细微的差异允许与中间卷积兼容。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50010929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档