提交 befb9054 authored 作者: Frederic Bastien's avatar Frederic Bastien

partial rewrite of the ConvOp grad test. It was not testing in float32…

partial rewrite of the ConvOp grad test. It was not testing in float32 correctly. This uncover a bug in the grad in float32. Maybe the bug is in verify_grad. I added an option to verify_grad to help test the float32 case correctly, but we did't can use it by default because it make some test fail. I don't know why.
上级 5fe9e8d5
......@@ -420,65 +420,52 @@ class TestConvOp(unittest.TestCase):
def test_ConvOpGrad(self):
nkern = 3
bsize = 2
imgs = T.dmatrix('imgs')
kerns = T.dmatrix('kerns')
kshps = [(3,3), (5,5)]
for mode in 'valid', 'full':
for imshp in (5,5),(2,3,3),(3,6,6): # (12,10), (3,12,11):
# 'full' mode should support kernels bigger than the input
if mode == 'valid' and (kshps[0] > imshp[1]):
continue
visdim = 1 if len(imshp)!=3 else imshp[0]
for kshp in kshps:
imgvals = N.random.random(N.hstack((bsize,imshp)))
print 'imgvals.shape = ', imgvals.shape
imgvals = imgvals.reshape(bsize,-1)
if visdim == 1:
kernvals = N.random.rand(nkern,kshp[0],kshp[1])
else:
kernvals = N.random.rand(nkern,visdim,kshp[0],kshp[1])
kernvals = kernvals.reshape(nkern,-1)
def testf(imgs, kerns):
out, outshp = convolve2(kerns, kshp, nkern, imgs,
imshp, bsize, mode=mode)
return out
try:
utt.verify_grad(testf, [imgvals, kernvals])
except NotImplementedError, e:
print e
def test_ConvOpGrad32(self):
"""
test the gradient in float and double
"""
nkern = 4
bsize = 3
imgs = T.fmatrix('imgs')
kerns = T.fmatrix('kerns')
def testf(imgs, kerns):
out, outshp = convolve2(kerns, kshp, nkern, imgs,
imshp, bsize, mode='valid')
return out
for mode in 'valid', 'full':
for imshp in (1,5,5),(2,10,10): # (12,10), (3,12,11):
visdim = 1 if len(imshp)!=3 else imshp[0]
for kshp in (3,3),:# (6,7):
imgvals = N.random.random(N.hstack((bsize,imshp)))
print 'imgvals.shape = ', imgvals.shape
imgvals = imgvals.reshape(bsize,-1)
kernvals = N.random.rand(nkern,visdim,kshp[0],kshp[1])
print 'kernvals.shape = ', kernvals.shape
kernvals = kernvals.reshape(nkern,-1)
utt.verify_grad(testf, [imgvals, kernvals])
types = ["float32", "float32"]#flot32 is BUGGED
kshps = [(3,3),(5,5)]# TODO: (6,7)show a bug that is not fixed!!
imshps = [(1,5,5),(2,10,10),(2,12,12)] #TODO bugged (2,12,10), (3,12,11):
modes = ['valid', 'full']
unroll_batch=[0,1,3]
unroll_kern=[0,1,2,4]
for t in types:
imgs = T.TensorType(t, (False, False, False, False),'imgs')
kerns = T.TensorType(t, (False, False, False, False),'kerns')
for mode in modes:
for imshp in imshps:
visdim = 1 if len(imshp)!=3 else imshp[0]
for kshp in kshps:
t=numpy.array([imshp[1]-kshp[0],imshp[2]-kshp[1]])
# 'full' mode should support kernels bigger than the input
if mode == 'valid' and (t<0).any():
continue
for un_b in unroll_batch:
for un_k in unroll_kern:
imgvals = N.array(N.random.random(N.hstack((bsize,imshp))),dtype=imgs.dtype)
# print 'imgvals.shape = ', imgvals.shape, imgvals.dtype
# imgvals = imgvals.reshape(bsize,-1)
kernvals = N.array(N.random.rand(nkern,visdim,kshp[0],
kshp[1]),dtype=kerns.dtype)
# print 'kernvals.shape = ', kernvals.shape, kernvals.dtype
# kernvals = kernvals.reshape(nkern,-1)
def testf(imgs, kerns):
out, outshp = convolve2(kerns, kshp, nkern,
imgs, imshp, bsize,
mode=mode,
unroll_batch=un_b,
unroll_kern=un_k)
print "2",imgs.dtype,kerns.dtype
out = ConvOp(imshp,kshp,nkern,bsize,1,1,mode)(imgs,kerns)
return out
utt.verify_grad(testf, [imgvals, kernvals])
if __name__ == '__main__':
# t = TestConvOp("test_convolution")
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论