Tensorflow - 从complex64转换为2x float32

时间:2018-02-17 14:17:46

标签: python tensorflow complex-numbers

我尝试使用Tensorflow LSTM RNN进行一些音频处理。我使用tf.contrib.signal.stft希望神经网络更容易理解我的数据,但它会返回类型为complex64的Tensor。如果我尝试将其提供给dynamic_rnn,我会收到以下错误:

  

ValueError:需要变量rnn / basic_lstm_cell / kernel的初始值设定项

所以我需要为RNN提供float32值。我可以将张量转换为float32,但是我认为假想的组件被丢弃了,我认为它可能很重要。我想将每个complex64转换为2个float32值,一个包含实数值,另一个包含虚数值。

我的张量具有以下形状:[batch_size,chunk,channels,samples,bin]和complex64的dtype。

我希望将其转换为具有形状[batch_size,chunk,channel,samples,bin,2]和float32的dtype。

我尝试了以下代码:

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)

但它的运行速度非常慢。

我确信有更好的方法可以做到这一点。

1 个答案:

答案 0 :(得分:5)

怎么样

extended_bin = bin[..., None]
tf.concat([tf.real(extended_bin), tf.imag(extended_bin)], axis=-1)

首先添加新轴,然后我们分别提取实部/虚部。