提交 11b080f2 authored 作者: Yann N. Dauphin's avatar Yann N. Dauphin

added opt and test for pool gradient

上级 75a6593e
......@@ -11,7 +11,8 @@ from theano.sandbox.cuda import (GpuOp, cuda_available, active_device_number,
device_properties)
from theano.sandbox.cuda.basic_ops import (as_cuda_ndarray_variable,
gpu_contiguous)
from theano.sandbox.cuda.blas import GpuConv, GpuDownsampleFactorMax
from theano.sandbox.cuda.blas import (GpuConv, GpuDownsampleFactorMax,
GpuDownsampleFactorMaxGrad)
from theano.sandbox.cuda.nnet import GpuSoftmax
from theano.sandbox.cuda.nvcc_compiler import NVCC_compiler
......@@ -940,12 +941,28 @@ if cuda_available:
if node.op.ignore_border:
return
img, = node.inputs
ds = node.op.ws
ds = node.op.ds
return [dnn_pool(gpu_contiguous(img), ds, ds)]
gpu_optimizer.register("pool_cudnn", local_pool_dnn, 'cudnn')
@local_optimizer([GpuDownsampleFactorMaxGrad])
def local_pool_dnn_grad(node):
if isinstance(node.op, GpuDownsampleFactorMaxGrad):
if node.op.ignore_border:
return
inp, out, inp_grad = node.inputs
ds = node.op.ds
desc = GpuDnnPoolDesc(ws=ds, stride=ds, mode="max")()
return [GpuDnnPoolGrad()(gpu_contiguous(inp),
gpu_contiguous(inp_grad), gpu_contiguous(out), desc)]
gpu_optimizer.register("pool_cudnn_grad", local_pool_dnn_grad, 'cudnn')
@local_optimizer([GpuSoftmax])
def local_softmax_dnn(node):
if isinstance(node.op, GpuSoftmax):
......
......@@ -76,9 +76,17 @@ def test_pooling_opt():
x = T.tensor4()
f = theano.function([x],
max_pool_2d(x, ds=(2, 2)), mode=theano.compile.mode.get_mode('FAST_RUN').including("cudnn"))
max_pool_2d(x, ds=(2, 2)),
mode=theano.compile.mode.get_mode('FAST_RUN').including("cudnn"))
assert any([isinstance(n.op, cuda.dnn.GpuDnnPool)
for n in f.maker.fgraph.toposort()])
f = theano.function([x],
T.grad(max_pool_2d(x, ds=(2, 2)).sum(), x),
mode=theano.compile.mode.get_mode('FAST_RUN').including("cudnn"))
assert any([isinstance(n.op, cuda.dnn.GpuDnnPoolGrad)
for n in f.maker.fgraph.toposort()])
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论