让我们从一个简单的时间序列开始,并尝试在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>
我想这是合理的,这也是我一开始不想投它的原因。
主要问题:如何成功地包装tf.spectral.irfft函数,该函数输出float32?
更一般的学习问题: 假设我实际上想在rfft和irfft之间执行某些操作,如何将这些虚数转换为绝对值而不破坏keras,以便可以应用各种卷积等操作?
tf.real()
,在另一个通道中使用tf.imag()
),用于卷积处理。 - Allen Lavoie