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

Fix runtime crash with the local_subtensor_of_alloc optimization when the input…

Fix runtime crash with the local_subtensor_of_alloc optimization when the input have a broadcastable dimensions.
上级 f97fc466
......@@ -168,6 +168,7 @@ Crashes fixed:
* Support for OSX Enthought Python Distribution 7.x. (Graham Taylor, Olivier)
* When the subtensor inputs had 0 dimensions and the outputs 0 dimensions. (Frederic)
* Crash when the step to subtensor was not 1 in conjunction with some optimization. (Frederic, reported by Olivier Chapelle)
* Runtime crash related to an optimization with subtensor of alloc (reported by Razvan, fixed by Frederic)
* Fix dot22scalar cast of integer scalars (Justin Bayer, Frédéric, Olivier)
* Fix runtime crash in gemm, dot22. FB
* Fix on 32bits computer: make sure all shape are int64.(Olivier)
......
......@@ -1842,7 +1842,13 @@ def local_subtensor_of_alloc(node):
# If val was not copied over that dim,
# we need to take the appropriate subtensor on it.
if i >= n_added_dims:
val_slices.append(sl)
# We check that the corresponding val dimensions was
# not a broadcasted dimensions.
if (val.type.ndim > (i - n_added_dims) and
val.type.broadcastable[i - n_added_dims]):
val_slices.append(slice(None))
else:
val_slices.append(sl)
csl, _ = T.get_canonical_form_slice(sl, dim)
if type(csl) is not slice:
......
......@@ -2073,18 +2073,6 @@ class Test_alloc_zero(unittest.TestCase):
def test_local_subtensor_of_alloc():
x = tensor.matrix('x')
y = tensor.vector('y')
# The rows of yx are copies of y
yx = tensor.alloc(y, x.shape[0], x.shape[1])
# Slice of each row
z_mat = yx[:, 3:]
assert z_mat.ndim == 2
# Only one column
z_vec = yx[:, 3]
assert z_vec.ndim == 1
# DebugMode should detect if something goes wrong.
# test shape combination of odd and event shape.
......@@ -2093,22 +2081,35 @@ def test_local_subtensor_of_alloc():
xval = numpy.zeros(shape, dtype=config.floatX)
yval = numpy.arange(shape[1], dtype=config.floatX)
for slices in [
# results are vector
(slice(None), 3),
(2, slice(None)),
# results are matrix
(slice(None), slice(3, None)),
(slice(3, None), ),
(slice(3, None), slice(3, None)),
(slice(1, 3), slice(None, -1)),
(slice(None, None, 2)),
(slice(1, None, 2)),
]:
z = yx.__getitem__(slices)
f = theano.function([x, y], z)
val = f(xval, yval)
assert xval.__getitem__(slices).shape == val.shape
for y in [theano.shared(yval), tensor.constant([1.])]:
# The rows of yx are copies of y
yx = tensor.alloc(y, x.shape[0], x.shape[1])
# Slice of each row
z_mat = yx[:, 3:]
assert z_mat.ndim == 2
# Only one column
z_vec = yx[:, 3]
assert z_vec.ndim == 1
for slices in [
# results are vector
(slice(None), 3),
(2, slice(None)),
# results are matrix
(slice(None), slice(3, None)),
(slice(3, None), ),
(slice(3, None), slice(3, None)),
(slice(1, 3), slice(None, -1)),
(slice(None, None, 2)),
(slice(1, None, 2)),
]:
z = yx.__getitem__(slices)
f = theano.function([x], z)
val = f(xval)
assert xval.__getitem__(slices).shape == val.shape
def test_local_fill_useless():
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论