我在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