Theano损失函数中的对数行列式

时间:2015-05-08 20:05:59

标签: python numpy scipy theano deep-learning

我正在使用Theano(用于深度学习的python包),但我对它很新,而且我遇到了一个在我的损失函数中有一个术语的问题。该术语涉及取矩阵行列式的对数;矩阵是我网络中一层隐藏单元的函数。 我导入Tensor和Tensor.nlinalg:

import theano
import theano.tensor as T
import theano.tensor.nlinalg as Tnlinalg

然后在我的损失函数中坚持这个术语:

my_mat_det = Tnlinalg.Det(computed_matrix)
log_det_term = -T.log(my_mat_det)

但是当我尝试训练它时,我得到以下异常和追溯:

File "/SdaModule.py", line 88, in __init__
  log_det_term = -T.log(my_mat_det)
File "/home/username/anaconda/lib/python2.7/site-packages/theano/gof/op.py", line 481, in __call__
  node = self.make_node(*inputs, **kwargs)
File "/home/username/anaconda/lib/python2.7/site-packages/theano/tensor/elemwise.py", line 527, in make_node
  inputs = map(as_tensor_variable, inputs)
File "/home/username/anaconda/lib/python2.7/site-packages/theano/tensor/basic.py", line 202, in as_tensor_variable
  raise AsTensorError("Cannot convert %s to TensorType" % str_x, type(x))
theano.tensor.var.AsTensorError: ('Cannot convert Det to TensorType', <class 'theano.tensor.nlinalg.Det'>)

有人可以提供任何建议吗? 干杯, 麦克

1 个答案:

答案 0 :(得分:3)

linear algebra package中的

theano.tensor.nlinalg.Det是一个操作类,而不是一个操作函数。您需要首先初始化该类的实例,然后将其应用于表示矩阵的节点。例如,

import numpy

import theano
import theano.tensor.nlinalg

x = theano.tensor.matrix('x', dtype=theano.config.floatX)
p = theano.shared(numpy.array([[2, 0], [0, 3]], dtype=theano.config.floatX))
y = theano.dot(x, p)
c = theano.tensor.log(theano.tensor.nlinalg.Det()(y))
g = theano.grad(c, x)

print theano.printing.pp(g)

请注意theano.tensor.nlinalg.Det()(y)theano.tensor.nlinalg.Det(y)之间的差异。