为了获得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时返回的值为-4,当a = 4时返回的值为-4,但是它始终满足条件并运行return -data。
我不知道为什么你能帮助我吗?
最佳答案
T.gt
是符号函数;它不返回布尔值,而是返回一个代表符号表达式的对象,该符号表达式在以后编译和执行时将评估为布尔值。
因此,在Python中,T.gt(...)
将始终被评估为True
,因为结果始终是非None
。
如果要在Theano中使用条件表达式,则需要使用符号条件操作。有两个:T.switch
和theano.ifelse.ifelse
。区别在于T.switch
是元素操作,接受张量条件,而ifelse
需要标量条件。
您的示例还有另一个问题。即使代码是好的,它也总是会返回一个负值。本质上,您的示例说,如果输入为正则返回其负,否则按原样返回输入(该输入已经为负)。我还建议在theano.function
函数上使用eval
。
您的示例可以进行更改以说明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()
关于python - T.gt()出了点问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31757952/