我有一个预先计算和存储的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_sum
中fn_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
。
这样的事情是否可能?
答案 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]
上面的代码有效,但我不完全确定它能完全符合您的要求。我仍然希望它有所帮助。