Давайте начнем с ввода, представляющего собой простой временной ряд, и попытаемся создать автоэнкодер, который просто преобразует Фурье, а затем преобразует наши данные в кератах.
Если мы попытаемся сделать это:
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, но похоже, что лямбда думает, что он сложный64 ?? (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, как я могу преобразовать эти мнимые числа в абсолютные значения, не разбивая кера, чтобы я мог применять различные свертки и тому подобное?