T.gt() 有问题
something wrong about T.gt()
为了获取T.gt()的用法,写了一个玩具代码
def f(data):
# return T.gt(data, 0)
if T.gt(data, 0):
print "1"
return -data
else:
print "2"
return data
a = T.scalar()
t = f(a)
print t.eval({a:-4})
我希望当 a=-4 时 returned 值是 -4,当 a=4 时它是 -4,但它总是满足条件并且 运行 return -数据。
我不知道为什么。你能帮帮我吗?
T.gt
是一个符号 函数;它不是 return 布尔值,而是 return 表示符号表达式的对象,稍后编译和执行时,将计算为布尔值。
因此,在 Python 中,T.gt(...)
将始终被评估为 True
,因为结果始终不是 None
。
如果你想在 Theano 中使用条件表达式,那么你需要使用符号条件运算。有两个:T.switch
和 theano.ifelse.ifelse
。区别在于T.switch
是逐元素运算,接受张量条件,而ifelse
需要标量条件。
你的例子还有一个问题。即使代码很好,它也总是 return 负值。本质上你的例子说,if input is positive return its negative else return input as-is (which is already negative).我还建议在 eval
函数上使用 theano.function
。
您的示例可以更改为说明 ifelse
的工作原理,如下所示:
import theano
import theano.ifelse
import theano.tensor as T
def symbolic_f(x):
return theano.ifelse.ifelse(T.gt(x, 0), -x - 1, x + 1)
def main():
x = T.scalar()
f = theano.function(inputs=[x], outputs=symbolic_f(x))
print f(-4)
print f(4)
main()
为了获取T.gt()的用法,写了一个玩具代码
def f(data):
# return T.gt(data, 0)
if T.gt(data, 0):
print "1"
return -data
else:
print "2"
return data
a = T.scalar()
t = f(a)
print t.eval({a:-4})
我希望当 a=-4 时 returned 值是 -4,当 a=4 时它是 -4,但它总是满足条件并且 运行 return -数据。 我不知道为什么。你能帮帮我吗?
T.gt
是一个符号 函数;它不是 return 布尔值,而是 return 表示符号表达式的对象,稍后编译和执行时,将计算为布尔值。
因此,在 Python 中,T.gt(...)
将始终被评估为 True
,因为结果始终不是 None
。
如果你想在 Theano 中使用条件表达式,那么你需要使用符号条件运算。有两个:T.switch
和 theano.ifelse.ifelse
。区别在于T.switch
是逐元素运算,接受张量条件,而ifelse
需要标量条件。
你的例子还有一个问题。即使代码很好,它也总是 return 负值。本质上你的例子说,if input is positive return its negative else return input as-is (which is already negative).我还建议在 eval
函数上使用 theano.function
。
您的示例可以更改为说明 ifelse
的工作原理,如下所示:
import theano
import theano.ifelse
import theano.tensor as T
def symbolic_f(x):
return theano.ifelse.ifelse(T.gt(x, 0), -x - 1, x + 1)
def main():
x = T.scalar()
f = theano.function(inputs=[x], outputs=symbolic_f(x))
print f(-4)
print f(4)
main()