我正在使用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'>)
有人可以提供任何建议吗? 干杯, 麦克
答案 0 :(得分:3)
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)
之间的差异。