我应该如何在theano函数中分配一个numpy数组?

时间:2015-08-03 05:23:25

标签: python numpy theano

我们说我有一个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)
  1. 在theano编译时,如何在实际theano中分配张量/数组或内存进行优化。
  2. 如何将分配的张量/数组转换为要返回的theano like变量?我已经尝试将其转换为函数中的共享变量但是没有用。

1 个答案:

答案 0 :(得分:5)

我很抱歉,但我不了解您的具体问题,但可以对您提供的代码示例发表评论。

首先,您在return z上方的评论不正确。如果xy是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时,它被编译成可执行的东西。在编译函数执行时,并给出输入的一些具体值,您实际上得到了您正在寻找的结果。