提交 6ff26fa2 authored 作者: Arnaud Bergeron's avatar Arnaud Bergeron

Fix opts that play directly with owner.inputs.

This was causing problems in the case of Pool, but I also fixed it elsewhere just to be sure.
上级 1e831dbe
...@@ -22,8 +22,7 @@ from theano.tensor.signal.pool import ( ...@@ -22,8 +22,7 @@ from theano.tensor.signal.pool import (
from . import pygpu from . import pygpu
from .type import get_context, gpu_context_type, list_contexts, GpuArrayType from .type import get_context, gpu_context_type, list_contexts, GpuArrayType
from .basic_ops import (as_gpuarray_variable, infer_context_name, from .basic_ops import (as_gpuarray_variable, infer_context_name,
gpu_contiguous, HostFromGpu, gpu_contiguous, GpuAllocEmpty, empty_like)
GpuAllocEmpty, empty_like)
from .elemwise import GpuElemwise from .elemwise import GpuElemwise
# These don't exist in gpuarray # These don't exist in gpuarray
...@@ -892,6 +891,8 @@ def dnn_conv(img, kerns, border_mode='valid', subsample=(1, 1), ...@@ -892,6 +891,8 @@ def dnn_conv(img, kerns, border_mode='valid', subsample=(1, 1),
def dnn_gradweight(img, topgrad, kerns_shp, border_mode='valid', def dnn_gradweight(img, topgrad, kerns_shp, border_mode='valid',
subsample=(1, 1), conv_mode='conv'): subsample=(1, 1), conv_mode='conv'):
ctx_name = infer_context_name(img, topgrad) ctx_name = infer_context_name(img, topgrad)
img = as_gpuarray_variable(img, ctx_name)
topgrad = as_gpuarray_variable(topgrad, ctx_name)
img = gpu_contiguous(img) img = gpu_contiguous(img)
topgrad = gpu_contiguous(topgrad) topgrad = gpu_contiguous(topgrad)
kerns_shp = as_tensor_variable(kerns_shp) kerns_shp = as_tensor_variable(kerns_shp)
...@@ -904,6 +905,8 @@ def dnn_gradweight(img, topgrad, kerns_shp, border_mode='valid', ...@@ -904,6 +905,8 @@ def dnn_gradweight(img, topgrad, kerns_shp, border_mode='valid',
def dnn_gradinput(kerns, topgrad, img_shp, border_mode='valid', def dnn_gradinput(kerns, topgrad, img_shp, border_mode='valid',
subsample=(1, 1), conv_mode='conv'): subsample=(1, 1), conv_mode='conv'):
ctx_name = infer_context_name(kerns, topgrad) ctx_name = infer_context_name(kerns, topgrad)
kerns = as_gpuarray_variable(kerns, ctx_name)
topgrad = as_gpuarray_variable(topgrad, ctx_name)
kerns = gpu_contiguous(kerns) kerns = gpu_contiguous(kerns)
topgrad = gpu_contiguous(topgrad) topgrad = gpu_contiguous(topgrad)
img_shp = as_tensor_variable(img_shp) img_shp = as_tensor_variable(img_shp)
...@@ -1291,17 +1294,16 @@ class GpuDnnSoftmaxGrad(GpuDnnSoftmaxBase): ...@@ -1291,17 +1294,16 @@ class GpuDnnSoftmaxGrad(GpuDnnSoftmaxBase):
@local_optimizer([AbstractConv2d, AbstractConv2d_gradWeights, @local_optimizer([AbstractConv2d, AbstractConv2d_gradWeights,
AbstractConv2d_gradInputs]) AbstractConv2d_gradInputs])
def local_abstractconv_cudnn(node): def local_abstractconv_cudnn(node):
if (not isinstance(node.op, (AbstractConv2d, AbstractConv2d_gradWeights, if (not isinstance(node.op, (AbstractConv2d,
AbstractConv2d_gradWeights,
AbstractConv2d_gradInputs))): AbstractConv2d_gradInputs))):
return None return None
inp1 = node.inputs[0] inp1 = node.inputs[0]
inp2 = node.inputs[1] inp2 = node.inputs[1]
if (not isinstance(inp1.type, GpuArrayType) or if (not isinstance(inp1.type, GpuArrayType) or
not isinstance(inp2.type, GpuArrayType)): not dnn_available(inp1.type.context_name)):
return None
if not dnn_available(inp1.type.context_name):
return None return None
if node.op.filter_flip: if node.op.filter_flip:
...@@ -1406,12 +1408,12 @@ def local_pool_dnn_alternative(node, ctx_name): ...@@ -1406,12 +1408,12 @@ def local_pool_dnn_alternative(node, ctx_name):
if not node.op.ignore_border: if not node.op.ignore_border:
return return
img, = node.inputs img, = node.inputs
img = as_gpuarray_variable(img, ctx_name)
ds = node.op.ds ds = node.op.ds
stride = node.op.st stride = node.op.st
pad = node.op.padding pad = node.op.padding
mode = node.op.mode mode = node.op.mode
return dnn_pool(gpu_contiguous(img.owner.inputs[0]), return dnn_pool(gpu_contiguous(img), ds, stride=stride, pad=pad, mode=mode)
ds, stride=stride, pad=pad, mode=mode)
@register_opt('cudnn') @register_opt('cudnn')
...@@ -1422,6 +1424,9 @@ def local_pool_dnn_grad_stride(node, ctx_name): ...@@ -1422,6 +1424,9 @@ def local_pool_dnn_grad_stride(node, ctx_name):
if not node.op.ignore_border: if not node.op.ignore_border:
return return
inp, out, out_grad = node.inputs inp, out, out_grad = node.inputs
inp = as_gpuarray_variable(inp, ctx_name)
out = as_gpuarray_variable(out, ctx_name)
out_grad = as_gpuarray_variable(out_grad, ctx_name)
ds = node.op.ds ds = node.op.ds
st = node.op.st st = node.op.st
pad = node.op.padding pad = node.op.padding
...@@ -1442,6 +1447,8 @@ def local_avg_pool_dnn_grad_stride(node, ctx_name): ...@@ -1442,6 +1447,8 @@ def local_avg_pool_dnn_grad_stride(node, ctx_name):
if not node.op.ignore_border: if not node.op.ignore_border:
return return
inp, out_grad = node.inputs inp, out_grad = node.inputs
inp = as_gpuarray_variable(inp, ctx_name)
out_grad = as_gpuarray_variable(out_grad, ctx_name)
ds = node.op.ds ds = node.op.ds
st = node.op.st st = node.op.st
pad = node.op.padding pad = node.op.padding
...@@ -1530,8 +1537,7 @@ def local_softmax_dnn_grad(node, ctx_name): ...@@ -1530,8 +1537,7 @@ def local_softmax_dnn_grad(node, ctx_name):
return return
ins = [] ins = []
for n in node.inputs: for n in node.inputs:
if isinstance(n.owner.op, HostFromGpu): n = as_gpuarray_variable(n, ctx_name)
n = n.owner.inputs[0]
if n.ndim != 2: if n.ndim != 2:
return return
ins.append(n.dimshuffle(0, 1, 'x', 'x')) ins.append(n.dimshuffle(0, 1, 'x', 'x'))
......
...@@ -327,8 +327,7 @@ def local_gpureshape(node, context_name): ...@@ -327,8 +327,7 @@ def local_gpureshape(node, context_name):
@register_opt('fast_compile') @register_opt('fast_compile')
@op_lifter([tensor.Rebroadcast]) @op_lifter([tensor.Rebroadcast])
def local_gpu_rebroadcast(node, context_name): def local_gpu_rebroadcast(node, context_name):
if isinstance(node.inputs[0].owner.op, HostFromGpu): return node.op(as_gpuarray_variable(node.inputs[0], context_name))
return node.op(node.inputs[0].owner.inputs[0])
@register_opt('fast_compile') @register_opt('fast_compile')
...@@ -784,10 +783,9 @@ def local_gpua_softmaxwithbias(node, context_name): ...@@ -784,10 +783,9 @@ def local_gpua_softmaxwithbias(node, context_name):
@register_opt('fast_compile') @register_opt('fast_compile')
@op_lifter([theano.tensor.opt.Assert]) @op_lifter([theano.tensor.opt.Assert])
def local_assert(node, context_name): def local_assert(node, context_name):
if (node.inputs[0].owner and return [host_from_gpu(node.op(as_gpuarray_variable(node.inputs[0],
isinstance(node.inputs[0].owner.op, HostFromGpu)): context_name),
return [host_from_gpu(node.op(node.inputs[0].owner.inputs[0], node.inputs[1:]))]
*node.inputs[1:]))]
@register_opt('fast_compile') @register_opt('fast_compile')
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论