提交 355363a1 authored 作者: Frederic's avatar Frederic

Small opt crash fix with the new MaxAndArgmax that now support None. Test this case.

上级 f4d83429
...@@ -57,7 +57,7 @@ class MaxAndArgmaxOptimizer(Optimizer): ...@@ -57,7 +57,7 @@ class MaxAndArgmaxOptimizer(Optimizer):
if len(node.outputs[1].clients)==0: if len(node.outputs[1].clients)==0:
try: try:
axis=get_constant_value(node.inputs[1]) axis=get_constant_value(node.inputs[1])
except ValueError: except (ValueError, TypeError), e:
return False return False
new = CAReduce(scal.maximum,axis)(node.inputs[0]) new = CAReduce(scal.maximum,axis)(node.inputs[0])
......
...@@ -16,15 +16,16 @@ class T_max_and_argmax(unittest.TestCase): ...@@ -16,15 +16,16 @@ class T_max_and_argmax(unittest.TestCase):
#If we use only the max output, we should replace this op with a faster one. #If we use only the max output, we should replace this op with a faster one.
mode = theano.compile.mode.get_default_mode().including('canonicalize','fast_run') mode = theano.compile.mode.get_default_mode().including('canonicalize','fast_run')
for axis in [0, 1, -1]:
data = numpy.asarray(numpy.random.rand(2,3),dtype=config.floatX) data = numpy.asarray(numpy.random.rand(2,3),dtype=config.floatX)
n = tensor.matrix() n = tensor.matrix()
f = function([n], tensor.max_and_argmax(n,0)[0], mode=mode) f = function([n], tensor.max_and_argmax(n, axis)[0], mode=mode)
topo = f.maker.env.toposort() topo = f.maker.env.toposort()
assert len(topo)==1 assert len(topo)==1
assert isinstance(topo[0].op, CAReduce) assert isinstance(topo[0].op, CAReduce)
f = function([n], tensor.max_and_argmax(n,0), mode=mode) f = function([n], tensor.max_and_argmax(n, axis), mode=mode)
topo = f.maker.env.toposort() topo = f.maker.env.toposort()
assert len(topo)==1 assert len(topo)==1
assert isinstance(topo[0].op, tensor.MaxAndArgmax) assert isinstance(topo[0].op, tensor.MaxAndArgmax)
...@@ -39,14 +40,15 @@ class T_min_max(unittest.TestCase): ...@@ -39,14 +40,15 @@ class T_min_max(unittest.TestCase):
data = numpy.asarray(numpy.random.rand(2,3),dtype=config.floatX) data = numpy.asarray(numpy.random.rand(2,3),dtype=config.floatX)
n = tensor.matrix() n = tensor.matrix()
f = function([n],tensor.max(n,0), mode=self.mode) for axis in [0, 1, -1]:
f = function([n],tensor.max(n, axis), mode=self.mode)
topo = f.maker.env.toposort() topo = f.maker.env.toposort()
assert len(topo)==1 assert len(topo)==1
assert isinstance(topo[0].op,CAReduce) assert isinstance(topo[0].op,CAReduce)
f(data) f(data)
f = function([n],tensor.max(-n,0), mode=self.mode) f = function([n],tensor.max(-n, axis), mode=self.mode)
topo = f.maker.env.toposort() topo = f.maker.env.toposort()
assert len(topo)==2 assert len(topo)==2
assert isinstance(topo[0].op, Elemwise) assert isinstance(topo[0].op, Elemwise)
...@@ -54,7 +56,7 @@ class T_min_max(unittest.TestCase): ...@@ -54,7 +56,7 @@ class T_min_max(unittest.TestCase):
assert isinstance(topo[1].op,CAReduce) assert isinstance(topo[1].op,CAReduce)
f(data) f(data)
f = function([n],-tensor.max(n,0), mode=self.mode) f = function([n],-tensor.max(n, axis), mode=self.mode)
topo = f.maker.env.toposort() topo = f.maker.env.toposort()
assert len(topo)==2 assert len(topo)==2
assert isinstance(topo[0].op,CAReduce) assert isinstance(topo[0].op,CAReduce)
...@@ -62,7 +64,7 @@ class T_min_max(unittest.TestCase): ...@@ -62,7 +64,7 @@ class T_min_max(unittest.TestCase):
assert isinstance(topo[1].op.scalar_op, scalar.Neg) assert isinstance(topo[1].op.scalar_op, scalar.Neg)
f(data) f(data)
f = function([n],-tensor.max(-n,0), mode=self.mode) f = function([n],-tensor.max(-n, axis), mode=self.mode)
topo = f.maker.env.toposort() topo = f.maker.env.toposort()
assert len(topo)==1 assert len(topo)==1
assert isinstance(topo[0].op,CAReduce)#min assert isinstance(topo[0].op,CAReduce)#min
...@@ -72,14 +74,15 @@ class T_min_max(unittest.TestCase): ...@@ -72,14 +74,15 @@ class T_min_max(unittest.TestCase):
data = numpy.asarray(numpy.random.rand(2,3),dtype=config.floatX) data = numpy.asarray(numpy.random.rand(2,3),dtype=config.floatX)
n = tensor.matrix() n = tensor.matrix()
f = function([n],tensor.min(n,0), mode=self.mode) for axis in [0, 1, -1]:
f = function([n],tensor.min(n, axis), mode=self.mode)
topo = f.maker.env.toposort() topo = f.maker.env.toposort()
assert len(topo)==1 assert len(topo)==1
assert isinstance(topo[0].op,CAReduce) assert isinstance(topo[0].op,CAReduce)
f(data) f(data)
#test variant with neg to make sure we optimize correctly #test variant with neg to make sure we optimize correctly
f = function([n],tensor.min(-n,0), mode=self.mode) f = function([n],tensor.min(-n, axis), mode=self.mode)
topo = f.maker.env.toposort() topo = f.maker.env.toposort()
assert len(topo)==2 assert len(topo)==2
assert isinstance(topo[0].op,CAReduce)#max assert isinstance(topo[0].op,CAReduce)#max
...@@ -87,7 +90,7 @@ class T_min_max(unittest.TestCase): ...@@ -87,7 +90,7 @@ class T_min_max(unittest.TestCase):
assert isinstance(topo[1].op.scalar_op, scalar.Neg) assert isinstance(topo[1].op.scalar_op, scalar.Neg)
f(data) f(data)
f = function([n],-tensor.min(n,0), mode=self.mode) f = function([n],-tensor.min(n, axis), mode=self.mode)
topo = f.maker.env.toposort() topo = f.maker.env.toposort()
assert len(topo)==2 assert len(topo)==2
assert isinstance(topo[0].op, Elemwise) assert isinstance(topo[0].op, Elemwise)
...@@ -95,9 +98,8 @@ class T_min_max(unittest.TestCase): ...@@ -95,9 +98,8 @@ class T_min_max(unittest.TestCase):
assert isinstance(topo[1].op,CAReduce)#max assert isinstance(topo[1].op,CAReduce)#max
f(data) f(data)
f = function([n],-tensor.min(-n,0), mode=self.mode) f = function([n],-tensor.min(-n, axis), mode=self.mode)
topo = f.maker.env.toposort() topo = f.maker.env.toposort()
assert len(topo)==1 assert len(topo)==1
assert isinstance(topo[0].op,CAReduce)#max assert isinstance(topo[0].op,CAReduce)#max
f(data) f(data)
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论