我们说我有一个theano功能:
def my_fun(x, y):
# Create output array for example sake
z = np.asarray(
shape=(x.shape[0], y.shape[1]),
dtype=theano.config.floatX
)
z = x + y
# this is wrong, how should I convert this to a theano
# tensor?
return z
x = theano.tensor.dmatrix("x")
y = theano.tensor.dmatrix("y")
f = function(
inputs=[x, y],
outputs=[my_fun]
)
a = numpy.asarray([[1,2],[3,4]])
b = numpy.asarray([[1,2],[3,4]])
c = my_fun(a,b)
答案 0 :(得分:5)
我很抱歉,但我不了解您的具体问题,但可以对您提供的代码示例发表评论。
首先,您在return z
上方的评论不正确。如果x
和y
是Theano变量,那么z
也将是z = x + y
之后的Theano变量。
其次,没有必要使用numpy为返回变量预分配内存。因此,您的my_fun
可以更改为
def my_fun(x, y):
z = x + y
return z
第三,Theano函数的输出需要是Theano变量,而不是Python函数。输出需要是输入的函数。因此,您的theano.function
来电需要更改为
f = function(
inputs=[x, y],
outputs=[my_fun(x, y)]
)
掌握Theano的最重要的一点是,在开始时可能有点困难,是符号世界和可执行世界之间的区别。这就是Python表达式和Theano表达式之间的区别。
上面的修改后的my_fun
可以像符号函数一样使用,也可以像普通的可执行Python函数一样使用,但每种函数的行为都不同。如果传入普通的Python输入,则立即发生加法运算,返回值是计算的结果。因此my_fun(1,2)
会返回3
。如果您传入符号Theano变量,则不会立即执行加法运算。相反,该函数返回一个符号表达式,在以后编译和执行之后将返回添加两个输入的结果。因此my_fun(theano.tensor.scalar(), theano.tensor.scalar())
的结果是一个Python对象,它代表一个符号的Theano计算图。当结果作为输出传递给theano.function
时,它被编译成可执行的东西。在编译函数执行时,并给出输入的一些具体值,您实际上得到了您正在寻找的结果。