提交 b0c7744e authored 作者: Alexander Matyasko's avatar Alexander Matyasko

Add pool3d tests

上级 bdd1daaf
...@@ -186,7 +186,7 @@ def test_pool2d(): ...@@ -186,7 +186,7 @@ def test_pool2d():
continue continue
if mode == 'average_exc_pad' and (pad[0] > 0 or pad[1] > 0): if mode == 'average_exc_pad' and (pad[0] > 0 or pad[1] > 0):
continue continue
print('test_pool2d', shp, ws, st, pad, mode, ignore_border) # print('test_pool2d', shp, ws, st, pad, mode, ignore_border)
ds_op = Pool(ndim=len(ws), mode=mode, ignore_border=ignore_border) ds_op = Pool(ndim=len(ws), mode=mode, ignore_border=ignore_border)
a = theano.shared(rand(*shp), 'a') a = theano.shared(rand(*shp), 'a')
...@@ -237,11 +237,10 @@ def test_pool2d(): ...@@ -237,11 +237,10 @@ def test_pool2d():
isinstance(node.op, DownsampleFactorMaxGradGrad) isinstance(node.op, DownsampleFactorMaxGradGrad)
for node in gg2.maker.fgraph.toposort() for node in gg2.maker.fgraph.toposort()
]) ])
assert numpy.allclose(gg(), gg2()), (shp, ws, st, assert numpy.allclose(gg(), gg2()), (shp, ws, st, pad, mode, ignore_border)
ignore_border)
def test_max_pool3d_grad_grad(): def test_pool3d():
shps = [(1, 1, 12), shps = [(1, 1, 12),
(1, 1, 1, 1, 1), (1, 1, 1, 1, 1),
(1, 1, 1, 1, 1025), (1, 1, 1, 1, 1025),
...@@ -262,28 +261,64 @@ def test_max_pool3d_grad_grad(): ...@@ -262,28 +261,64 @@ def test_max_pool3d_grad_grad():
(1, 1, 10, 1023, 10), ] (1, 1, 10, 1023, 10), ]
numpy.random.RandomState(utt.fetch_seed()).shuffle(shps) numpy.random.RandomState(utt.fetch_seed()).shuffle(shps)
test_ds = (2, 2, 2), (3, 2, 3), (1, 1, 1) test_ws = (2, 2, 2), (3, 2, 3), (1, 1, 1)
test_st = (2, 2, 2), (2, 3, 2), (1, 1, 1) test_st = (2, 2, 2), (2, 3, 2), (1, 1, 1)
test_mode = ['max', 'sum', 'average_inc_pad', 'average_exc_pad']
ref_mode = copy.copy(mode_without_gpu)
ref_mode.check_py_code = False
gpu_mode = copy.copy(mode_with_gpu)
gpu_mode.check_py_code = False
for shp in shps: for shp in shps:
for ds, st in itertools.product(test_ds, test_st): for mode, ws, st in itertools.product(test_mode, test_ws, test_st):
if ds[0] > shp[-3] or ds[1] > shp[-2] or ds[2] > shp[-1]: if ws[0] > shp[-3] or ws[1] > shp[-2] or ws[2] > shp[-1]:
continue continue
for ignore_border, pad in zip((True, False), [(1, 1, 1), (0, 0, 0)]): for ignore_border, pad in zip((True, False), [(1, 1, 1), (0, 0, 0)]):
if pad[0] >= ds[0] or pad[1] >= ds[1] or pad[2] >= ds[2]: if pad[0] >= ws[0] or pad[1] >= ws[1] or pad[2] >= ws[2]:
continue
if mode == 'average_exc_pad' and (pad[0] > 0 or pad[1] > 0 or pad[2] > 0):
continue continue
# print('test_downsample', shp, ds, st, pad, ignore_border) # print('test_pool3d', shp, ws, st, pad, mode, ignore_border)
ds_op = Pool(ndim=len(ds), ignore_border=ignore_border) ds_op = Pool(ndim=len(ws), mode=mode, ignore_border=ignore_border)
a = theano.shared(rand(*shp), 'a') a = theano.shared(rand(*shp), 'a')
a_pooled = ds_op(tensor.as_tensor_variable(a), ws, st, pad)
f = theano.function([], a_pooled, mode=gpu_mode)
f2 = theano.function([], a_pooled, mode=ref_mode)
assert any([isinstance(node.op, GpuPool)
for node in f.maker.fgraph.toposort()])
assert any([isinstance(node.op, Pool)
for node in f2.maker.fgraph.toposort()])
assert numpy.allclose(f(), f2()), (shp, ws, st, pad, mode, ignore_border)
ggf = gradient.Lop(tensor.grad((ds_op( a_pooled_grad = tensor.grad(a_pooled.sum(), a)
tensor.as_tensor_variable(a), ds, st, pad)**2).sum(), a), a, a)
g = theano.function([], a_pooled_grad, mode=gpu_mode)
g2 = theano.function([], a_pooled_grad, mode=ref_mode)
if mode == 'max':
gop = GpuMaxPoolGrad
gop2 = MaxPoolGrad
else:
gop = GpuAveragePoolGrad
gop2 = AveragePoolGrad
assert any([isinstance(node.op, gop)
for node in g.maker.fgraph.toposort()])
assert any([isinstance(node.op, gop2)
for node in g2.maker.fgraph.toposort()])
assert numpy.allclose(g(), g2()), (shp, ws, st, pad, mode, ignore_border)
# test grad grad for max pooling
# for average pooling grad grad is just average pooling grad
if mode != 'max':
continue
ggf = gradient.Lop(tensor.grad((a_pooled**2).sum(), a), a, a)
ref_mode = copy.copy(mode_without_gpu)
ref_mode.check_py_code = False
gpu_mode = copy.copy(mode_with_gpu)
gpu_mode.check_py_code = False
gg = theano.function([], ggf, mode=gpu_mode) gg = theano.function([], ggf, mode=gpu_mode)
gg2 = theano.function([], ggf, mode=ref_mode) gg2 = theano.function([], ggf, mode=ref_mode)
...@@ -295,5 +330,5 @@ def test_max_pool3d_grad_grad(): ...@@ -295,5 +330,5 @@ def test_max_pool3d_grad_grad():
isinstance(node.op, DownsampleFactorMaxGradGrad) isinstance(node.op, DownsampleFactorMaxGradGrad)
for node in gg2.maker.fgraph.toposort() for node in gg2.maker.fgraph.toposort()
]) ])
assert numpy.allclose(gg(), gg2()), (shp, ds, st, assert numpy.allclose(gg(), gg2()), (shp, ws, st, pad, mode, ignore_border)
ignore_border)
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论