From f67a9f18f5a1927085b706341c7c729c9656cb06 Mon Sep 17 00:00:00 2001 From: Sina Honari Date: Fri, 28 Nov 2014 17:17:38 -0500 Subject: [PATCH] applying changes to the case where stride is used for issue #2196 --- theano/tensor/signal/downsample.py | 47 ++++++++----------- theano/tensor/signal/tests/test_downsample.py | 37 ++++++--------- 2 files changed, 34 insertions(+), 50 deletions(-) diff --git a/theano/tensor/signal/downsample.py b/theano/tensor/signal/downsample.py index 39643dd93d1..68a2431f76a 100644 --- a/theano/tensor/signal/downsample.py +++ b/theano/tensor/signal/downsample.py @@ -104,40 +104,31 @@ def out_shape(imgshape, ds, ignore_border=False, st=None): out_r = (r - ds[0]) // st[0] + 1 out_c = (c - ds[1]) // st[1] + 1 - nr = 0 - nc = 0 + if isinstance(r, theano.Variable): - nr = tensor.switch(tensor.ge(r - ds[0], 0), out_r, 0) - elif r - ds[0] >= 0: - nr = out_r + nr = tensor.maximum(out_r, 0) + else: + nr = numpy.maximum(out_r, 0) if isinstance(c, theano.Variable): - nr = tensor.switch(tensor.ge(c - ds[1], 0), out_c, 0) - elif c - ds[1] >= 0: - nc = out_c + nc = tensor.maximum(out_c, 0) + else: + nc = numpy.maximum(out_c, 0) - out_re = 0 - out_ce = 0 if not ignore_border: - re = r - ((out_r - 1) * st[0] + ds[0]) - rr = r - out_r * st[0] - ce = c - ((out_c - 1) * st[1] + ds[1]) - cr = c - out_c * st[1] if isinstance(r, theano.Variable): - out_re = tensor.switch(tensor.gt(nr, 0), tensor.switch(tensor.gt(re, 0), tensor.switch(tensor.gt(rr, 0), 1, 0), 0), tensor.switch(tensor.gt(r, 0), 1, 0)) - elif nr > 0: - if re > 0 and rr > 0: - out_re = 1 - elif r > 0: - out_re = 1 + nr = tensor.switch(tensor.ge(st[0], ds[0]), (r - 1) // st[0] + 1, tensor.maximum(0, (r - 1 - ds[0]) // st[0] + 1) + 1) + elif st[0] >= ds[0]: + nr = (r - 1) // st[0] + 1 + else: + nr = max(0, (r - 1 - ds[0]) // st[0] + 1) + 1 + if isinstance(c, theano.Variable): - out_ce = tensor.switch(tensor.gt(nc, 0), tensor.switch(tensor.gt(ce, 0), tensor.switch(tensor.gt(cr, 0), 1, 0), 0), tensor.switch(tensor.gt(c, 0), 1, 0)) - elif nc > 0: - if ce > 0 and cr > 0: - out_ce = 1 - elif c > 0: - out_ce = 1 - nr += out_re - nc += out_ce + nc = tensor.switch(tensor.ge(st[1], ds[1]), (c - 1) // st[1] + 1, tensor.maximum(0, (c - 1 - ds[1]) // st[1] + 1) + 1) + elif st[1] >= ds[1]: + nc = (c - 1) // st[1] + 1 + else: + nc = max(0, (c - 1 - ds[1]) // st[1] + 1) + 1 + rval = list(imgshape[:-2]) + [nr, nc] return rval diff --git a/theano/tensor/signal/tests/test_downsample.py b/theano/tensor/signal/tests/test_downsample.py index 16d9df1be20..3d9f9f9462c 100644 --- a/theano/tensor/signal/tests/test_downsample.py +++ b/theano/tensor/signal/tests/test_downsample.py @@ -122,7 +122,7 @@ def test_DownsampleFactorMax(self): ignore_border=ignore_border)(images) f = function([images], maxpool_op) output_val = f(imval) - assert (numpy.abs(output_val - numpy_output_val) < 1e-5).all() + utt.assert_allclose(output_val, numpy_output_val) def test_DownsampleFactorMaxStride(self): rng = numpy.random.RandomState(utt.fetch_seed()) @@ -142,22 +142,17 @@ def test_DownsampleFactorMaxStride(self): for stride in stridesizes: outputshp = outputshps[indx] indx += 1 - print 'maxpoolshp =', maxpoolshp - print 'ignore_border =', ignore_border - print 'stride =', stride - #DownsampleFactorMax op numpy_output_val = self.numpy_max_pool_2d_stride(imval, maxpoolshp, ignore_border, stride) - print "outshape is %s " %(outputshp, ) - print "calculated shape is %s " %(numpy_output_val.shape,) - assert numpy_output_val.shape == outputshp + assert numpy_output_val.shape == outputshp, ( + "outshape is %s, calculated shape is %s" + %(outputshp, numpy_output_val.shape)) maxpool_op = DownsampleFactorMax(maxpoolshp, ignore_border=ignore_border, st=stride)(images) f = function([images], maxpool_op) output_val = f(imval) - print "numpy_output_val shape is %s" %(numpy_output_val.shape,) - assert (numpy.abs(output_val - numpy_output_val) < 1e-5).all() + utt.assert_allclose(output_val, numpy_output_val) def test_DownsampleFactorMaxStrideExtra(self): rng = numpy.random.RandomState(utt.fetch_seed()) @@ -179,23 +174,17 @@ def test_DownsampleFactorMaxStrideExtra(self): if not ignore_border: indx_out += 1 outputshp = outputshps[indx_out] - print 'maxpoolshp =', maxpoolshp - print 'ignore_border =', ignore_border - print 'stride =', stride - #DownsampleFactorMax op numpy_output_val = self.numpy_max_pool_2d_stride(imval, maxpoolshp, ignore_border, stride) - print "outshape is %s " %(outputshp, ) - print "calculated shape is %s " %(numpy_output_val.shape,) - assert numpy_output_val.shape == outputshp + assert numpy_output_val.shape == outputshp, ( + "outshape is %s, calculated shape is %s" + %(outputshp, numpy_output_val.shape)) maxpool_op = DownsampleFactorMax(maxpoolshp, ignore_border=ignore_border, st=stride)(images) f = function([images], maxpool_op) output_val = f(imval) - print "numpy_output_val shape is %s" %(numpy_output_val.shape,) - print "output_val shape is %s " %(output_val.shape,) - assert (numpy.abs(output_val - numpy_output_val) < 1e-5).all() + utt.assert_allclose(output_val, numpy_output_val) def test_DownsampleFactorMax_grad(self): rng = numpy.random.RandomState(utt.fetch_seed()) @@ -266,7 +255,9 @@ def test_max_pool_2d_2D(self): ignore_border) output = max_pool_2d(images, maxpoolshp, ignore_border) output_val = function([images], output)(imval) - assert numpy.all(output_val == numpy_output_val) + assert numpy.all(output_val == numpy_output_val), ( + "output_val is %s, numpy_output_val is %s" + %(output_val, numpy_output_val)) def mp(input): return max_pool_2d(input, maxpoolshp, ignore_border) utt.verify_grad(mp, [imval], rng=rng) @@ -285,7 +276,9 @@ def test_max_pool_2d_3D(self): ignore_border) output = max_pool_2d(images, maxpoolshp, ignore_border) output_val = function([images], output)(imval) - assert numpy.all(output_val == numpy_output_val) + assert numpy.all(output_val == numpy_output_val), ( + "output_val is %s, numpy_output_val is %s" + %(output_val, numpy_output_val)) c = tensor.sum(output) c_val = function([images], c)(imval) g = tensor.grad(c, images)