2017-11-10 40 views
1

テンソルフローでfftを使用します。しかし、numpyとtensorflowでそれぞれFFT関数を使用すると結果が異なることがわかりました。入力配列のサイズが大きい場合は特にテンソルフローのfftの結果はnumpyとは異なります

import tensorflow as tf 
import numpy as np 

aa = tf.lin_space(1.0, 10000.0, 10000) 
bb = tf.lin_space(1.0, 10000.0, 10000) 
dd = tf.concat([[aa],[bb]],axis = 0) 
c_input = tf.complex(dd[0,:], dd[1,:]) 
Spec = tf.fft(c_input) 
sess = tf.Session() 
uuu = sess.run(Spec) 
print(uuu) 

aaa = np.linspace(1.0, 10000.0, 10000) 
bbb = aaa + 1j*aaa 
ccc = np.fft.fft(bbb) 
print(ccc) 

結果は私がtensorflowにおけるFFT機能を使用する場合と同じ結果を得るために何ができる、だから、

[ 11645833.000000+11645826.j   -544529.875000 -6242453.5j 
    -913097.437500 -781089.0625j ...,  78607.218750 -108219.109375j 
    103245.156250 -182935.3125j  214871.765625 -790986.0625j ] 
[ 50005000.00000000+50005000.j   -15920493.78559075+15910493.78559076j 
    -7962746.10739718 +7952746.10739719j ..., 
    5300163.19893340 -5310163.19893345j 
    7952746.10739715 -7962746.10739723j 
    15910493.78559067-15920493.78559085j] 

あります? ありがとうございます

私は、tf.fftの出力のデータ型がcomplex64であることを発見しました。しかし、np.fft.fftの出力は複雑です128。それがこの質問の鍵ですか?どうすればこの問題を解決できますか?

答えて

1

あなたはそうです、差は正確にdtypeテンソルフローとnumpyです。

Tensorflow tf.fftは、入力テンソルをtf.complex64に強制します。ほとんどの場合、GPU op compatiblityが原因です。 Numpyは、FFT用の配列タイプもハードコードします。ソースコードはネイティブCのfftpack_litemodule.cであり、タイプはNPY_CDOUBLE - 128ビット、つまりnp.complex128です。詳細は、this issueを参照してください。

だから、私はそれにマッチする簡単な解決策はないと思う。 the custom tensorflow opを定義しようとすると、np.fft.fftが適用されますが、グラデーションを手動で評価する必要があります。または、大きなベクトルにFFTを適用しないでください。数値の不正確さが問題になることはありません。

+0

ご回答いただきありがとうございます – Hao

関連する問題