提交 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,18 +16,19 @@ class T_max_and_argmax(unittest.TestCase): ...@@ -16,18 +16,19 @@ 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')
data = numpy.asarray(numpy.random.rand(2,3),dtype=config.floatX) for axis in [0, 1, -1]:
n = tensor.matrix() data = numpy.asarray(numpy.random.rand(2,3),dtype=config.floatX)
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)
class T_min_max(unittest.TestCase): class T_min_max(unittest.TestCase):
...@@ -39,65 +40,66 @@ class T_min_max(unittest.TestCase): ...@@ -39,65 +40,66 @@ 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]:
topo = f.maker.env.toposort() f = function([n],tensor.max(n, axis), mode=self.mode)
assert len(topo)==1 topo = f.maker.env.toposort()
assert isinstance(topo[0].op,CAReduce) assert len(topo)==1
f(data) assert isinstance(topo[0].op,CAReduce)
f(data)
f = function([n],tensor.max(-n,0), mode=self.mode)
topo = f.maker.env.toposort() f = function([n],tensor.max(-n, axis), mode=self.mode)
assert len(topo)==2 topo = f.maker.env.toposort()
assert isinstance(topo[0].op, Elemwise) assert len(topo)==2
assert isinstance(topo[0].op.scalar_op, scalar.Neg) assert isinstance(topo[0].op, Elemwise)
assert isinstance(topo[1].op,CAReduce) assert isinstance(topo[0].op.scalar_op, scalar.Neg)
f(data) assert isinstance(topo[1].op,CAReduce)
f(data)
f = function([n],-tensor.max(n,0), mode=self.mode)
topo = f.maker.env.toposort() f = function([n],-tensor.max(n, axis), mode=self.mode)
assert len(topo)==2 topo = f.maker.env.toposort()
assert isinstance(topo[0].op,CAReduce) assert len(topo)==2
assert isinstance(topo[1].op, Elemwise) assert isinstance(topo[0].op,CAReduce)
assert isinstance(topo[1].op.scalar_op, scalar.Neg) assert isinstance(topo[1].op, Elemwise)
f(data) assert isinstance(topo[1].op.scalar_op, scalar.Neg)
f(data)
f = function([n],-tensor.max(-n,0), mode=self.mode)
topo = f.maker.env.toposort() f = function([n],-tensor.max(-n, axis), mode=self.mode)
assert len(topo)==1 topo = f.maker.env.toposort()
assert isinstance(topo[0].op,CAReduce)#min assert len(topo)==1
f(data) assert isinstance(topo[0].op,CAReduce)#min
f(data)
def test_optimization_min(self): def test_optimization_min(self):
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]:
topo = f.maker.env.toposort() f = function([n],tensor.min(n, axis), mode=self.mode)
assert len(topo)==1 topo = f.maker.env.toposort()
assert isinstance(topo[0].op,CAReduce) assert len(topo)==1
f(data) assert isinstance(topo[0].op,CAReduce)
f(data)
#test variant with neg to make sure we optimize correctly
f = function([n],tensor.min(-n,0), mode=self.mode) #test variant with neg to make sure we optimize correctly
topo = f.maker.env.toposort() f = function([n],tensor.min(-n, axis), mode=self.mode)
assert len(topo)==2 topo = f.maker.env.toposort()
assert isinstance(topo[0].op,CAReduce)#max assert len(topo)==2
assert isinstance(topo[1].op, Elemwise) assert isinstance(topo[0].op,CAReduce)#max
assert isinstance(topo[1].op.scalar_op, scalar.Neg) assert isinstance(topo[1].op, Elemwise)
f(data) assert isinstance(topo[1].op.scalar_op, scalar.Neg)
f(data)
f = function([n],-tensor.min(n,0), mode=self.mode)
topo = f.maker.env.toposort() f = function([n],-tensor.min(n, axis), mode=self.mode)
assert len(topo)==2 topo = f.maker.env.toposort()
assert isinstance(topo[0].op, Elemwise) assert len(topo)==2
assert isinstance(topo[0].op.scalar_op, scalar.Neg) assert isinstance(topo[0].op, Elemwise)
assert isinstance(topo[1].op,CAReduce)#max assert isinstance(topo[0].op.scalar_op, scalar.Neg)
f(data) assert isinstance(topo[1].op,CAReduce)#max
f(data)
f = function([n],-tensor.min(-n,0), mode=self.mode)
topo = f.maker.env.toposort() f = function([n],-tensor.min(-n, axis), mode=self.mode)
assert len(topo)==1 topo = f.maker.env.toposort()
assert isinstance(topo[0].op,CAReduce)#max assert len(topo)==1
f(data) assert isinstance(topo[0].op,CAReduce)#max
f(data)
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论