2016-07-22 64 views
0

我有一些奇怪的行爲,當我有一個評估theano表達式的lambda函數的列表。代碼如下:theano和lambda函數

# Equivalent functions (or at least I assume so) 
def tilted_loss(q,y,f): 
    e = (y-f) 
    return (q*tt.sum(e)-tt.sum(e[(e<0).nonzero()]))/e.shape[0] 

def tilted_loss2(y,f): 
    q = 0.05 
    e = (y-f) 
    return (q*tt.sum(e)-tt.sum(e[(e<0).nonzero()]))/e.shape[0] 

def tilted_loss_np(q,y,f): 
    e = (y-f) 
    return (q*sum(e)-sum(e[e<0]))/e.shape[0] 

# lambda functions which uses above functions 
qs = np.arange(0.05,1,0.05) 
q_loss_f = [lambda y,f: tilted_loss(q,y,f) for q in qs] 
q_loss_f2 = lambda y,f:tilted_loss(0.05,y,f) 
q_loss_f3 = lambda y,f:tilted_loss(qs[0],y,f) 

# Test the functions 
np.random.seed(1) 
a = np.random.randn(1000,1) 
b = np.random.randn(1000,1) 
print(q_loss_f[0](a,b).eval()) 
print(q_loss_f2(a,b).eval()) 
print(q_loss_f3(a,b).eval()) 
print(tilted_loss2(a,b).eval()) 
print(tilted_loss_np(qs[0],a,b)[0]) 

這使輸出:

0.571973847658054 
0.5616355181780912 
0.5616355181695327 
0.5616355181780912 
0.56163551817 
  1. 我必須做一些錯的功能q_loss_f列表的定義方式。
  2. q定義的方式好嗎?即它是我發送的一個numpy變量,但在q_loss_f3中似乎沒有問題。

有什麼想法?

+1

[什麼做的(lambda)函數閉包捕獲的可能的複製在Python?](http://stackoverflow.com/questions/2295290/what-do-lambda-function-closures-capture-in-python) –

回答

1

是一個常見的錯誤,在lambda expresion的q值將只取修真循環的最後一個值,你最好使用partial

q_loss_f = [partial(tilted_loss, q=q) for q in qs] 
+0

在我的特殊情況下,我不能使用部分,因爲由於某種原因q_loss_f沒有屬性__name__與所有'def'函數一樣。無論如何,通過'q_loss_f = [lambda y,f,q = q:tilted_loss(q,y,f)for q in qs]來解決它' –