def dconvw(img, kern, out): desc = dnn.GpuDnnConvDesc(border_mode='valid', subsample=(1, 1), conv_mode='conv')(img.shape, kern.shape) return dnn.GpuDnnConvGradW()(img, out, kern, desc, alpha=0.75, beta=-1.0)
def test_dnn_conv_desc_merge(): img_shp = T.as_tensor_variable(numpy.asarray([2, 1, 8, 8]).astype('int64')) kern_shp = T.as_tensor_variable( numpy.asarray([3, 1, 2, 2]).astype('int64')) desc1 = dnn.GpuDnnConvDesc(border_mode='valid', subsample=(2, 2), conv_mode='conv')(img_shp, kern_shp) desc2 = dnn.GpuDnnConvDesc(border_mode='full', subsample=(1, 1), conv_mode='cross')(img_shp, kern_shp) # CDataType is not DeepCopyable so this will crash if we don't use # borrow=True f = theano.function( [], [theano.Out(desc1, borrow=True), theano.Out(desc2, borrow=True)]) d1, d2 = f() # This will be the case if they are merged, which would be bad. assert d1 != d2
def test_dnn_conv_desc_merge(): if not cuda.dnn.dnn_available(): raise SkipTest(cuda.dnn.dnn_available.msg) img_shp = T.as_tensor_variable( numpy.asarray([2, 1, 8, 8]).astype('int64')) kern_shp = T.as_tensor_variable( numpy.asarray([3, 1, 2, 2]).astype('int64')) desc1 = dnn.GpuDnnConvDesc(border_mode='valid', subsample=(2, 2), conv_mode='conv')(img_shp, kern_shp) desc2 = dnn.GpuDnnConvDesc(border_mode='full', subsample=(1, 1), conv_mode='cross')(img_shp, kern_shp) # CDataType is not DeepCopyable so this will crash if we don't use # borrow=True f = theano.function([], [theano.Out(desc1, borrow=True), theano.Out(desc2, borrow=True)], mode=mode_with_gpu) d1, d2 = f() # This will be the case if they are merged, which would be bad. assert d1 != d2 desc1v2 = dnn.GpuDnnConvDesc(border_mode='valid', subsample=(2, 2), conv_mode='conv')(img_shp, kern_shp) f = theano.function([], [theano.Out(desc1, borrow=True), theano.Out(desc1v2, borrow=True)], mode=mode_with_gpu) assert len([n for n in f.maker.fgraph.apply_nodes if isinstance(n.op, dnn.GpuDnnConvDesc)]) == 1 # CDATA type don't equal even if they represent the same object # So we can't use debugmode with it. if theano.config.mode not in ["DebugMode", "DEBUG_MODE"]: d1, d2 = f() # They won't be equal if they aren't merged. assert d1 == d2
def test_conv_gradw(self): if not dnn.dnn_available(): raise SkipTest(dnn.dnn_available.msg) img = T.ftensor4('img') kerns = T.ftensor4('kerns') out = T.ftensor4('out') img_val = numpy.asarray( numpy.random.rand(2, 5, 6, 8), dtype='float32' ) kern_vals = numpy.asarray( numpy.random.rand(2, 1, 5, 6), dtype='float32' ) for params in product( ['valid', 'full'], [(1, 1)], # strides besides (1, 1) ['conv', 'cross'] ): temp_img = img.dimshuffle(1, 0, 2, 3) temp_kerns = kerns if params[2] == 'conv': temp_kerns = temp_kerns[:, :, ::-1, ::-1] temp_kerns = temp_kerns.dimshuffle(1, 0, 2, 3) shape = ( kern_vals.shape[1], img_val.shape[1], img_val.shape[2] - kern_vals.shape[2] + 1, img_val.shape[3] - kern_vals.shape[3] + 1 ) out_vals = numpy.zeros(shape, dtype='float32') desc = dnn.GpuDnnConvDesc( border_mode=params[0], subsample=params[1], conv_mode=params[2] )(temp_img.shape, out.shape) conv_grad_w = dnn.GpuDnnConvGradW()( temp_img, temp_kerns, out, desc, ) self._compile_and_check( [temp_img, temp_kerns, out], [conv_grad_w], [img_val, kern_vals, out_vals], dnn.GpuDnnConvGradW )
def test_conv(self): img = T.ftensor4('img') kerns = T.ftensor4('kerns') img_val = numpy.asarray(numpy.random.rand(3, 4, 5, 6), dtype='float32') kern_vals = numpy.asarray(numpy.random.rand(3, 4, 5, 6), dtype='float32') for params in product(['valid', 'full'], [(1, 1), (2, 2)], ['conv', 'cross']): desc = dnn.GpuDnnConvDesc(border_mode=params[0], subsample=params[1], conv_mode=params[2])(img.shape, kerns.shape) conv = dnn.GpuDnnConv()(img_val, kern_vals, desc) self._compile_and_check([img, kerns], [conv], [img_val, kern_vals], dnn.GpuDnnConv)
def test_conv_gradi(self): if not dnn.dnn_available(): raise SkipTest(dnn.dnn_available.msg) img = T.ftensor4('img') kerns = T.ftensor4('kerns') out = T.ftensor4('out') img_val = numpy.asarray( numpy.random.rand(3, 4, 5, 6), dtype='float32' ) kern_vals = numpy.asarray( numpy.random.rand(13, 14, 15, 16), dtype='float32' ) for params in product( ['valid'], # Should this work for 'full'? [(1, 1)], ['conv', 'cross'] ): temp_kerns = kerns.dimshuffle(1, 0, 2, 3) shape = ( img_val.shape[0], kern_vals.shape[1], img_val.shape[2] + kern_vals.shape[2] - 1, img_val.shape[3] + kern_vals.shape[3] - 1 ) out_vals = numpy.zeros(shape, dtype='float32') desc = dnn.GpuDnnConvDesc( border_mode=params[0], subsample=params[1], conv_mode=params[2] )(out.shape, temp_kerns.shape) conv_grad_i = dnn.GpuDnnConvGradI()( temp_kerns, img, out, desc, ) self._compile_and_check( [temp_kerns, img, out], [conv_grad_i], [kern_vals, img_val, out_vals], dnn.GpuDnnConvGradI )
def test_conv3d_gradi(self): if not (cuda.dnn.dnn_available() and dnn.version() >= (2000, 2000)): raise SkipTest('"CuDNN 3D convolution requires CuDNN v2') ftensor5 = T.TensorType(dtype="float32", broadcastable=(False,) * 5) img = ftensor5('img') kerns = ftensor5('kerns') out = ftensor5('out') img_val = numpy.asarray( numpy.random.rand(8, 4, 6, 7, 5), dtype='float32' ) kern_vals = numpy.asarray( numpy.random.rand(9, 4, 5, 1, 2), dtype='float32' ) for params in product( ['valid', 'full'], [(1, 1, 1), (2, 2, 2)], ['conv', 'cross'] ): out_vals = numpy.zeros( dnn.GpuDnnConv3d.get_out_shape(img_val.shape, kern_vals.shape, border_mode=params[0], subsample=params[1]), dtype='float32') desc = dnn.GpuDnnConvDesc( border_mode=params[0], subsample=params[1], conv_mode=params[2] )(img.shape, kerns.shape) conv_grad_i = dnn.GpuDnnConv3dGradI()( kerns, out, img, desc, ) self._compile_and_check( [kerns, out, img], [conv_grad_i], [kern_vals, out_vals, img_val], dnn.GpuDnnConv3dGradI )
def upconv(x, w, stride, x_shape=None, w_shape=None, axis_order='dnn'): assert stride is not None stride = tuple(stride) conv_dim = len(stride) border_mode = 'valid' # if (x_shape is None) or (None in x_shape): # variable batch size or so # x_shape = None if conv_dim==1: x = x.dimshuffle(0, 1, 2, 'x') w = w.dimshuffle(0, 1, 2, 'x') if w_shape is not None: w_shape = list(w_shape) + [1, ] if x_shape is not None: x_shape = list(x_shape) + [1, ] stride = list(stride) + [1, ] y = conv2d_grad_wrt_inputs(x, w, x_shape, w_shape, border_mode, subsample=stride, filter_flip=False) y = y[:, :, :, 0] elif conv_dim==2: y = conv2d_grad_wrt_inputs(x, w, x_shape, w_shape, border_mode, subsample=stride, filter_flip=False) elif conv_dim==3: if not dnn_avail or axis_order!='dnn': raise ValueError("Need dnn and dnn axis order") kerns = dnn.gpu_contiguous(w) image = dnn.gpu_contiguous(x) k = kerns.shape[1] img_sh = list(image.shape) out_sh = img_sh[:1] + [k,] + [st*sh for st, sh in zip(stride, img_sh[2:])] out = dnn.gpu_alloc_empty(*out_sh) desc = dnn.GpuDnnConvDesc(border_mode='valid', subsample=stride, conv_mode='cross')(out.shape, kerns.shape) y = dnn.GpuDnnConv3dGradI()(kerns, image, out, desc) return y
def test_dnn_conv_merge(): """This test that we merge correctly multiple dnn_conv. This can is more difficult due to GpuEmptyAlloc that aren't merged. """ if not cuda.dnn.dnn_available(): raise SkipTest(cuda.dnn.dnn_available.msg) img_shp = [2, 5, 6, 8] kern_shp = [3, 5, 5, 6] img = T.ftensor4('img') kern = T.ftensor4('kern') out = T.ftensor4('out') desc = dnn.GpuDnnConvDesc( border_mode='valid')(img.shape, kern.shape) # Test forward op o1 = dnn.dnn_conv(img, kern) o2 = dnn.dnn_conv(img, kern) f = theano.function([img, kern], [o1, o2], mode=mode_with_gpu) d1, d2 = f(numpy.random.rand(*img_shp).astype('float32'), numpy.random.rand(*kern_shp).astype('float32')) topo = f.maker.fgraph.toposort() assert len([n for n in topo if isinstance(n.op, dnn.GpuDnnConv)]) == 1 # Test grad w op o1 = dnn.GpuDnnConvGradW()(img, kern, out, desc) o2 = dnn.GpuDnnConvGradW()(img, kern, out, desc) f = theano.function([img, kern, out], [o1, o2], mode=mode_with_gpu) topo = f.maker.fgraph.toposort() assert len([n for n in topo if isinstance(n.op, dnn.GpuDnnConvGradW)]) == 1 # Test grad i op o1 = dnn.GpuDnnConvGradI()(img, kern, out, desc) o2 = dnn.GpuDnnConvGradI()(img, kern, out, desc) f = theano.function([img, kern, out], [o1, o2], mode=mode_with_gpu) topo = f.maker.fgraph.toposort() assert len([n for n in topo if isinstance(n.op, dnn.GpuDnnConvGradI)]) == 1
def test_conv(self): if not dnn.dnn_available(): raise SkipTest(dnn.dnn_available.msg) img = T.ftensor4('img') kerns = T.ftensor4('kerns') out = T.ftensor4('out') img_val = numpy.asarray( numpy.random.rand(7, 2, 6, 4), dtype='float32' ) kern_vals = numpy.asarray( numpy.random.rand(8, 2, 4, 3), dtype='float32' ) for params in product( ['valid', 'full'], [(1, 1), (2, 2)], ['conv', 'cross'] ): out_vals = numpy.zeros( dnn.GpuDnnConv.get_out_shape(img_val.shape, kern_vals.shape, border_mode=params[0], subsample=params[1]), dtype='float32') desc = dnn.GpuDnnConvDesc( border_mode=params[0], subsample=params[1], conv_mode=params[2] )(img.shape, kerns.shape) conv = dnn.GpuDnnConv()(img, kerns, out, desc) self._compile_and_check( [img, kerns, out], [conv], [img_val, kern_vals, out_vals], dnn.GpuDnnConv )
def test_conv_gradi(self): img = T.ftensor4('img') kerns = T.ftensor4('kerns') img_val = numpy.asarray(numpy.random.rand(3, 4, 5, 6), dtype='float32') kern_vals = numpy.asarray(numpy.random.rand(3, 4, 5, 6), dtype='float32') for params in product( ['valid'], # Should this work for 'full'? [(1, 1)], ['conv', 'cross']): print params temp_kerns = kerns.dimshuffle(1, 0, 2, 3) shape = theano.tensor.stack(img.shape[0], temp_kerns.shape[1], img.shape[2] + temp_kerns.shape[2] - 1, img.shape[3] + temp_kerns.shape[3] - 1) desc = dnn.GpuDnnConvDesc(border_mode=params[0], subsample=params[1], conv_mode=params[2])(shape, temp_kerns.shape) conv_grad_i = dnn.GpuDnnConvGradI()(temp_kerns, img, desc, shape[2], shape[3]) self._compile_and_check([temp_kerns, img], [conv_grad_i], [kern_vals, img_val], dnn.GpuDnnConvGradI)