Я пытаюсь выполнить некоторую обработку звука с помощью Tensorflow LSTM RNN. Я использую tf.contrib.signal.stft, чтобы, надеюсь, упростить нейронной сети понимание моих данных, но он возвращает тензор типа complex64. Если я попытаюсь передать это в dynamic_rnn, я получу следующую ошибку:
ValueError: требуется инициализатор для переменной rnn / basic_lstm_cell / kernel of
Поэтому мне нужно предоставить RNN значения float32. Я могу преобразовать тензор в float32, но тогда я думаю, что мнимый компонент отброшен, и я думаю, что это может быть значительным. Вместо этого я хотел бы преобразовать каждый complex64 в 2 значения float32, одно из которых содержит реальное значение, а другое - мнимое.
Мой тензор имеет следующую форму: [batch_size, chunks, channels, samples, bin] и dtype complex64.
Я хотел бы преобразовать его в форму [размер_пакета, фрагменты, каналы, образцы, ячейки, 2] и dtype для float32.
Я пробовал следующий код:
realFourierTransformed = tf.map_fn(lambda batch: tf.map_fn(lambda chunk: tf.map_fn(lambda channel: tf.map_fn(lambda sample: tf.map_fn(lambda bin: tf.convert_to_tensor([tf.real(bin), tf.imag(bin)]), sample, dtype=tf.float32), channel, dtype=tf.float32), chunk, dtype=tf.float32), batch, dtype=tf.float32), fourierTransformed, dtype=tf.float32)
но он работает очень медленно.
Я уверен, что есть способ сделать это лучше.
fourierTransformed
,bin
была аргументом из внутренней лямбда-выражения) Я новичок в Python и раньше не видел этого синтаксиса для добавления измерения, плюс я не понимал, что могу вызвать tf.real или tf.imag на тензорном массиве. 18.02.2018