Numpy 使用map\u fn Slow进行元素采样
假设我想对一个矩阵进行采样,每个条目都从另一个矩阵中的条目定义的分布中采样。我展开我的矩阵并将map_fn应用于每个元素。对于一个相对较小的矩阵(128 x 128),下面给出了几个池分配器警告(GTX TITAN Black),并且没有在任何合理的时间内进行训练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,
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
方法,可为您执行此操作