В настоящее время я пытаюсь научить нейронную сеть декодировать вход, на который был добавлен шум Лапласа (т.е. добавление центрированной случайной величины, которая следует распределению Лапласа). Для этого я бы хотел, чтобы в каждую тренировочную эпоху добавлялся к каждому биту входной лапласианский шум. Этот шум следует регенерировать в каждую тренировочную эпоху.
На данный момент я реализовал слой, который добавляет шум. Он работал легко для гауссовского шума, потому что в керасе есть включенный гауссов генератор. Для шума Лапласа, я пытался вещи:
-создать массив с помощью функции random.laplace для numpy и преобразовать его в тензор. Это существенно замедляет тренировку, и поведение тренинга странно, поэтому я не уверен, что он делает то, что, как я думаю, должен делать.
-Используйте функцию преобразования из равномерной переменной в переменную Лапласа, однако это может быть связано с числовыми проблемами (может вычислить журнал значений, близких к 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)
Я хотел бы знать, есть ли лучший способ для добавления шума Лапласа к тензору, регенерируемому в каждую эпоху, более легким в керасе / тензорном потоке.
Спасибо за любую идею!