提交 ca55d2f9 authored 作者: nouiz's avatar nouiz

Merge pull request #908 from lamblin/fix_test_neib

Fix tests for image2neibs
...@@ -404,6 +404,7 @@ def gpu_images2neibs(ten4, neib_shape, neib_step=None, mode='valid'): ...@@ -404,6 +404,7 @@ def gpu_images2neibs(ten4, neib_shape, neib_step=None, mode='valid'):
@local_optimizer() @local_optimizer()
def use_gpu_images2neibs(node): def use_gpu_images2neibs(node):
if (type(node.op) is Images2Neibs and if (type(node.op) is Images2Neibs and
node.inputs[0].dtype == 'float32' and
node.op.mode in ['valid', 'wrap_centered']): node.op.mode in ['valid', 'wrap_centered']):
return [host_from_gpu(gpu_images2neibs(gpu_from_host(node.inputs[0]), return [host_from_gpu(gpu_images2neibs(gpu_from_host(node.inputs[0]),
node.inputs[1], node.inputs[2], node.inputs[1], node.inputs[2],
......
...@@ -139,6 +139,7 @@ class NVCC_compiler(object): ...@@ -139,6 +139,7 @@ class NVCC_compiler(object):
default_to_move_computation_to_gpu=False, default_to_move_computation_to_gpu=False,
move_shared_float32_to_gpu=False, move_shared_float32_to_gpu=False,
enable_cuda=False) enable_cuda=False)
n = theano.sandbox.cuda.use.device_number
p = theano.sandbox.cuda.device_properties(n) p = theano.sandbox.cuda.device_properties(n)
flags.append('-arch=sm_' + str(p['major']) + str(p['minor'])) flags.append('-arch=sm_' + str(p['major']) + str(p['minor']))
......
...@@ -20,6 +20,7 @@ else: ...@@ -20,6 +20,7 @@ else:
class T_GpuImages2Neibs(theano.sandbox.test_neighbours.T_Images2Neibs): class T_GpuImages2Neibs(theano.sandbox.test_neighbours.T_Images2Neibs):
mode = mode_with_gpu mode = mode_with_gpu
op = GpuImages2Neibs op = GpuImages2Neibs
dtypes = ['float32']
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()
...@@ -18,9 +18,11 @@ else: ...@@ -18,9 +18,11 @@ else:
if not theano.config.cxx: if not theano.config.cxx:
raise SkipTest("G++ not available, so we need to skip this test.") raise SkipTest("G++ not available, so we need to skip this test.")
class T_Images2Neibs(unittest_tools.InferShapeTester): class T_Images2Neibs(unittest_tools.InferShapeTester):
mode = mode_without_gpu mode = mode_without_gpu
op = Images2Neibs op = Images2Neibs
dtypes = ['int64', 'float32', 'float64']
def test_neibs(self): def test_neibs(self):
for shape, pshape in [((100, 40, 18, 18), (2, 2)), for shape, pshape in [((100, 40, 18, 18), (2, 2)),
...@@ -29,17 +31,23 @@ class T_Images2Neibs(unittest_tools.InferShapeTester): ...@@ -29,17 +31,23 @@ class T_Images2Neibs(unittest_tools.InferShapeTester):
((10, 40, 68, 66), (34, 33)) ((10, 40, 68, 66), (34, 33))
]: ]:
for border in ['valid', 'ignore_borders']: for border in ['valid', 'ignore_borders']:
images = shared(numpy.arange(numpy.prod(shape)).reshape(shape)) for dtype in self.dtypes:
images = shared(
numpy.arange(numpy.prod(shape), dtype=dtype
).reshape(shape))
neib_shape = T.as_tensor_variable(pshape) neib_shape = T.as_tensor_variable(pshape)
f = function([], images2neibs(images, neib_shape, mode=border), f = function([],
images2neibs(images, neib_shape, mode=border),
mode=self.mode) mode=self.mode)
#print images.get_value(borrow=True) #print images.get_value(borrow=True)
neibs = f() neibs = f()
#print neibs #print neibs
g = function([], neibs2images(neibs, neib_shape, images.shape), g = function([],
neibs2images(neibs, neib_shape, images.shape),
mode=self.mode) mode=self.mode)
if border in ['valid']:
assert any([isinstance(node.op, self.op) assert any([isinstance(node.op, self.op)
for node in f.maker.fgraph.toposort()]) for node in f.maker.fgraph.toposort()])
...@@ -48,7 +56,10 @@ class T_Images2Neibs(unittest_tools.InferShapeTester): ...@@ -48,7 +56,10 @@ class T_Images2Neibs(unittest_tools.InferShapeTester):
def test_neibs_manual(self): def test_neibs_manual(self):
shape = (2, 3, 4, 4) shape = (2, 3, 4, 4)
images = shared(numpy.arange(numpy.prod(shape)).reshape(shape)) for dtype in self.dtypes:
images = shared(
numpy.arange(numpy.prod(shape), dtype=dtype
).reshape(shape))
neib_shape = T.as_tensor_variable((2, 2)) neib_shape = T.as_tensor_variable((2, 2))
for border in ['valid', 'ignore_borders']: for border in ['valid', 'ignore_borders']:
...@@ -89,15 +100,19 @@ class T_Images2Neibs(unittest_tools.InferShapeTester): ...@@ -89,15 +100,19 @@ class T_Images2Neibs(unittest_tools.InferShapeTester):
def test_neibs_manual_step(self): def test_neibs_manual_step(self):
shape = (2, 3, 5, 5) shape = (2, 3, 5, 5)
for dtype in self.dtypes:
images = shared(numpy.asarray(numpy.arange(numpy.prod( images = shared(numpy.asarray(numpy.arange(numpy.prod(
shape)).reshape(shape), dtype='float32')) shape)).reshape(shape), dtype=dtype))
neib_shape = T.as_tensor_variable((3, 3)) neib_shape = T.as_tensor_variable((3, 3))
neib_step = T.as_tensor_variable((2, 2)) neib_step = T.as_tensor_variable((2, 2))
for border in ['valid', 'ignore_borders']: for border in ['valid', 'ignore_borders']:
f = function([], images2neibs(images, neib_shape, neib_step, mode=border), f = function([],
images2neibs(images, neib_shape, neib_step,
mode=border),
mode=self.mode) mode=self.mode)
neibs = f() neibs = f()
if border in ['valid']:
assert self.op in [type(node.op) assert self.op in [type(node.op)
for node in f.maker.fgraph.toposort()] for node in f.maker.fgraph.toposort()]
...@@ -136,15 +151,21 @@ class T_Images2Neibs(unittest_tools.InferShapeTester): ...@@ -136,15 +151,21 @@ class T_Images2Neibs(unittest_tools.InferShapeTester):
def test_neibs_bad_shape(self): def test_neibs_bad_shape(self):
shape = (2, 3, 10, 10) shape = (2, 3, 10, 10)
images = shared(numpy.arange(numpy.prod(shape)).reshape(shape)) for dtype in self.dtypes:
images = shared(numpy.arange(
numpy.prod(shape), dtype=dtype
).reshape(shape))
for neib_shape in [(3, 2), (2, 3)]: for neib_shape in [(3, 2), (2, 3)]:
neib_shape = T.as_tensor_variable(neib_shape) neib_shape = T.as_tensor_variable(neib_shape)
f = function([], images2neibs(images, neib_shape), mode=self.mode) f = function([], images2neibs(images, neib_shape),
mode=self.mode)
self.assertRaises(TypeError, f) self.assertRaises(TypeError, f)
#Test that ignore border work in that case. #Test that ignore border work in that case.
f = function([], images2neibs(images, neib_shape, mode='ignore_borders'), f = function([],
images2neibs(images, neib_shape,
mode='ignore_borders'),
mode=self.mode) mode=self.mode)
f() f()
...@@ -197,8 +218,10 @@ class T_Images2Neibs(unittest_tools.InferShapeTester): ...@@ -197,8 +218,10 @@ class T_Images2Neibs(unittest_tools.InferShapeTester):
[(1, 1, 1045, 5), (3, 3), (3, 3), None], [(1, 1, 1045, 5), (3, 3), (3, 3), None],
]): ]):
for dtype in self.dtypes:
images = shared(numpy.asarray(numpy.arange(numpy.prod( images = shared(numpy.asarray(numpy.arange(numpy.prod(
shape)).reshape(shape), dtype='float32')) shape)).reshape(shape), dtype=dtype))
neib_shape = T.as_tensor_variable(neib_shape) neib_shape = T.as_tensor_variable(neib_shape)
neib_step = T.as_tensor_variable(neib_step) neib_step = T.as_tensor_variable(neib_step)
expected = numpy.asarray(expected) expected = numpy.asarray(expected)
...@@ -210,9 +233,10 @@ class T_Images2Neibs(unittest_tools.InferShapeTester): ...@@ -210,9 +233,10 @@ class T_Images2Neibs(unittest_tools.InferShapeTester):
if expected.size > 1: if expected.size > 1:
for i in range(shape[0] * shape[1]): for i in range(shape[0] * shape[1]):
assert numpy.allclose(neibs[i * expected.shape[0]: assert numpy.allclose(
neibs[i * expected.shape[0]:
(i + 1) * expected.shape[0], :], (i + 1) * expected.shape[0], :],
expected + 25 * i), mode_idx expected + 25 * i), "wrap_centered"
assert self.op in [type(node.op) assert self.op in [type(node.op)
for node in f.maker.fgraph.toposort()] for node in f.maker.fgraph.toposort()]
...@@ -223,7 +247,11 @@ class T_Images2Neibs(unittest_tools.InferShapeTester): ...@@ -223,7 +247,11 @@ class T_Images2Neibs(unittest_tools.InferShapeTester):
def test_neibs_bad_shape_wrap_centered(self): def test_neibs_bad_shape_wrap_centered(self):
shape = (2, 3, 10, 10) shape = (2, 3, 10, 10)
images = shared(numpy.arange(numpy.prod(shape)).reshape(shape))
for dtype in self.dtypes:
images = shared(numpy.arange(
numpy.prod(shape), dtype=dtype
).reshape(shape))
for neib_shape in [(3, 2), (2, 3)]: for neib_shape in [(3, 2), (2, 3)]:
neib_shape = T.as_tensor_variable(neib_shape) neib_shape = T.as_tensor_variable(neib_shape)
......
...@@ -166,9 +166,11 @@ class T_OpContractMixin(object): ...@@ -166,9 +166,11 @@ class T_OpContractMixin(object):
class InferShapeTester(unittest.TestCase): class InferShapeTester(unittest.TestCase):
def setUp(self): def setUp(self):
seed_rng() seed_rng()
# Take into account any mode that may be defined in a child class
mode = getattr(self, 'mode', theano.compile.get_default_mode())
# This mode seems to be the minimal one including the shape_i # This mode seems to be the minimal one including the shape_i
# optimizations, if we don't want to enumerate them explicitly. # optimizations, if we don't want to enumerate them explicitly.
self.mode = theano.compile.get_default_mode().including("canonicalize") self.mode = mode.including("canonicalize")
def _compile_and_check(self, inputs, outputs, numeric_inputs, cls, def _compile_and_check(self, inputs, outputs, numeric_inputs, cls,
excluding=None): excluding=None):
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论