提交 0a889321 authored 作者: slefrancois's avatar slefrancois

final fft ops take shape as input, interface passes input array shape + odd correction

上级 29271d0a
差异被折叠。
...@@ -25,14 +25,13 @@ if not pycuda_available: # noqa ...@@ -25,14 +25,13 @@ if not pycuda_available: # noqa
import theano.gpuarray.cuda_fft import theano.gpuarray.cuda_fft
# Transform sizes # Transform sizes
N = 16 N = 64
class TestFFT(unittest.TestCase): class TestFFT(unittest.TestCase):
def test_1Dfft(self): def test_1Dfft(self):
inputs_val = np.random.random((1, N)).astype('float32') inputs_val = np.random.random((1, N)).astype('float32')
inputs = theano.shared(inputs_val)
x = T.matrix('x', dtype='float32') x = T.matrix('x', dtype='float32')
rfft = theano.gpuarray.fft.curfft(x) rfft = theano.gpuarray.fft.curfft(x)
...@@ -63,7 +62,7 @@ class TestFFT(unittest.TestCase): ...@@ -63,7 +62,7 @@ class TestFFT(unittest.TestCase):
def f_irfft(inp): def f_irfft(inp):
return theano.gpuarray.fft.cuirfft(inp) return theano.gpuarray.fft.cuirfft(inp)
inputs_val = np.random.random((1, N//2+1, 2)).astype('float32') inputs_val = np.random.random((1, N // 2 + 1, 2)).astype('float32')
utt.verify_grad(f_irfft, [inputs_val], eps=eps) utt.verify_grad(f_irfft, [inputs_val], eps=eps)
def test_rfft(self): def test_rfft(self):
...@@ -76,7 +75,7 @@ class TestFFT(unittest.TestCase): ...@@ -76,7 +75,7 @@ class TestFFT(unittest.TestCase):
res_rfft_comp = (np.asarray(res_rfft[:, :, :, 0]) + res_rfft_comp = (np.asarray(res_rfft[:, :, :, 0]) +
1j * np.asarray(res_rfft[:, :, :, 1])) 1j * np.asarray(res_rfft[:, :, :, 1]))
rfft_ref = numpy.fft.rfftn(inputs_val, axes=(1,2)) rfft_ref = numpy.fft.rfftn(inputs_val, axes=(1, 2))
utt.assert_allclose(rfft_ref, res_rfft_comp, atol=1e-4, rtol=1e-4) utt.assert_allclose(rfft_ref, res_rfft_comp, atol=1e-4, rtol=1e-4)
...@@ -115,7 +114,7 @@ class TestFFT(unittest.TestCase): ...@@ -115,7 +114,7 @@ class TestFFT(unittest.TestCase):
res_rfft_comp = (np.asarray(res_rfft[:, :, :, 0]) + res_rfft_comp = (np.asarray(res_rfft[:, :, :, 0]) +
1j * np.asarray(res_rfft[:, :, :, 1])) 1j * np.asarray(res_rfft[:, :, :, 1]))
rfft_ref_ortho = numpy.fft.rfftn(inputs_val, axes=(1,2), norm='ortho') rfft_ref_ortho = numpy.fft.rfftn(inputs_val, axes=(1, 2), norm='ortho')
utt.assert_allclose(rfft_ref_ortho, res_rfft_comp, utt.assert_allclose(rfft_ref_ortho, res_rfft_comp,
atol=1e-4, rtol=1e-4) atol=1e-4, rtol=1e-4)
...@@ -127,7 +126,7 @@ class TestFFT(unittest.TestCase): ...@@ -127,7 +126,7 @@ class TestFFT(unittest.TestCase):
res_rfft_comp = (np.asarray(res_rfft[:, :, :, 0]) + res_rfft_comp = (np.asarray(res_rfft[:, :, :, 0]) +
1j * np.asarray(res_rfft[:, :, :, 1])) 1j * np.asarray(res_rfft[:, :, :, 1]))
utt.assert_allclose(rfft_ref_ortho * np.sqrt(N*N), utt.assert_allclose(rfft_ref_ortho * np.sqrt(N * N),
res_rfft_comp, atol=1e-4, rtol=1e-4) res_rfft_comp, atol=1e-4, rtol=1e-4)
# Inverse FFT inputs # Inverse FFT inputs
...@@ -140,7 +139,8 @@ class TestFFT(unittest.TestCase): ...@@ -140,7 +139,8 @@ class TestFFT(unittest.TestCase):
f_irfft = theano.function([], irfft, mode=mode_with_gpu) f_irfft = theano.function([], irfft, mode=mode_with_gpu)
res_irfft = f_irfft() res_irfft = f_irfft()
irfft_ref_ortho = numpy.fft.irfftn(inputs_ref, axes=(1,2), norm='ortho') irfft_ref_ortho = numpy.fft.irfftn(
inputs_ref, axes=(1, 2), norm='ortho')
utt.assert_allclose(irfft_ref_ortho, utt.assert_allclose(irfft_ref_ortho,
res_irfft, atol=1e-4, rtol=1e-4) res_irfft, atol=1e-4, rtol=1e-4)
...@@ -150,7 +150,7 @@ class TestFFT(unittest.TestCase): ...@@ -150,7 +150,7 @@ class TestFFT(unittest.TestCase):
f_irfft = theano.function([], irfft, mode=mode_with_gpu) f_irfft = theano.function([], irfft, mode=mode_with_gpu)
res_irfft = f_irfft() res_irfft = f_irfft()
utt.assert_allclose(irfft_ref_ortho * np.sqrt(N*N), utt.assert_allclose(irfft_ref_ortho * np.sqrt(N * N),
res_irfft, atol=1e-4, rtol=1e-4) res_irfft, atol=1e-4, rtol=1e-4)
def test_grad(self): def test_grad(self):
...@@ -191,7 +191,7 @@ class TestFFT(unittest.TestCase): ...@@ -191,7 +191,7 @@ class TestFFT(unittest.TestCase):
res_rfft_comp = (np.asarray(res_rfft[:, :, :, 0]) + res_rfft_comp = (np.asarray(res_rfft[:, :, :, 0]) +
1j * np.asarray(res_rfft[:, :, :, 1])) 1j * np.asarray(res_rfft[:, :, :, 1]))
rfft_ref = numpy.fft.rfftn(inputs_val, s=(M,M), axes=(1,2))#, s=(M, M), axes=(1,2)) rfft_ref = numpy.fft.rfftn(inputs_val, s=(M, M), axes=(1, 2))
utt.assert_allclose(rfft_ref, res_rfft_comp, atol=1e-4, rtol=1e-4) utt.assert_allclose(rfft_ref, res_rfft_comp, atol=1e-4, rtol=1e-4)
...@@ -202,7 +202,7 @@ class TestFFT(unittest.TestCase): ...@@ -202,7 +202,7 @@ class TestFFT(unittest.TestCase):
utt.assert_allclose(inputs_val, np.asarray(res_ifft)) utt.assert_allclose(inputs_val, np.asarray(res_ifft))
inputs_val = np.random.random((1, M, M//2+1, 2)).astype('float32') inputs_val = np.random.random((1, M, M // 2 + 1, 2)).astype('float32')
inputs = theano.shared(inputs_val) inputs = theano.shared(inputs_val)
irfft = theano.gpuarray.fft.cuirfft(inputs, norm='ortho', is_odd=True) irfft = theano.gpuarray.fft.cuirfft(inputs, norm='ortho', is_odd=True)
...@@ -210,7 +210,8 @@ class TestFFT(unittest.TestCase): ...@@ -210,7 +210,8 @@ class TestFFT(unittest.TestCase):
res_irfft = f_irfft() res_irfft = f_irfft()
inputs_ref = inputs_val[:, :, :, 0] + 1j * inputs_val[:, :, :, 1] inputs_ref = inputs_val[:, :, :, 0] + 1j * inputs_val[:, :, :, 1]
irfft_ref = numpy.fft.irfftn(inputs_ref, s=(M, M), axes=(1,2), norm='ortho') irfft_ref = numpy.fft.irfftn(
inputs_ref, s=(M, M), axes=(1, 2), norm='ortho')
utt.assert_allclose(irfft_ref, res_irfft, atol=1e-4, rtol=1e-4) utt.assert_allclose(irfft_ref, res_irfft, atol=1e-4, rtol=1e-4)
...@@ -237,3 +238,16 @@ class TestFFT(unittest.TestCase): ...@@ -237,3 +238,16 @@ class TestFFT(unittest.TestCase):
return theano.gpuarray.fft.cuirfft(inp, norm='no_norm', is_odd=True) return theano.gpuarray.fft.cuirfft(inp, norm='no_norm', is_odd=True)
inputs_val = np.random.random((1, M, M // 2 + 1, 2)).astype('float32') inputs_val = np.random.random((1, M, M // 2 + 1, 2)).astype('float32')
utt.verify_grad(f_irfft, [inputs_val], eps=eps) utt.verify_grad(f_irfft, [inputs_val], eps=eps)
def test_params(self):
inputs_val = np.random.random((1, N)).astype('float32')
inputs = theano.shared(inputs_val)
with self.assertRaises(ValueError):
theano.gpuarray.fft.curfft(inputs, norm=123)
inputs_val = np.random.random((1, N // 2 + 1, 2)).astype('float32')
inputs = theano.shared(inputs_val)
with self.assertRaises(ValueError):
theano.gpuarray.fft.cuirfft(inputs, norm=123)
with self.assertRaises(ValueError):
theano.gpuarray.fft.cuirfft(inputs, is_odd=123)
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论