Tensorflow отличается конфигурацией выпадения для одного обновления градиента - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь реализовать PI-модель для обучения под наблюдением, представленную в [1].

Чтобы вычислить функцию потерь, необходимы два прямых прохода по сети с одинаковыми данными, посредством чего впри каждом прямом проходе данные модифицируются с использованием стохастического увеличения.Кроме того, используется отсев, и на каждом из двух проходов должен выпадать различный набор нейронов.

Я не совсем уверен, как реализовать требуемый механизм отсева.

Когда яобъединить два различных дополнения пакета в качестве входных данных в мою сеть, так что один пакет теперь содержит два разных дополнения данных.Может быть, есть способ добавить два «параллельных» tf.nn.dropout слоя, где требуется выпадающий слой, и каким-то образом определить, что для первой половины пакета должна использоваться первая, а для второй - вторая?Повторное разделение выходных данных сети должно затем дать результат двух «отдельных» прогонов.

Альтернативой может быть использование двух отдельных вызовов session.run, с двумя различными дополнениями данных.Однако я не совсем уверен, каким образом я мог бы тогда правильно выполнить обновление градиента.

[1] https://arxiv.org/abs/1610.02242

1 Ответ

0 голосов
/ 25 апреля 2018

Вы можете использовать tf.split(), чтобы разделить партию на две половины, подать каждую половину через tf.layers.dropout() отдельно, а затем повторно объединить их с помощью tf.concat().Примерно так (псевдокод):

splitted = tf.split( batch, 2, axis = 0 )
first_half = tf.dropout( splitted[ 0 ], rate = 0.5 )
second_half = tf.dropout( splitted[ 1 ], rate = 0.6 ) 
rejoined = tf.concatenate( [ first_half, second_half ], axis = 0 )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...