提交 2766871b authored 作者: Arnaud Bergeron's avatar Arnaud Bergeron

Fix the gradient tests properly by ensuring the input matrices are

always the product of a matrix with its transpose.
上级 e1180b73
......@@ -403,9 +403,9 @@ class test_Eig(utt.InferShapeTester):
super(test_Eig, self).setUp()
self.rng = numpy.random.RandomState(utt.fetch_seed())
self.A = theano.tensor.matrix(dtype=self.dtype)
X = numpy.asarray(self.rng.rand(5, 5),
self.X = numpy.asarray(self.rng.rand(5, 5),
dtype=self.dtype)
self.S = X.dot(X.T)
self.S = self.X.dot(self.X.T)
def test_infer_shape(self):
A = self.A
......@@ -439,21 +439,19 @@ class test_Eigh(test_Eig):
vl * numpy.sign(vl[0, :]))
def test_grad(self):
S = self.S
utt.verify_grad(lambda x: self.op(x)[0], [S], rng=self.rng)
utt.verify_grad(lambda x: self.op(x)[1], [S], rng=self.rng, eps=1e-4)
utt.verify_grad(lambda x: self.op(x, 'U')[0], [S], rng=self.rng)
utt.verify_grad(lambda x: self.op(x, 'U')[1], [S], rng=self.rng, eps=1e-4)
X = self.X
utt.verify_grad(lambda x: self.op(x.dot(x.T))[0], [X], rng=self.rng)
utt.verify_grad(lambda x: self.op(x.dot(x.T))[1], [X], rng=self.rng)
utt.verify_grad(lambda x: self.op(x.dot(x.T), 'U')[0], [X], rng=self.rng)
utt.verify_grad(lambda x: self.op(x.dot(x.T), 'U')[1], [X], rng=self.rng)
class test_Eigh_float32(test_Eigh):
dtype = 'float32'
@utt.AttemptManyTimes(n_attempts=3, n_req_successes=2)
def test_uplo(self):
super(test_Eigh_float32, self).test_uplo()
@utt.AttemptManyTimes(n_attempts=3, n_req_successes=2)
def test_grad(self):
super(test_Eigh_float32, self).test_grad()
......
......@@ -15,16 +15,9 @@ from theano.tensor.basic import _allclose
from theano.tests.test_rop import break_op
from theano.tests import unittest_tools as utt
from theano import config
from theano.tensor.slinalg import ( Cholesky,
cholesky,
CholeskyGrad,
Solve,
solve,
Eigvalsh,
EigvalshGrad,
eigvalsh,
expm,
kron)
from theano.tensor.slinalg import (
Cholesky, cholesky, CholeskyGrad, Solve, solve,
Eigvalsh, EigvalshGrad, eigvalsh, expm, kron)
from theano.tests.unittest_tools import attr
from nose.plugins.skip import SkipTest
......@@ -80,19 +73,16 @@ def test_cholesky_grad():
if not imported_scipy:
raise SkipTest("Scipy needed for the Cholesky op.")
rng = numpy.random.RandomState(utt.fetch_seed())
r = rng.rand(5, 5).astype(config.floatX)
pd = numpy.dot(r, r.T)
eps = None
if config.floatX == "float64":
eps = 2e-8
r = rng.randn(5, 5).astype(config.floatX)
# Check the default.
yield (lambda: utt.verify_grad(cholesky, [pd], 3, rng, eps=eps))
yield (lambda: utt.verify_grad(lambda r: cholesky(r.dot(r.T)),
[r], 3, rng))
# Explicit lower-triangular.
yield (lambda: utt.verify_grad(Cholesky(lower=True), [pd], 3,
rng, eps=eps))
yield (lambda: utt.verify_grad(lambda r: Cholesky(lower=True)(r.dot(r.T)),
[r], 3, rng))
# Explicit upper-triangular.
yield (lambda: utt.verify_grad(Cholesky(lower=False), [pd], 3,
rng, eps=eps))
yield (lambda: utt.verify_grad(lambda r: Cholesky(lower=False)(r.dot(r.T)),
[r], 3, rng))
@attr('slow')
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论