符号表达式/语句的连接/创建

时间:2014-06-15 20:01:44

标签: python theano

我想以编程方式创建这样的内容:

a = (_vec, T.set_subtensor(_vec[0], _init[0]))[1]
b = (a,    T.set_subtensor(   a[1], a[0] * 2))[1]
c = (b,    T.set_subtensor(   b[2], b[1] * 2))[1]

vec_update  = (c, T.set_subtensor(c[3], c[2] * 2))

test_vector = function([], outputs=vec_update)

subt = test_vector() 

我们得到a = (_vec, T.set_subtensor(_vec[0], _init[0]))[1]所以a是整个陈述。这还没有做任何事情。然后有b = (a, T.set_subtensor( a[1], a[0] * 2))[1]取决于a并且是另一个声明本身。这一直持续到vec_update。我知道它看起来很难看,但它只更新col[n] = col[n-1] * 2这样的矢量列,col[0] = 1返回一个看起来像这样的矢量:

[[   1.    2.    4. ...,   32.   64.  128.]]

现在想象一下,我想要这样做一千次..因此我想知道我是否可以生成这样的陈述,因为它们遵循一个简单的模式。

这些" 连接"语句直到

才会被评估
test_vector = function([], outputs=vec_update) 

这是他们被编译到CUDA-code

的时间
subt = test_vector() 

执行所有操作。

1 个答案:

答案 0 :(得分:1)

您可以使用功能嵌套:

def nest(f, g):
    def h(x):
        return f(g(x), x)
    return h

expr = lambda (a,b) : a
expr = nest((lambda x, (a, b): x + (a - b)), expr)
expr = nest((lambda x, (a, b): x + (a - b)), expr)

print expr((1,2)) # prints -1

关于示例代码,您可以执行类似的操作(将nest修改为不使用参数):

def nest(f, g):
    def h():
        return f(g())
    return h

expr = lambda: (_vec, _init)[1]
expr = nest(lambda x: T.set_subtensor(x[1], x[0] * 2)[1], expr)
expr = nest(lambda x: T.set_subtensor(x[2], x[1] * 2)[1], expr)
expr = nest(lambda x: T.set_subtensor(x[3], x[2] * 2)[1], expr)
expr = nest(lambda x: T.set_subtensor(x[4], x[3] * 2)[1], expr)

test_vector = function([], outputs=expr)
subt = test_vector()