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

old interface compatible

上级 bc5b983f
......@@ -1879,7 +1879,7 @@ class _Linker(gof.link.LocalLinker):
thunk.outputs = [storage_map[v] for v in node.outputs]
thunk_other = thunk
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:
node = new_node
......
......@@ -836,7 +836,7 @@ class Op(utils.object2, PureOp, CLinkerOp):
else:
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_thunk().
......@@ -955,7 +955,8 @@ class Op(utils.object2, PureOp, CLinkerOp):
"""
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:
node = new_node
......@@ -1214,7 +1215,8 @@ int main( int argc, const char* argv[] )
self.openmp = False
theano.config.openmp = False
def prepare_node(self, node):
def prepare_node(self, node, storage_map,
compute_map):
self.update_self_openmp()
......
......@@ -1379,6 +1379,24 @@ class GpuDnnPool(DnnBase):
assert mode in ('max', 'average_inc_pad', 'average_exc_pad')
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):
img = as_cuda_ndarray_variable(img)
assert (img.ndim in [4, 5])
......@@ -1442,16 +1460,9 @@ if (pool%(name)s != NULL) { cudnnDestroyPoolingDescriptor(pool%(name)s); }
""" % dict(name=name)
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]
stride = inputs[2]
pad = inputs[3]
ws = inputs[1]
stride = inputs[2]
pad = inputs[3]
out, = outputs
if self.mode == 'max':
......@@ -1593,6 +1604,24 @@ class GpuDnnPoolGrad(DnnBase):
assert mode in ('max', 'average_inc_pad', 'average_exc_pad')
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):
inp = as_cuda_ndarray_variable(inp)
assert (inp.ndim in [4, 5])
......@@ -1675,15 +1704,8 @@ if (pool%(name)s != NULL) { cudnnDestroyPoolingDescriptor(pool%(name)s); }
# Here the name out and inp are based on the cudnn definition.
# Not the definition of this class.
# 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
if self.mode == 'max':
......
......@@ -347,6 +347,8 @@ def test_pooling():
def test_pooling_with_tensor_vars():
if not cuda.dnn.dnn_available():
raise SkipTest(cuda.dnn.dnn_available.msg)
x = T.ftensor4()
ws = theano.shared(numpy.array([2, 2], dtype='int32'))
st = theano.shared(numpy.array([1, 1], dtype='int32'))
......@@ -372,7 +374,7 @@ def test_pooling_with_tensor_vars():
out2 = pool_2d_i2n(x, ds=(2, 2), strides=(1, 1),
pad=(0, 0),
pool_function=T.max)
mode_without_gpu2 = mode_without_gpu.including()
mode_without_gpu2.check_isfinite = False
......@@ -393,6 +395,13 @@ def test_pooling_with_tensor_vars():
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():
# CuDNN 3d pooling requires CuDNN v3. Don't test if the CuDNN version is
# too old.
......@@ -654,8 +663,9 @@ class test_DnnSoftMax(test_nnet.test_SoftMax):
input_val = numpy.random.normal(0, 1, inp_shape).astype("float32")
out = f(input_val)
expected_out = numpy.log(numpy.exp(input_val) /
numpy.exp(input_val).sum(1)[:, None, :, :])
expected_out = numpy.log(
numpy.exp(input_val) /
numpy.exp(input_val).sum(1)[:, None, :, :])
utt.assert_allclose(out, expected_out)
......
......@@ -792,7 +792,7 @@ class Elemwise(OpenMPOp):
return ret
def prepare_node(self, node):
def prepare_node(self, node, storage_map, compute_map):
# Postpone the ufunc building to the last minutes
# NumPy ufunc support only up to 31 inputs.
# But our c code support more.
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论