我在Theano中有一个简单的工作多层感知器,具有1个隐藏层和1个回退层以及2个输出。在回归层中,定义了一个均方误差函数,用作成本函数。然而,在学习期间,我现在想要最小化两个向量之间的余弦距离,所以我想将余弦距离用作代价函数。在我目前实施的一些相关部分下面。最小化余弦距离theano
import theano
import theano.tensor as T
class RegressionLayer(object):
def __init__(self, input, n_in, n_out, W=None, b=None):
# rest of __init__ left out for brevity
def mse(self, y):
return T.mean(T.sqr(y - self.y_pred))
def cos(self, y):
return 1. - (T.dot(y,self.y_pred)/(T.sqrt(T.sum(T.sqr(y)) * T.sum(T.sqr(self.y_pred)))))
如果我改变成本函数从mse(y)
到cos(y)
我得到以下错误:
TypeError: cost must be a scalar.
我不明白为什么成本(功能)不会是标量。只是为了测试,我尝试过:
def cos(self, y):
T.sum(1. - (T.dot(y,self.y_pred)/(T.sqrt(T.sum(T.sqr(y)) * T.sum(T.sqr(self.y_pred))))))
模型随即建立,但在训练过程中出现尺寸不匹配。
ValueError: dimension mismatch in args to gemm (1,2)x(1,2)->(1,2)
我认为问题在于我没有看到我的余弦距离函数与Theano中的均方误差函数有什么不同。我在这里错过什么?
谢谢!我认为我的错误来自误解T.dot(),显然T.dot(x,y)与T.sum(x * y)不同。 – Semi