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

[CRASH] Implement broadcasting of GpuCrossentropySoftmax1HotWithBiasDx

上级 b24d1a8d
...@@ -247,31 +247,42 @@ class GpuCrossentropySoftmax1HotWithBiasDx(GpuOp): ...@@ -247,31 +247,42 @@ class GpuCrossentropySoftmax1HotWithBiasDx(GpuOp):
def c_code_cache_version(self): def c_code_cache_version(self):
# return () # return ()
return (6,) return (7,)
def c_code(self, node, nodename, inp, out, sub): def c_code(self, node, nodename, inp, out, sub):
dnll, sm, y_idx = inp dnll, sm, y_idx = inp
dx, = out dx, = out
fail = sub['fail'] fail = sub['fail']
return """ return """
if ((CudaNdarray_NDIM(%(dnll)s) != 1) // Get `dnll.shape[0]` or set it to zero if `dnll` is a scalar.
const npy_intp %(dnll)s_dims0 = (CudaNdarray_NDIM(%(dnll)s) > 0 ?
CudaNdarray_HOST_DIMS(%(dnll)s)[0] :
(npy_intp) 0);
// Get `dnll.strides[0]` and set it to zero if `dnll` is a scalar
// or a vector with just one element.
const npy_intp %(dnll)s_strides0 = (%(dnll)s_dims0 > 1 ?
CudaNdarray_HOST_STRIDES(%(dnll)s)[0] :
(npy_intp) 0);
if ((CudaNdarray_NDIM(%(dnll)s) > 1)
|| (CudaNdarray_NDIM(%(sm)s) != 2) || (CudaNdarray_NDIM(%(sm)s) != 2)
|| (CudaNdarray_NDIM(%(y_idx)s) != 1)) || (CudaNdarray_NDIM(%(y_idx)s) != 1))
{ {
PyErr_SetString(PyExc_ValueError, "rank error"); PyErr_SetString(PyExc_ValueError, "rank error");
%(fail)s; %(fail)s;
} }
if (CudaNdarray_HOST_DIMS(%(dnll)s)[0] != if (%(dnll)s_dims0 !=
CudaNdarray_HOST_DIMS(%(sm)s)[0]) CudaNdarray_HOST_DIMS(%(sm)s)[0] && %(dnll)s_dims0 > 1)
{ {
PyErr_Format(PyExc_ValueError, PyErr_Format(PyExc_ValueError,
"dnll.shape[0] == %%i, but sm.shape[0] == %%i", "dnll.shape[0] == %%i, but sm.shape[0] == %%i",
CudaNdarray_HOST_DIMS(%(dnll)s)[0], %(dnll)s_dims0,
CudaNdarray_HOST_DIMS(%(sm)s)[0]); CudaNdarray_HOST_DIMS(%(sm)s)[0]);
%(fail)s; %(fail)s;
} }
if (CudaNdarray_HOST_DIMS(%(dnll)s)[0] != if (%(dnll)s_dims0 !=
CudaNdarray_HOST_DIMS(%(y_idx)s)[0]) CudaNdarray_HOST_DIMS(%(y_idx)s)[0] && %(dnll)s_dims0 > 1)
{ {
PyErr_SetString(PyExc_ValueError, PyErr_SetString(PyExc_ValueError,
"dnll.shape[0] != y_idx.shape[0]"); "dnll.shape[0] != y_idx.shape[0]");
...@@ -305,7 +316,7 @@ class GpuCrossentropySoftmax1HotWithBiasDx(GpuOp): ...@@ -305,7 +316,7 @@ class GpuCrossentropySoftmax1HotWithBiasDx(GpuOp):
CudaNdarray_HOST_DIMS(%(dx)s)[1], CudaNdarray_HOST_DIMS(%(dx)s)[1],
CudaNdarray_DEV_DATA(%(dnll)s), CudaNdarray_DEV_DATA(%(dnll)s),
CudaNdarray_HOST_STRIDES(%(dnll)s)[0], %(dnll)s_strides0,
CudaNdarray_DEV_DATA(%(sm)s), CudaNdarray_DEV_DATA(%(sm)s),
CudaNdarray_HOST_STRIDES(%(sm)s)[0], CudaNdarray_HOST_STRIDES(%(sm)s)[0],
......
...@@ -353,7 +353,8 @@ class test_SoftMax(unittest.TestCase): ...@@ -353,7 +353,8 @@ class test_SoftMax(unittest.TestCase):
numpy.product(dims), numpy.product(dims),
dtype='float32' dtype='float32'
).reshape(dims) ).reshape(dims)
T.verify_grad(f_gpu, [gdata], rng=numpy.random) T.verify_grad(f_gpu, [gdata], rng=numpy.random,
mode=mode_with_gpu)
def check_types(graph, graph_gpu): def check_types(graph, graph_gpu):
self._check_types( self._check_types(
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论