Separate spatialtf gradients, for inputs and transformation, into separate Ops

上级 6a393de7
#section support_code_struct
int
dnn_sptf_gi(PyGpuArrayObject * input,
PyGpuArrayObject * theta,
PyGpuArrayObject * grid,
PyArrayObject * grid_dims,
PyGpuArrayObject * dy,
cudnnSpatialTransformerDescriptor_t desc,
double alpha, double beta,
PyGpuArrayObject ** input_grad,
PyGpuArrayObject ** grid_grad,
cudnnHandle_t _handle)
{
PyErr_SetString(PyExc_NotImplementedError, "Gradient for spatial transformer is not yet implemented.");
return -1;
}
#section support_code_struct
int
dnn_sptf_grad(PyGpuArrayObject * input,
PyGpuArrayObject * theta,
PyGpuArrayObject * grid,
PyArrayObject * grid_dims,
PyGpuArrayObject * dy,
cudnnSpatialTransformerDescriptor_t desc,
double alpha, double beta,
PyGpuArrayObject ** output_grad,
PyGpuArrayObject ** grid_grad,
cudnnHandle_t _handle)
{
PyErr_SetString(PyExc_NotImplementedError, "Gradient for spatial transformer is not yet implemented.");
return -1;
}
#section support_code_struct
int
dnn_sptf_gt(PyGpuArrayObject * dgrid,
cudnnSpatialTransformerDescriptor_t desc,
PyGpuArrayObject ** dtheta,
cudnnHandle_t _handle)
{
PyErr_SetString(PyExc_NotImplementedError, "Gradient for spatial transformer is not yet implemented.");
return -1;
}
...@@ -2937,38 +2937,67 @@ class GpuDnnTransformer(DnnBase): ...@@ -2937,38 +2937,67 @@ class GpuDnnTransformer(DnnBase):
_, grid = outputs _, grid = outputs
dy = grads[0] dy = grads[0]
gop = GpuDnnTransformerGrad(self.dtype)(img, theta, grid, grid_dims, dy, dimg, dgrid = GpuDnnTransformerGradI(self.dtype)(img, theta, grid, grid_dims, dy,
desc, alpha, beta) desc, alpha, beta)
dtheta = GpuDnnTransformerGradT(self.dtype)(dgrid, desc)
return gop return [dimg, dtheta,
theano.gradient.grad_undefined(self, 2, grid_dims),
theano.gradient.grad_undefined(self, 3, desc),
theano.gradient.grad_undefined(self, 4, alpha),
theano.gradient.grad_undefined(self, 5, beta)]
class GpuDnnTransformerGrad(DnnBase): class GpuDnnTransformerGradI(DnnBase):
"""
Gradients of inputs of the spatial transformer
"""
__props__ = ('dtype',) __props__ = ('dtype',)
_cop_num_inputs = 8 _cop_num_inputs = 8
_cop_num_outputs = 2 _cop_num_outputs = 1
_f16_ok = True _f16_ok = True
def __init__(self, dtype=theano.config.floatX): def __init__(self, dtype=theano.config.floatX):
DnnBase.__init__(self, ["c_code/dnn_sptf_grad.c"], "dnn_sptf_grad") DnnBase.__init__(self, ["c_code/dnn_sptf_gi.c"], "dnn_sptf_gi")
self.dtype = dtype self.dtype = dtype
def make_node(self, img, theta, grid, grid_dims, dy, desc, alpha, beta): def make_node(self, img, theta, grid, grid_dims, dy, desc, alpha, beta):
context_name = infer_context_name(img) context_name = infer_context_name(img)
dy = as_gpuarray_variable(dy, context_name)
dimg = GpuArrayType(dtype=self.dtype, dimg = GpuArrayType(dtype=self.dtype,
broadcastable=img.type.ndim * (False,), broadcastable=img.type.ndim * (False,),
context_name=context_name)() context_name=context_name)()
dtheta = GpuArrayType(dtype=self.dtype, dgrid = GpuArrayType(dtype=self.dtype,
broadcastable=theta.type.ndim * (False,), broadcastable=img.type.ndim * (False,),
context_name=context_name)() context_name=context_name)()
inputs = [img, theta, grid, grid_dims, dy, desc, alpha, beta] inputs = [img, theta, grid, grid_dims, dy, desc, alpha, beta]
outputs = [dimg, dtheta, outputs = [dimg, dgrid]
theano.gradient.grad_undefined(self, 2, grid_dims),
theano.gradient.grad_undefined(self, 3, desc), return Apply(self, inputs, outputs)
theano.gradient.grad_undefined(self, 4, alpha),
theano.gradient.grad_undefined(self, 5, beta)]
class GpuDnnTransformerGradT(DnnBase):
"""
Gradients of the affine transformation generated by the localisation network
"""
__props__ = ('dtype',)
_cop_num_inputs = 2
_cop_num_outputs = 1
_f16_ok = True
def __init__(self, dtype=theano.config.floatX):
DnnBase.__init__(self, ["c_code/dnn_sptf_gt.c"], "dnn_sptf_gt")
self.dtype = dtype
def make_node(self, dgrid, desc):
context_name = infer_context_name(dgrid)
dtheta = GpuArrayType(dtype=self.dtype,
broadcastable=(dgrid.type.ndim - 1) * (False,),
context_name=context_name)()
inputs = [dgrid, desc]
outputs = [dtheta]
return Apply(self, inputs, outputs) return Apply(self, inputs, outputs)
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论