我目前正在尝试教一个神经网络解码输入上已添加拉普拉斯噪声的输入(即添加遵循拉普拉斯分布的居中随机变量)。为此,我希望在每个训练时期将输入拉普拉斯噪声添加到每个比特中。这种噪声应在每个训练时期重新产生。
目前,我已经实现了一个添加噪声的层。它对高斯噪声很容易工作,因为喀拉拉邦有一个内置的高斯发生器。对于拉普拉斯噪声,我尝试进行以下操作: -使用numpy的random.laplace函数创建一个数组,并将其转换为张量。这大大减慢了培训的速度,并且培训的行为很奇怪,因此我不确定它是否可以执行我认为应该做的事情。 -使用从统一变量到laplace变量的转换函数,但是这似乎是数值问题(它可能会计算接近0的对数)。
def laplace(x,sigma,batchsize):
u=K.random_uniform((batchsize,n), minval=-0.5, maxval=0.5)
return x - sigma*K.sign(u)*K.log(1-2*K.abs(u))
或
def laplace(x,sigma,batchsize):
u=K.random_uniform((batchsize,n), minval=-0.5, maxval=0.5)
return x+K.tf.convert_to_tensor(np.random.laplace(0,sigma,(batchsize,n)),dtype=K.tf.float32)
我想知道是否存在一种更好的方法,可以在角膜/张量流中更轻松地向每个时期再生的张量添加拉普拉斯噪声。
感谢任何想法!