【发布时间】:2019-04-27 02:02:51
【问题描述】:
让我们从一个简单的时间序列的输入开始,并尝试构建一个自动编码器,它可以简单地进行傅里叶变换,然后在 keras 中取消变换我们的数据。
如果我们尝试这样做:
inputs = Input(shape=(MAXLEN,1), name='main_input')
x = tf.spectral.rfft(inputs)
decoded = Lambda(tf.spectral.irfft)(x)
然后第三行输入的时候报错:
>> ValueError: Tensor conversion requested dtype complex64 for Tensor with dtype float32
你看,tf.spectral.irfft 的输出是 float32 但看起来 Lambda 认为它是 complex64? (Complex64 是上一步的输入 x)
我们可以在模型输入时修复该错误:
inputs = Input(shape=(MAXLEN,1), name='main_input')
x = tf.spectral.rfft(inputs)
decoded = Lambda(tf.cast(tf.spectral.irfft(x),dtype=tf.float32)))
这在输入时被接受,但是当我们尝试构建模型时:
autoencoder = Model(inputs, decoded)
它会产生错误:
TypeError: Output tensors to a Model must be Keras tensors. Found: <keras.layers.core.Lambda object at 0x7f24f0f7bbe0>
我认为这是合理的,也是我一开始不想投射它的原因。
主要问题:如何成功包装输出 float32 的 tf.spectral.irfft 函数?
更一般的学习问题: 假设我实际上想在 rfft 和 irfft 之间做点什么,如何在不破坏 keras 的情况下将这些虚数转换为绝对值,以便应用各种卷积等?
【问题讨论】:
标签: python tensorflow keras