将一个Python函数列表应用于Tensor

时间:2018-04-13 16:47:23

标签: python tensorflow kernel-density

我有一个预先计算和存储的Python lambda函数列表,例如:

fn_list = [lambda x: x + 2 for x in some_data]

现在,我想要一个Tensor:

X = tf.placeholder(..., shape=[None, 1])

fn_list中的每个功能应用于None的{​​{1}}维度中的每个值。

理想情况下,输出与X具有相同的形状,方法是使用X来压缩tf.reduce_sumfn_list中每个值的所有结果。

下面是一个代码示例,显示了我对上述问题的所需:

X

上面的代码基本上会执行某种核密度估计,首先计算import numpy as np import tensorflow as tf def _get_gaussian(loc=0.0, scale=1.0): return lambda x: (1/scale * np.sqrt(2 * np.pi)) * np.exp(-0.5 * np.power((x-loc)/scale, 2)) data = np.random.normal(3, 1.25, 100) fn_list = [_get_gaussian(loc=x, scale=0.2) for x in data] X = tf.placeholder(tf.float32, shape=[None, 1]) pred = tf.map_fn(lambda x: tf.map_fn(lambda fn_: tf.reduce_sum(fn_(x)), fn_list), X) 中每个点周围的正态分布,将内核存储在data中。 然后,对于某个张量fn_list,它可以计算X中每个值的可能性。

X现在将成为形状张量pred

这样的事情是否可能?

1 个答案:

答案 0 :(得分:0)

我的大脑有点试图遵循这个:)但基本上,如果你打破这样的最后一行:

pred = tf.map_fn( lambda x: tf.map_fn(lambda fn_: tf.reduce_sum(fn_(x)),
                                      fn_list),
                  X)

那么你的问题现在更清楚了。即内部tf.map_fn正在尝试将函数tf.reduce_sum( fn_( x ) )映射到fn_list,但后者是函数的列表而不是张量。此外,外部tf.map_fn正在尝试将内部地图的结果映射到X,但结果是不是函数而是张量。因此,对这段代码的一些重新思考和重组是有序的,没有映射,高斯表示为Tensorflow操作,可能是这样的:

import numpy as np
import tensorflow as tf

data = np.random.normal(3, 1.25, 5)

#X = tf.placeholder(tf.float32, shape=[None, 1])
X = tf.constant( [ 1, 2, 3 ], dtype = tf.float32 )

scale = 0.2
coeff = np.sqrt(2 * np.pi) / scale
X_fn = []
for idx in xrange( len ( data ) ):
    x = data[ idx ]
    X_fn.append(
        coeff * tf.exp( - 0.5 * tf.pow( ( X - x ) / scale, 2 ) )
    )

X1 = tf.stack( X_fn, axis =  0 )
X2 = tf.reduce_sum( X1, axis = 1 )
with tf.Session() as sess:
    print( sess.run( X2 ) )

输出:

  

[3.7835757e-09 9.0623178e + 00 9.2027439e-03 2.7527404e-01 1.1571876e + 00]

上面的代码有效,但我不完全确定它能完全符合您的要求。我仍然希望它有所帮助。