我正在尝试计算大型(最多10,000个变量)任意嵌套的复合函数。例如,一个100变量的函数可能如下所示:
'( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( A0 * (1 - A1) ) * A2 ) * A3 ) * A4 ) * A5 * A6 * (1 - A7) ) * A8 ) * A9 * A10 + A11 * A12 + (1 - A13) + A14 + (1 - A15) ) * A16 + (1 - A17) * A18 + A19 + (1 - A20) * (1 - A21) ) * A22 * (1 - A23) + (1 - A24) + (1 - A25) ) * A26 + A27 + (1 - A28) ) * A29 + A30 + A31 * (1 - A32) + (1 - A33) + (1 - A34) * A35 ) * A36 + (1 - A37) + (1 - A38) + (1 - A39) ) * A40 ) * A41 + (1 - A42) ) * A43 * (1 - A44) * A45 + A46 + A47 + A48 * (1 - A49) * (1 - A50) * A51 + A52 * (1 - A53) + A54 * A55 * (1 - A56) ) * A57 + (1 - A58) * A59 * (1 - A60) * (1 - A61) * A62 * A63 ) * A64 * A65 * (1 - A66) * A67 + A68 ) * A69 ) * A70 ) * A71 + (1 - A72) + A73 * (1 - A74) ) * A75 * A76 + (1 - A77) + (1 - A78) * A79 * (1 - A80) + (1 - A81) * A82 ) * A83 * (1 - A84) * (1 - A85) + (1 - A86) + (1 - A87) + (1 - A88) + A89 + (1 - A90) ) * A91 + A92 + (1 - A93) * A94 * A95 ) * A96 + (1 - A97) + A98 * A99'
我想最大化性能。
我被指向Theano的方向,但是当我只输入250个变量时,它会引发错误。即使变量少得多并且函数编译,它的运行速度仍然很慢。
在打印计算图时,我看到所有变量都排成一列,进入1个复合函数。我可以想象,即使我知道该库更适合用于大型矩阵和矢量运算,也可以通过某种方式来改善复合函数的性能。
我对Theano并不陌生,这个问题很容易是由于缺乏理解所致。我不确定是否正确构建了图形。上面的输入将被输入到eval函数中,并将设置answer变量。这就是用来初始化Theano.function的东西。下面是实施的简短版本。
import numpy as np
import theano.tensor as T
from theano import function
expr_str = '(1-A1)*(A2*A3+A4*(1-A5)+A6)+A7*((1-A8)+A9)*A10'
# use regex to get a set of the variables
var_set = set(re.findall(r'A\d', expr_str)
# build dict with str vars as keys and Theano tensors as values
var_dict = {}
for var in var_set:
var_dict[var] = T.dscalar(var)
# evaluate the string expression with Theano tensors as variables
result_tensor = eval(expr_str, var_dict)
# function
f = function([var_dict[var] for var in var_set], result_tensor)