Skip to content

Commit

Permalink
applying changes to the case where stride is used for issue Theano#2196
Browse files Browse the repository at this point in the history
  • Loading branch information
Sina Honari committed Nov 28, 2014
1 parent c770a28 commit 0732383
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 50 deletions.
47 changes: 19 additions & 28 deletions theano/tensor/signal/downsample.py
Original file line number Diff line number Diff line change
Expand Up @@ -104,40 +104,31 @@ def out_shape(imgshape, ds, ignore_border=False, st=None):

This comment has been minimized.

Copy link
@lamblin

lamblin Nov 29, 2014

This should be in an "if ignore_border" block

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:

This comment has been minimized.

Copy link
@lamblin

lamblin Nov 29, 2014

(and this should be an "else:")

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)

This comment has been minimized.

Copy link
@lamblin

lamblin Nov 29, 2014

Can you split that line so it fits in 79 characters, to respect pep8?

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

Expand Down
37 changes: 15 additions & 22 deletions theano/tensor/signal/tests/test_downsample.py
Original file line number Diff line number Diff line change
Expand Up @@ -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())
Expand All @@ -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())
Expand All @@ -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())
Expand Down Expand Up @@ -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)
Expand All @@ -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)
Expand Down

0 comments on commit 0732383

Please sign in to comment.