theano 和 lambda 函数
theano and lambda functions
当我有一个评估 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
- 我一定是函数列表
q_loss_f
的定义方式有问题。
- q的定义方式可以吗?即它是我发送的一个 numpy 变量,但这在
q_loss_f3
. 中似乎没问题
有什么想法吗?
是一个常见的错误,lambda 表达式中的 q
值只会从推导循环中取最后一个值,你最好使用 partial:
q_loss_f = [partial(tilted_loss, q=q) for q in qs]
当我有一个评估 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
- 我一定是函数列表
q_loss_f
的定义方式有问题。 - q的定义方式可以吗?即它是我发送的一个 numpy 变量,但这在
q_loss_f3
. 中似乎没问题
有什么想法吗?
是一个常见的错误,lambda 表达式中的 q
值只会从推导循环中取最后一个值,你最好使用 partial:
q_loss_f = [partial(tilted_loss, q=q) for q in qs]