Numpy 使用map\u fn Slow进行元素采样

Numpy 使用map\u fn Slow进行元素采样,numpy,matrix,tensorflow,Numpy,Matrix,Tensorflow,假设我想对一个矩阵进行采样,每个条目都从另一个矩阵中的条目定义的分布中采样。我展开我的矩阵并将map_fn应用于每个元素。对于一个相对较小的矩阵(128 x 128),下面给出了几个池分配器警告(GTX TITAN Black),并且没有在任何合理的时间内进行训练 def sample(x): samples = tf.map_fn(lambda z: tf.random_normal([1], mean=z,

假设我想对一个矩阵进行采样,每个条目都从另一个矩阵中的条目定义的分布中采样。我展开我的矩阵并将map_fn应用于每个元素。对于一个相对较小的矩阵(128 x 128),下面给出了几个池分配器警告(GTX TITAN Black),并且没有在任何合理的时间内进行训练

def sample(x):
   samples = tf.map_fn(lambda z:
                      tf.random_normal([1], mean=z,
                                       stddev=tf.sqrt(z * (1 - z))),
                      tf.reshape(x, [-1]))    # apply to each element

   return tf.cond(is_training, lambda: tf.reshape(samples, shape=tf.shape(x)),
                  lambda: tf.tanh(x))

有没有更好的方法来应用这样的元素操作?

如果您可以使用每次张量操作而不是tf.map\fn这样的元素操作,那么您的代码将运行得更快

在这里,您似乎希望从每个元素的正态分布中采样,其中输入张量中的每个值的分布参数都不同。试着这样做:

def sample(x):
  samples = tf.random_normal(shape=[128, 128]) * tf.sqrt(x * (1 - x)) + x
tf.random_normal()默认生成平均值为0.0、标准偏差为1.0的正态分布。可以使用逐点张量运算来修正每个元素的标准偏差(通过相乘)和平均值(通过相加)。事实上,如果你看看tf.random_normal()是如何实现的,那正是它内部的功能

(如果使用Python条件语句来区分培训和测试时间,您可能会做得更好。)

如果您计划经常做这类事情,您可能会在github上提交一个功能请求,要求对tf.random_normal进行泛化,以便为
mean
stddev
接受具有更一般形状的张量。我看没有理由不支持这一点


希望有帮助

请参见
tensorflow.contrib.distributions
模块,该模块有一个
Normal
类,其中包含一个
sample
方法,可为您执行此操作