提交 a99724e3 authored 作者: Cesar Laurent's avatar Cesar Laurent

Fixed old interface test and c_code_cache_versions

上级 feca2aa7
......@@ -242,14 +242,14 @@ class Pool(OpenMPOp):
self.mode = mode
def prepare_node(self, node, storage_map, compute_map):
if len(node.inputs) == 2:
if len(node.inputs) == 1:
warnings.warn("Theano Pool 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
self.mode = node.op.mode
ws = theano.tensor.constant(node.op.ds)
st = theano.tensor.constant(node.op.st)
pad = theano.tensor.constant(node.op.padding)
node.inputs.append(ws)
node.inputs.append(st)
node.inputs.append(pad)
if isinstance(ws, theano.Constant):
......@@ -578,7 +578,7 @@ class Pool(OpenMPOp):
return ccode % locals()
def c_code_cache_version(self):
return (0, 6, 8, 4, self.openmp)
return (0, 6, 8, 5, self.openmp)
class PoolGrad(OpenMPOp):
......@@ -674,14 +674,14 @@ class PoolGrad(OpenMPOp):
super(PoolGrad, self).__init__(openmp=openmp)
def prepare_node(self, node, storage_map, compute_map):
if len(node.inputs) == 4:
if len(node.inputs) < 5: # 5 for AveragePoolGrad, 6 for MaxPoolGrad
warnings.warn("Theano PoolGrad 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
self.mode = node.op.mode
ws = theano.tensor.constant(node.op.ds)
st = theano.tensor.constant(node.op.st)
pad = theano.tensor.constant(node.op.padding)
node.inputs.append(ws)
node.inputs.append(st)
node.inputs.append(pad)
if isinstance(ws, theano.Constant):
......@@ -900,7 +900,7 @@ class MaxPoolGrad(PoolGrad):
""" % locals()
def c_code_cache_version(self):
return (0, 7, self.openmp)
return (0, 8, self.openmp)
class AveragePoolGrad(PoolGrad):
......@@ -1152,7 +1152,7 @@ class DownsampleFactorMaxGradGrad(OpenMPOp):
for(int i=0; i < z_r; i++){
r_st = i * st0;
r_end = r_st + ws0;
// skip the paddin_g
// skip the padding
r_st = r_st < pd0 ? pd0 : r_st;
r_end = r_end > (r - pd0) ? r - pd0 : r_end;
// from padded_img space to img space
......@@ -1190,4 +1190,4 @@ class DownsampleFactorMaxGradGrad(OpenMPOp):
""" % locals()
def c_code_cache_version(self):
return (0, 1, self.openmp)
return (0, 2, self.openmp)
......@@ -845,11 +845,12 @@ class TestDownsampleFactorMax(utt.InferShapeTester):
utt.assert_allclose(var_dx, fix_dx)
def test_old_pool_interface(self):
# 1. Load the old version
testfile_dir = os.path.dirname(os.path.realpath(__file__))
fname = 'old_pool_interface.pkl'
with open(os.path.join(testfile_dir, fname), 'rb') as fp:
try:
cPickle.load(fp)
old_fct = cPickle.load(fp)
except ImportError:
# Windows sometimes fail with nonsensical errors like:
# ImportError: No module named type
......@@ -859,6 +860,22 @@ class TestDownsampleFactorMax(utt.InferShapeTester):
exc_type, exc_value, exc_trace = sys.exc_info()
reraise(SkipTest, exc_value, exc_trace)
raise
# 2. Create the new version
x = theano.tensor.ftensor4()
y = pool_2d(x, (2, 2), mode='max', ignore_border=True)
z = pool_2d(x, (2, 2), mode='average_exc_pad', ignore_border=True)
dy_dx = theano.gradient.grad(y.sum(), x)
dz_dx = theano.gradient.grad(z.sum(), x)
new_fct = theano.function([x], [y, z, dy_dx, dz_dx])
# 3. Assert that the answer is the same
rng = numpy.random.RandomState(utt.fetch_seed())
image_val = rng.rand(4, 6, 7, 9).astype(numpy.float32)
old_out = old_fct(image_val)
new_out = new_fct(image_val)
for o, n in zip(old_out, new_out):
utt.assert_allclose(o, n)
def test_DownsampleFactorMaxGrad(self):
im = theano.tensor.tensor4()
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论