伯诺利在theano

时间:2015-08-12 17:10:14

标签: theano

我有一个关于伯努利面具的问题。

据我所知,掩模应该取决于速率(概率)p。 (例如,如果p = 0.5并且掩码是大小= 2的数组A,则掩码应该类似于:[0,1]或[1,0])。 大多数theano代码使用bernoulli,如:

rs = np.random.RandomState(1234)

rng = theano.tensor.shared_randomstreams.RandomStreams(rs.randint(999999))

mask = rng.binomial(n = 1,p =(0.5),size = A.shape)

但是当我测试这个时,我发现掩码也可以是[0,0]或[1,1],这对我来说似乎不是逻辑。因为我想将数组的一半正确地随机设置为零。 可能有错误吗?或者也许有另一种方法可以为此目的提供。 提前谢谢!

1 个答案:

答案 0 :(得分:1)

rng.binomial(n=1, p=0.5, shape=A.shape)将针对形状A.shape的结果张量的每个元素独立地从伯努利分布中进行采样。因为每个样本是独立的,结果张量的每个元素将为0,概率为0.5,概率为0.5。因此,如果结果张量应该具有形状(2, )(即长度为2的向量),则有四种可能的结果,每种结果将以概率0.25获得:

[0, 0]
[0, 1]
[1, 0]
[1, 1]

不清楚你的用例是什么,但是如果它是用于去噪自动编码器,这是通常的做法;有时你丢弃的功能比其他时候多。丢弃所有特征是相当极端的,但当结果张量的大小远大于2时,这是不太可能的结果。

如果您确实需要屏蔽正好一半的元素,那么您可以使用theano.tensor.raw_random.shuffle_row_elements。我没试过这个,但想法是使用shuffle_row_elements象征性地改组索引列表,选择结果列表的前半部分,然后使用set_subtensor来掩盖那些元素。选定指数的原始张量。