提交 067133b0 authored 作者: Frédéric Bastien's avatar Frédéric Bastien 提交者: GitHub

Merge pull request #4957 from aalmah/multinomial_sample

Fix to use new GPU backend op for multinomial
...@@ -28,7 +28,7 @@ from .type import (GpuArrayType, GpuArrayVariable, GpuArrayConstant, ...@@ -28,7 +28,7 @@ from .type import (GpuArrayType, GpuArrayVariable, GpuArrayConstant,
GpuArraySharedVariable, gpuarray_shared_constructor, GpuArraySharedVariable, gpuarray_shared_constructor,
reg_context, get_context, ContextNotDefined) reg_context, get_context, ContextNotDefined)
from .basic_ops import as_gpuarray_variable from .basic_ops import as_gpuarray_variable
from . import fft, dnn, opt, nerv, extra_ops from . import fft, dnn, opt, nerv, extra_ops, multinomial
def transfer(x, target): def transfer(x, target):
try: try:
......
...@@ -12,15 +12,15 @@ import theano.sandbox.multinomial ...@@ -12,15 +12,15 @@ import theano.sandbox.multinomial
from theano import Apply, config from theano import Apply, config
from theano.gof import Op from theano.gof import Op
from theano import gpuarray
from theano.tensor import NotScalarConstantError, get_scalar_constant_value from theano.tensor import NotScalarConstantError, get_scalar_constant_value
from .basic_ops import as_gpuarray_variable, infer_context_name from .basic_ops import as_gpuarray_variable, infer_context_name, GpuKernelBase, Kernel
from .opt import register_opt, op_lifter, register_opt2 from .opt import register_opt, op_lifter, register_opt2
from .type import GpuArrayType from .type import GpuArrayType
from .elemwise import GpuDimShuffle
from theano.scalar import as_scalar from theano.scalar import as_scalar
class GPUAMultinomialFromUniform(gpuarray.basic_ops.GpuKernelBase, Op): class GPUAMultinomialFromUniform(GpuKernelBase, Op):
__props__ = ("odtype",) __props__ = ("odtype",)
def __init__(self, odtype): def __init__(self, odtype):
...@@ -106,7 +106,7 @@ KERNEL void k_multi_warp_multinomial( ...@@ -106,7 +106,7 @@ KERNEL void k_multi_warp_multinomial(
} }
} }
""" """
return [gpuarray.basic_ops.Kernel( return [Kernel(
code=code, name="k_multi_warp_multinomial", code=code, name="k_multi_warp_multinomial",
params=[pygpu.gpuarray.SIZE, params=[pygpu.gpuarray.SIZE,
pygpu.gpuarray.SIZE, pygpu.gpuarray.SIZE,
...@@ -118,7 +118,7 @@ KERNEL void k_multi_warp_multinomial( ...@@ -118,7 +118,7 @@ KERNEL void k_multi_warp_multinomial(
pygpu.gpuarray.GpuArray, pygpu.gpuarray.GpuArray,
pygpu.gpuarray.SSIZE, pygpu.gpuarray.SSIZE,
pygpu.gpuarray.SSIZE], pygpu.gpuarray.SSIZE],
flags=gpuarray.basic_ops.Kernel.get_flags(node.outputs[0].dtype), flags=Kernel.get_flags(node.outputs[0].dtype),
objvar='k_multi_warp_multinomial_' + name)] objvar='k_multi_warp_multinomial_' + name)]
def c_code(self, node, name, inp, outputs, sub): def c_code(self, node, name, inp, outputs, sub):
...@@ -229,7 +229,7 @@ KERNEL void k_multi_warp_multinomial( ...@@ -229,7 +229,7 @@ KERNEL void k_multi_warp_multinomial(
return (1,) return (1,)
class GPUAMultinomialWOReplacementFromUniform(gpuarray.basic_ops.GpuKernelBase, Op): class GPUAMultinomialWOReplacementFromUniform(GpuKernelBase, Op):
""" """
The output is transposed compared to MultinomialWOReplacementFromUniform. The output is transposed compared to MultinomialWOReplacementFromUniform.
We must insert a Transpose op after it. We must insert a Transpose op after it.
...@@ -328,7 +328,7 @@ KERNEL void k_multi_warp_multinomial_wor( ...@@ -328,7 +328,7 @@ KERNEL void k_multi_warp_multinomial_wor(
} }
} }
""" """
return [gpuarray.basic_ops.Kernel( return [Kernel(
code=code, name="k_multi_warp_multinomial_wor", code=code, name="k_multi_warp_multinomial_wor",
params=[pygpu.gpuarray.SIZE, params=[pygpu.gpuarray.SIZE,
pygpu.gpuarray.SIZE, pygpu.gpuarray.SIZE,
...@@ -342,7 +342,7 @@ KERNEL void k_multi_warp_multinomial_wor( ...@@ -342,7 +342,7 @@ KERNEL void k_multi_warp_multinomial_wor(
pygpu.gpuarray.SSIZE, pygpu.gpuarray.SSIZE,
pygpu.gpuarray.SSIZE pygpu.gpuarray.SSIZE
], ],
flags=gpuarray.basic_ops.Kernel.get_flags(node.outputs[0].dtype), flags=Kernel.get_flags(node.outputs[0].dtype),
objvar='k_multi_warp_multinomial_wor_' + name)] objvar='k_multi_warp_multinomial_wor_' + name)]
def c_code(self, node, name, inp, outputs, sub): def c_code(self, node, name, inp, outputs, sub):
...@@ -481,7 +481,7 @@ def local_gpua_multinomial(op, context_name, inputs, outputs): ...@@ -481,7 +481,7 @@ def local_gpua_multinomial(op, context_name, inputs, outputs):
m, = outputs m, = outputs
if (p.dtype == u.dtype == m.dtype == 'float32'): if (p.dtype == u.dtype == m.dtype == 'float32'):
gpu_op = GPUAMultinomialFromUniform(op.odtype) gpu_op = GPUAMultinomialFromUniform(op.odtype)
return gpuarray.elemwise.GpuDimShuffle([False, False], [1, 0])( return GpuDimShuffle([False, False], [1, 0])(
gpu_op(p, u)) gpu_op(p, u))
...@@ -494,5 +494,5 @@ def local_gpua_multinomial_wor(op, context_name, inputs, outputs): ...@@ -494,5 +494,5 @@ def local_gpua_multinomial_wor(op, context_name, inputs, outputs):
m, = outputs m, = outputs
if ((p.dtype == u.dtype == 'float32') and (m.dtype == 'int64')): if ((p.dtype == u.dtype == 'float32') and (m.dtype == 'int64')):
gpu_op = GPUAMultinomialWOReplacementFromUniform(op.odtype) gpu_op = GPUAMultinomialWOReplacementFromUniform(op.odtype)
return gpuarray.elemwise.GpuDimShuffle([False, False], [1, 0])( return GpuDimShuffle([False, False], [1, 0])(
gpu_op(p, u, n)) gpu_op(p, u, n))
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论