提交 478c688e authored 作者: Arnaud Bergeron's avatar Arnaud Bergeron

Revert the change that would broadcast the output if necessary and just don't…

Revert the change that would broadcast the output if necessary and just don't apply the opt in that case.
上级 66cd79b4
...@@ -6,7 +6,6 @@ from theano import scalar as scal, Constant ...@@ -6,7 +6,6 @@ from theano import scalar as scal, Constant
from theano.gof import local_optimizer from theano.gof import local_optimizer
from theano.tensor import (DimShuffle, get_scalar_constant_value, from theano.tensor import (DimShuffle, get_scalar_constant_value,
NotScalarConstantError) NotScalarConstantError)
from theano.tensor.opt import broadcast_like
from theano.sandbox.cuda.basic_ops import ( from theano.sandbox.cuda.basic_ops import (
GpuFromHost, HostFromGpu, host_from_gpu, GpuDimShuffle, GpuElemwise) GpuFromHost, HostFromGpu, host_from_gpu, GpuDimShuffle, GpuElemwise)
...@@ -101,7 +100,9 @@ def output_merge(cls, alpha_in, beta_in, out_in, nd): ...@@ -101,7 +100,9 @@ def output_merge(cls, alpha_in, beta_in, out_in, nd):
# other cases are too complex for now # other cases are too complex for now
return None return None
if W.broadcastable != targ.inputs[out_in].broadcastable: if W.broadcastable != targ.inputs[out_in].broadcastable:
W = broadcast_like(W, targ.inputs[out_in], node.fgraph) # May change later to do the broadcast, but it's
# under discussion.
return None
inputs = list(targ.inputs) inputs = list(targ.inputs)
inputs[out_in] = W inputs[out_in] = W
inputs[beta_in] = _one.clone() inputs[beta_in] = _one.clone()
......
...@@ -686,15 +686,12 @@ def test_dnn_conv_merge_mouts(): ...@@ -686,15 +686,12 @@ def test_dnn_conv_merge_mouts():
def test_dnn_conv_merge_broad(): def test_dnn_conv_merge_broad():
# Make sure that output merge works on broadcasted outputs. # Make sure that we don't apply output_merge on broadcasted values.
if not cuda.dnn.dnn_available(): if not cuda.dnn.dnn_available():
raise SkipTest(cuda.dnn.dnn_available.msg) raise SkipTest(cuda.dnn.dnn_available.msg)
img = T.ftensor4() img = T.ftensor4()
kern = T.ftensor4() kern = T.ftensor4()
img_val = numpy.random.random((2, 1, 8, 8)).astype('float32')
kern_val = numpy.random.random((3, 1, 4, 5)).astype('float32')
conv = dnn.dnn_conv(img, kern) conv = dnn.dnn_conv(img, kern)
lr = numpy.asarray(0.05, dtype='float32') lr = numpy.asarray(0.05, dtype='float32')
...@@ -702,23 +699,10 @@ def test_dnn_conv_merge_broad(): ...@@ -702,23 +699,10 @@ def test_dnn_conv_merge_broad():
# this does broadcasting # this does broadcasting
fr = conv + lr fr = conv + lr
f1 = theano.function([img, kern], [fr], mode=mode_with_gpu) f = theano.function([img, kern], [fr])
assert isinstance(f1.maker.fgraph.outputs[0].owner.inputs[0].owner.op, assert not isinstance(f.maker.fgraph.outputs[0].owner.inputs[0].owner.op,
dnn.GpuDnnConv) dnn.GpuDnnConv)
mode = mode_with_gpu
mode = mode.excluding('local_dnn_conv_alpha_merge')
mode = mode.excluding('local_dnn_conv_output_merge')
f2 = theano.function([img, kern], [fr], mode=mode)
assert not isinstance(f2.maker.fgraph.outputs[0].owner.inputs[0].owner.op,
dnn.GpuDnnConv)
out_f1 = f1(img_val, kern_val)
out_f2 = f2(img_val, kern_val)
utt.assert_allclose(out_f1, out_f2)
def test_dnn_conv_grad(): def test_dnn_conv_grad():
if not cuda.dnn.dnn_available() or dnn.version() == -1: if not cuda.dnn.dnn_available() or dnn.version() == -1:
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论