提交 c55d0ab9 authored 作者: Frederic's avatar Frederic

Fix crash tensor.roll(Var, iscalar) reported by Jeremiah Lowin.

上级 a696539d
...@@ -5632,8 +5632,8 @@ def roll(x, shift, axis=None): ...@@ -5632,8 +5632,8 @@ def roll(x, shift, axis=None):
end_list = ([allslice] * axis + [end_slice] + end_list = ([allslice] * axis + [end_slice] +
[allslice] * (x.ndim - axis - 1)) [allslice] * (x.ndim - axis - 1))
return join(axis, return join(axis,
Subtensor(front_list)(x), x.__getitem__(tuple(front_list)),
Subtensor(end_list)(x)) x.__getitem__(tuple(end_list)))
@constructor @constructor
......
...@@ -3625,43 +3625,44 @@ class T_Join_and_Split(unittest.TestCase): ...@@ -3625,43 +3625,44 @@ class T_Join_and_Split(unittest.TestCase):
def test_roll(self): def test_roll(self):
# Test simple 1D example for get_shift in [lambda a:a, lambda x:theano.shared(x)]:
a = self.shared(numpy.array([1, 2, 3, 4, 5, 6], dtype=self.floatX)) # Test simple 1D example
b = roll(a, 2) a = self.shared(numpy.array([1, 2, 3, 4, 5, 6], dtype=self.floatX))
want = numpy.array([5, 6, 1, 2, 3, 4]) b = roll(a, get_shift(2))
out = theano.function([], b)() want = numpy.array([5, 6, 1, 2, 3, 4])
out = theano.function([], b)()
assert (out == want).all() assert (out == want).all()
# Test simple 1D example with explicit 0 axis # Test simple 1D example with explicit 0 axis
b = roll(a, -1, 0) b = roll(a, get_shift(-1), 0)
want = numpy.array([2, 3, 4, 5, 6, 1]) want = numpy.array([2, 3, 4, 5, 6, 1])
out = theano.function([], b)() out = theano.function([], b)()
assert (out == want).all() assert (out == want).all()
# Test 2D example - ensure that behavior matches numpy.roll behavior # Test 2D example - ensure that behavior matches numpy.roll behavior
a = self.shared(numpy.arange(21).reshape((3, 7)).astype(self.floatX)) a = self.shared(numpy.arange(21).reshape((3, 7)).astype(self.floatX))
b = roll(a, -2, 1) b = roll(a, get_shift(-2), 1)
want = numpy.roll(a.get_value(borrow=True), -2, 1) want = numpy.roll(a.get_value(borrow=True), -2, 1)
out = theano.function([], b)() out = theano.function([], b)()
assert (out == want).all() assert (out == want).all()
# Test rolling on axis 0 # Test rolling on axis 0
want = numpy.roll(a.get_value(borrow=True), -2, 0) want = numpy.roll(a.get_value(borrow=True), -2, 0)
b = roll(a, -2, 0) b = roll(a, get_shift(-2), 0)
out = theano.function([], b)() out = theano.function([], b)()
assert (out == want).all() assert (out == want).all()
# Test rolling on default axis with ndim > 1 # Test rolling on default axis with ndim > 1
want = numpy.roll(a.get_value(borrow=True), 2) want = numpy.roll(a.get_value(borrow=True), 2)
b = roll(a, 2) b = roll(a, get_shift(2))
out = theano.function([], b)() out = theano.function([], b)()
assert (out == want).all() assert (out == want).all()
def test_stack_vector(self): def test_stack_vector(self):
a = self.shared(numpy.array([1, 2, 3], dtype=self.floatX)) a = self.shared(numpy.array([1, 2, 3], dtype=self.floatX))
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论