提交 f2d9c06e authored 作者: Frederic Bastien's avatar Frederic Bastien

make test for DownsampleFactorMax op faster and cover more case.

上级 388dba8b
...@@ -5,69 +5,67 @@ from theano.tests import unittest_tools as utt ...@@ -5,69 +5,67 @@ from theano.tests import unittest_tools as utt
from theano.sandbox.downsample import DownsampleFactorMax, max_pool from theano.sandbox.downsample import DownsampleFactorMax, max_pool
from theano import function, Mode from theano import function, Mode
class TestDownSample(unittest.TestCase): class TestDownsampleFactorMax(unittest.TestCase):
def test_maxpool(self): def test_maxpool(self):
# generate flatted images # generate flatted images
maxpoolshps = ((1,1),(2,2),(3,3),(2,3)) maxpoolshps = ((1,1),(2,2),(3,3),(2,3))
imval = N.random.rand(4,10,64,64) imval = N.random.rand(4,10,64,64)
do_theano=True
images = T.dmatrix() images = T.dmatrix()
dmatrix4=T.TensorType('float64', (False, False, False, False)) dmatrix4=T.TensorType('float64', (False, False, False, False))
images4=dmatrix4() images4=dmatrix4()
tctot, tpytot, ntot, gtot= [],[],[],[] tctot, tpytot, ntot = [],[],[]
for maxpoolshp in maxpoolshps: for maxpoolshp in maxpoolshps:
for border in [True,False]:
print 'maxpoolshp', maxpoolshp print 'maxpoolshp', maxpoolshp,'border', border
# numeric verification # numeric verification
my_output_val = N.zeros((imval.shape[0], imval.shape[1], xi=0
imval.shape[2]/maxpoolshp[0], yi=0
imval.shape[3]/maxpoolshp[1])) if not border:
if imval.shape[-2] % maxpoolshp[0]:
xi += 1
if imval.shape[-1] % maxpoolshp[1]:
yi += 1
my_output_val = N.zeros((imval.shape[0], imval.shape[1],
imval.shape[2]/maxpoolshp[0]+xi,
imval.shape[3]/maxpoolshp[1]+yi))
time1=time.time() time1=time.time()
for n in range(imval.shape[0]): for n in range(imval.shape[0]):
for k in range(imval.shape[1]): for k in range(imval.shape[1]):
for i in range(my_output_val.shape[2]): for i in range(my_output_val.shape[2]):
ii = i*maxpoolshp[0] ii = i*maxpoolshp[0]
for j in range(my_output_val.shape[3]): for j in range(my_output_val.shape[3]):
jj = j*maxpoolshp[1] jj = j*maxpoolshp[1]
patch = imval[n,k,ii:ii+maxpoolshp[0],jj:jj+maxpoolshp[1]] patch = imval[n,k,ii:ii+maxpoolshp[0],jj:jj+maxpoolshp[1]]
my_output_val[n,k,i,j] = N.max(patch) my_output_val[n,k,i,j] = N.max(patch)
my_output_val = my_output_val.reshape(imval.shape[0],-1) my_output_val = my_output_val.reshape(imval.shape[0],-1)
ntot+=[time.time()-time1] ntot+=[time.time()-time1]
# symbolic stuff # symbolic stuff
if do_theano: #### wrapper to DownsampleFactorMax op ####
#### wrapper to DownsampleFactorMax op #### output, outshp = max_pool(images, imval.shape[1:], maxpoolshp, border)
output, outshp = max_pool(images, imval.shape[1:], maxpoolshp)
assert N.prod(my_output_val.shape[1:]) == N.prod(outshp) assert N.prod(my_output_val.shape[1:]) == N.prod(outshp)
print outshp
print my_output_val.shape
assert N.prod(my_output_val.shape[1:]) == N.prod(outshp) assert N.prod(my_output_val.shape[1:]) == N.prod(outshp)
f = function([images,],[output,]) f = function([images,],[output,])
imval2=imval.reshape(imval.shape[0],-1) imval2=imval.reshape(imval.shape[0],-1)
output_val = f(imval2) output_val = f(imval2)
assert N.all(output_val == my_output_val) assert N.all(output_val == my_output_val)
else:
tctot=-1 #DownsampleFactorMax op
output_val = my_output_val.copy() maxpool_op = DownsampleFactorMax(maxpoolshp, ignore_border=border)(images4)
f = function([images4],maxpool_op,mode=Mode(linker="py"))
#DownsampleFactorMax op f2 = function([images4],maxpool_op,mode=Mode(linker="c"))
maxpool_op = DownsampleFactorMax(maxpoolshp, ignore_border=True)(images4) f3 = function([images4],maxpool_op)#for when we want to use the debug mode
f = function([images4],maxpool_op,mode=Mode(linker="py")) time1=time.time()
f2 = function([images4],maxpool_op,mode=Mode(linker="c")) output_val = f(imval)
time1=time.time() tctot+=[time.time()-time1]
output_val2 = f(imval) assert (N.abs(my_output_val.flatten()-output_val.flatten())<1e-5).all()
tpytot+=[time.time()-time1] time1=time.time()
assert (N.abs(my_output_val.flatten()-output_val2.flatten())<1e-5).all() output_val = f2(imval)
time1=time.time() tpytot+=[time.time()-time1]
output_val2 = f2(imval) assert (N.abs(my_output_val.flatten()-output_val.flatten())<1e-5).all()
tctot+=[time.time()-time1] output_val = f3(imval)
assert (N.abs(my_output_val.flatten()-output_val2.flatten())<1e-5).all()
def mp(input):
output, outshp = max_pool(input, imval.shape[1:], maxpoolshp)
return output
print 'Numpy processing time: %.3fs'%sum(ntot),ntot print 'Numpy processing time: %.3fs'%sum(ntot),ntot
print 'c Theano(DownsampleFactorMax) processing time: %.3fs'%sum(tctot),tctot print 'c Theano(DownsampleFactorMax) processing time: %.3fs'%sum(tctot),tctot
...@@ -76,29 +74,21 @@ class TestDownSample(unittest.TestCase): ...@@ -76,29 +74,21 @@ class TestDownSample(unittest.TestCase):
print 'speed up c theano(DownsampleFactorMax) vs manual: %.3f'%d.mean(),d print 'speed up c theano(DownsampleFactorMax) vs manual: %.3f'%d.mean(),d
d=N.asarray(ntot)/tpytot d=N.asarray(ntot)/tpytot
print 'speed up py theano(DownsampleFactorMax) vs manual: %.3f'%d.mean(),d print 'speed up py theano(DownsampleFactorMax) vs manual: %.3f'%d.mean(),d
print 'verify_grad time %.3f'%sum(gtot),
def test_maxpool_grad(self): def test_DownsampleFactorMax_grad(self):
# generate flatted images # generate flatted images
maxpoolshps = ((1,1),(2,2),(3,3),(2,3)) maxpoolshps = ((1,1),(3,2),(2,3))
imval = N.random.rand(3,7,10,10) * 10.0 #more variance means numeric gradient will be more accurate imval = N.random.rand(2,3,3,4) * 10.0 #more variance means numeric gradient will be more accurate
do_theano=True do_theano=True
images = T.dmatrix()
dmatrix4=T.TensorType('float64', (False, False, False, False))
images4=dmatrix4()
for maxpoolshp in maxpoolshps: for maxpoolshp in maxpoolshps:
print 'maxpoolshp', maxpoolshp for border in [True,False]:
def mp(input): print 'maxpoolshp', maxpoolshp, 'border', border
output, outshp = max_pool(input, imval.shape[1:], maxpoolshp) def mp(input):
return output return DownsampleFactorMax(maxpoolshp, ignore_border=border)(input)
print >> sys.stderr, 'max_pool verify_grad requires unusually large tolerance... is it correct?' utt.verify_grad(mp, [imval])
utt.verify_grad(mp, [imval.reshape(imval.shape[0],-1)], tol=1e-2)
if __name__ == '__main__': if __name__ == '__main__':
t = TestSP("test_convolution") t = TestDownsampleFactorMax("test_maxpool").run()
t = TestSP("test_maxpool").run()
# t.test_convolution()
# t.test_multilayer_conv()
#t.test_maxpool() #t.test_maxpool()
from theano.tests import main from theano.tests import main
# main("test_sp") # main("test_sp")
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论