提交 c1933179 authored 作者: bergstra@ip05.m's avatar bergstra@ip05.m

adding tests for a variety of sparse dtypes

上级 72528716
...@@ -696,7 +696,7 @@ class StructuredDot(gof.Op): ...@@ -696,7 +696,7 @@ class StructuredDot(gof.Op):
else: else:
raise Exception("a.shape=%s, b.shape=%s, variable.shape=%s ??? I have no idea why") raise Exception("a.shape=%s, b.shape=%s, variable.shape=%s ??? I have no idea why")
## Commenting this out because variable should be a numpy.ndarray since the assert above ## Commenting this out because variable should be a numpy.ndarray since the "assert _is_dense(variable)" above
## (JB 20090109) ## (JB 20090109)
# out[0] = numpy.asarray(variable) #TODO: fix this really bad implementation # out[0] = numpy.asarray(variable) #TODO: fix this really bad implementation
# #
...@@ -714,6 +714,7 @@ def structured_dot(x, y): ...@@ -714,6 +714,7 @@ def structured_dot(x, y):
""" """
@todo: Maybe the triple-transposition formulation (when x is dense) @todo: Maybe the triple-transposition formulation (when x is dense)
is slow. See if there is a direct way to do this. is slow. See if there is a direct way to do this.
(JB 20090528: Transposing tensors and sparse matrices is constant-time, inplace, and fast.)
""" """
if hasattr(x, 'getnnz'): x = as_sparse_variable(x) if hasattr(x, 'getnnz'): x = as_sparse_variable(x)
if hasattr(y, 'getnnz'): y = as_sparse_variable(y) if hasattr(y, 'getnnz'): y = as_sparse_variable(y)
......
...@@ -161,61 +161,76 @@ class test_structureddot(unittest.TestCase): ...@@ -161,61 +161,76 @@ class test_structureddot(unittest.TestCase):
def test_structuredot(self): def test_structuredot(self):
bsize = 2 bsize = 2
typenames = 'int8', 'int16', 'int32', 'int64', 'float32', 'float64', 'complex64', 'complex128'
# iterate 10 times just to make sure (cannot get this wrong !) for sparse_dtype in typenames:
for i in range(10): for dense_dtype in typenames:
spmat = sp.lil_matrix((4,6)) # iterate for a few different random graph patterns
for i in range(5): for i in range(10):
x = numpy.floor(numpy.random.rand()*spmat.shape[0]) spmat = sp.lil_matrix((4,6), dtype=sparse_dtype)
y = numpy.floor(numpy.random.rand()*spmat.shape[1]) for i in range(5):
spmat[x,y] = numpy.random.rand()*10 # set non-zeros in random locations (row x, col y)
spmat = sp.csc_matrix(spmat) x = numpy.floor(numpy.random.rand()*spmat.shape[0])
y = numpy.floor(numpy.random.rand()*spmat.shape[1])
kerns = tensor.dvector('kerns') spmat[x,y] = numpy.random.rand()*10
images = tensor.dmatrix('images') spmat = sp.csc_matrix(spmat)
## kerns = tensor.Tensor(broadcastable=[False], dtype=sparse_dtype)('kerns')
# Test compressed-sparse column matrices ### images = tensor.Tensor(broadcastable=[False, False], dtype=dense_dtype)('images')
##
output_dtype = theano.scalar.upcast(sparse_dtype, dense_dtype)
# build symbolic theano graph assert output_dtype in (sparse_dtype, dense_dtype)
def buildgraphCSC(kerns,images):
csc = CSC(kerns, spmat.indices[:spmat.size], spmat.indptr, spmat.shape) ##
return structured_dot(csc, images.T) # Test compressed-sparse column matrices ###
out = buildgraphCSC(kerns,images) ##
f = theano.function([kerns,images], out)
# compute theano outputs # build symbolic theano graph
kernvals = spmat.data[:spmat.size] def buildgraphCSC(kerns,images):
imvals = 1.0 * numpy.arange(bsize*spmat.shape[1]).reshape(bsize,spmat.shape[1]) csc = CSC(kerns, spmat.indices[:spmat.size], spmat.indptr, spmat.shape)
outvals = f(kernvals,imvals) assert csc.type.dtype == output_dtype
# compare to scipy return structured_dot(csc, images.T)
c = spmat * (imvals.T) out = buildgraphCSC(kerns,images)
assert _is_dense(c) f = theano.function([kerns,images], out)
assert numpy.all(outvals == c) # compute theano outputs
kernvals = spmat.data[:spmat.size]
utt.verify_grad(buildgraphCSC, [kernvals,imvals]) imvals = 1.0 * numpy.arange(bsize*spmat.shape[1]).reshape(bsize,spmat.shape[1])
outvals = f(kernvals,imvals)
## # compare to scipy
# Test compressed-sparse row matrices ### c = spmat * (imvals.T)
## assert _is_dense(c)
spmat = spmat.tocsr() assert numpy.all(outvals == c)
assert str(outvals.dtype) == output_dtype
# build theano graph assert c.dtype == outvals.dtype
def buildgraphCSR(kerns,images):
csr = CSR(kerns, spmat.indices[:spmat.size], spmat.indptr, spmat.shape) if sparse_dtype.startswith('float') and dense_dtype.startswith('float'):
return structured_dot(csr, images.T) utt.verify_grad(buildgraphCSC, [kernvals,imvals])
out = buildgraphCSR(kerns,images)
f = theano.function([kerns,images], out) ##
# compute theano output # Test compressed-sparse row matrices ###
kernvals = spmat.data[:spmat.size] ##
imvals = 1.0 * numpy.arange(bsize*spmat.shape[1]).reshape(bsize,spmat.shape[1]) spmat = spmat.tocsr()
outvals = f(kernvals,imvals)
# compare to scipy # build theano graph
c = spmat * (imvals.T) def buildgraphCSR(kerns,images):
assert _is_dense(c) csr = CSR(kerns, spmat.indices[:spmat.size], spmat.indptr, spmat.shape)
assert numpy.all(outvals == c) return structured_dot(csr, images.T)
out = buildgraphCSR(kerns,images)
utt.verify_grad( buildgraphCSR, [kernvals,imvals]) f = theano.function([kerns,images], out)
# compute theano output
kernvals = spmat.data[:spmat.size]
imvals = 1.0 * numpy.arange(bsize*spmat.shape[1]).reshape(bsize,spmat.shape[1])
outvals = f(kernvals,imvals)
# compare to scipy
c = spmat * (imvals.T)
assert _is_dense(c)
assert numpy.all(outvals == c)
assert str(outvals.dtype) == output_dtype
assert c.dtype == outvals.dtype
# we could test more, but hopefully this suffices?
if sparse_dtype.startswith('float') and dense_dtype.startswith('float'):
utt.verify_grad( buildgraphCSR, [kernvals,imvals])
if __name__ == '__main__': if __name__ == '__main__':
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论