提交 4f2b2687 authored 作者: Harm de Vries's avatar Harm de Vries

old interface compatible

上级 bc5b983f
...@@ -1879,7 +1879,7 @@ class _Linker(gof.link.LocalLinker): ...@@ -1879,7 +1879,7 @@ class _Linker(gof.link.LocalLinker):
thunk.outputs = [storage_map[v] for v in node.outputs] thunk.outputs = [storage_map[v] for v in node.outputs]
thunk_other = thunk thunk_other = thunk
else: else:
new_node = node.op.prepare_node(node) new_node = node.op.prepare_node(node, storage_map, compute_map)
if new_node is not None: if new_node is not None:
node = new_node node = new_node
......
...@@ -836,7 +836,7 @@ class Op(utils.object2, PureOp, CLinkerOp): ...@@ -836,7 +836,7 @@ class Op(utils.object2, PureOp, CLinkerOp):
else: else:
return NotImplemented return NotImplemented
def prepare_node(self, node): def prepare_node(self, node, storage_map, compute_map):
""" """
Make any special modifications that the Op needs before doing Make any special modifications that the Op needs before doing
make_thunk(). make_thunk().
...@@ -955,7 +955,8 @@ class Op(utils.object2, PureOp, CLinkerOp): ...@@ -955,7 +955,8 @@ class Op(utils.object2, PureOp, CLinkerOp):
""" """
logger = logging.getLogger('theano.gof.op.Op') logger = logging.getLogger('theano.gof.op.Op')
new_node = self.prepare_node(node) new_node = self.prepare_node(node, storage_map=storage_map,
compute_map=compute_map)
if new_node is not None: if new_node is not None:
node = new_node node = new_node
...@@ -1214,7 +1215,8 @@ int main( int argc, const char* argv[] ) ...@@ -1214,7 +1215,8 @@ int main( int argc, const char* argv[] )
self.openmp = False self.openmp = False
theano.config.openmp = False theano.config.openmp = False
def prepare_node(self, node): def prepare_node(self, node, storage_map,
compute_map):
self.update_self_openmp() self.update_self_openmp()
......
...@@ -1379,6 +1379,24 @@ class GpuDnnPool(DnnBase): ...@@ -1379,6 +1379,24 @@ class GpuDnnPool(DnnBase):
assert mode in ('max', 'average_inc_pad', 'average_exc_pad') assert mode in ('max', 'average_inc_pad', 'average_exc_pad')
self.mode = mode self.mode = mode
def prepare_node(self, node, storage_map, compute_map):
if len(node.inputs) == 2:
warnings.warn("Theano GPUDnnPoolGrad internal changed.", stacklevel=3)
# Old interface
self.mode = node.inputs[1].owner.op.mode
ws = theano.tensor.constant(node.inputs[1].owner.op.ws)
st = theano.tensor.constant(node.inputs[1].owner.op.stride)
pad = theano.tensor.constant(node.inputs[1].owner.op.pad)
node.inputs[1] = ws
node.inputs.append(st)
node.inputs.append(pad)
storage_map[ws] = [None]
storage_map[st] = [None]
storage_map[pad] = [None]
compute_map[ws] = [False]
compute_map[st] = [False]
compute_map[pad] = [False]
def make_node(self, img, ws, stride, pad): def make_node(self, img, ws, stride, pad):
img = as_cuda_ndarray_variable(img) img = as_cuda_ndarray_variable(img)
assert (img.ndim in [4, 5]) assert (img.ndim in [4, 5])
...@@ -1442,13 +1460,6 @@ if (pool%(name)s != NULL) { cudnnDestroyPoolingDescriptor(pool%(name)s); } ...@@ -1442,13 +1460,6 @@ if (pool%(name)s != NULL) { cudnnDestroyPoolingDescriptor(pool%(name)s); }
""" % dict(name=name) """ % dict(name=name)
def c_code(self, node, name, inputs, outputs, sub): def c_code(self, node, name, inputs, outputs, sub):
if len(inputs) == 2:
warnings.warn("Theano GPUDnnPoolGrad internal changed.", stacklevel=3)
desc = inputs[1]
ws = desc.ws
stride = desc.stride
pad = desc.pad
else:
ws = inputs[1] ws = inputs[1]
stride = inputs[2] stride = inputs[2]
pad = inputs[3] pad = inputs[3]
...@@ -1593,6 +1604,24 @@ class GpuDnnPoolGrad(DnnBase): ...@@ -1593,6 +1604,24 @@ class GpuDnnPoolGrad(DnnBase):
assert mode in ('max', 'average_inc_pad', 'average_exc_pad') assert mode in ('max', 'average_inc_pad', 'average_exc_pad')
self.mode = mode self.mode = mode
def prepare_node(self, node, storage_map, compute_map):
if len(node.inputs) == 4:
warnings.warn("Theano GPUDnnPoolGrad internal changed.", stacklevel=3)
# Old interface
self.mode = node.inputs[3].owner.op.mode
ws = theano.tensor.constant(node.inputs[3].owner.op.ws)
st = theano.tensor.constant(node.inputs[3].owner.op.stride)
pad = theano.tensor.constant(node.inputs[3].owner.op.pad)
node.inputs[3] = ws
node.inputs.append(st)
node.inputs.append(pad)
storage_map[ws] = [None]
storage_map[st] = [None]
storage_map[pad] = [None]
compute_map[ws] = [False]
compute_map[st] = [False]
compute_map[pad] = [False]
def make_node(self, inp, out, inp_grad, ws, stride, pad): def make_node(self, inp, out, inp_grad, ws, stride, pad):
inp = as_cuda_ndarray_variable(inp) inp = as_cuda_ndarray_variable(inp)
assert (inp.ndim in [4, 5]) assert (inp.ndim in [4, 5])
...@@ -1675,13 +1704,6 @@ if (pool%(name)s != NULL) { cudnnDestroyPoolingDescriptor(pool%(name)s); } ...@@ -1675,13 +1704,6 @@ if (pool%(name)s != NULL) { cudnnDestroyPoolingDescriptor(pool%(name)s); }
# Here the name out and inp are based on the cudnn definition. # Here the name out and inp are based on the cudnn definition.
# Not the definition of this class. # Not the definition of this class.
# This make it complicated. # This make it complicated.
if len(inputs) == 4:
warnings.warn("Theano GPUDnnPoolGrad internal changed.", stacklevel=3)
out, inp, inp_grad, desc = inputs
ws = desc.ws
stride = desc.stride
pad = desc.pad
else:
out, inp, inp_grad, ws, stride, pad = inputs out, inp, inp_grad, ws, stride, pad = inputs
out_grad, = outputs out_grad, = outputs
......
...@@ -347,6 +347,8 @@ def test_pooling(): ...@@ -347,6 +347,8 @@ def test_pooling():
def test_pooling_with_tensor_vars(): def test_pooling_with_tensor_vars():
if not cuda.dnn.dnn_available():
raise SkipTest(cuda.dnn.dnn_available.msg)
x = T.ftensor4() x = T.ftensor4()
ws = theano.shared(numpy.array([2, 2], dtype='int32')) ws = theano.shared(numpy.array([2, 2], dtype='int32'))
st = theano.shared(numpy.array([1, 1], dtype='int32')) st = theano.shared(numpy.array([1, 1], dtype='int32'))
...@@ -393,6 +395,13 @@ def test_pooling_with_tensor_vars(): ...@@ -393,6 +395,13 @@ def test_pooling_with_tensor_vars():
utt.assert_allclose(a, b) utt.assert_allclose(a, b)
def test_old_pool_interface():
if not cuda.dnn.dnn_available():
raise SkipTest(cuda.dnn.dnn_available.msg)
import pickle
pickle.load(open('old_pool_interface.pkl', 'rb'))
def test_pooling3d(): def test_pooling3d():
# CuDNN 3d pooling requires CuDNN v3. Don't test if the CuDNN version is # CuDNN 3d pooling requires CuDNN v3. Don't test if the CuDNN version is
# too old. # too old.
...@@ -654,7 +663,8 @@ class test_DnnSoftMax(test_nnet.test_SoftMax): ...@@ -654,7 +663,8 @@ class test_DnnSoftMax(test_nnet.test_SoftMax):
input_val = numpy.random.normal(0, 1, inp_shape).astype("float32") input_val = numpy.random.normal(0, 1, inp_shape).astype("float32")
out = f(input_val) out = f(input_val)
expected_out = numpy.log(numpy.exp(input_val) / expected_out = numpy.log(
numpy.exp(input_val) /
numpy.exp(input_val).sum(1)[:, None, :, :]) numpy.exp(input_val).sum(1)[:, None, :, :])
utt.assert_allclose(out, expected_out) utt.assert_allclose(out, expected_out)
......
...@@ -792,7 +792,7 @@ class Elemwise(OpenMPOp): ...@@ -792,7 +792,7 @@ class Elemwise(OpenMPOp):
return ret return ret
def prepare_node(self, node): def prepare_node(self, node, storage_map, compute_map):
# Postpone the ufunc building to the last minutes # Postpone the ufunc building to the last minutes
# NumPy ufunc support only up to 31 inputs. # NumPy ufunc support only up to 31 inputs.
# But our c code support more. # But our c code support more.
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论