Зацикливание на слое, чтобы сделать Монте-Карло из вывода нейронной сети - PullRequest
0 голосов
/ 07 февраля 2019

Мне недавно пришлось настроить нейронную сеть.Вот как это работает:

  • Учитывая изображение в качестве входных данных, несколько слоев превращают его в среднюю матрицу mu и ковариационную матрицу sigma.
  • Затем выборка z берется из гауссовского распределения параметров mu, sigma.
  • Несколько слоев превращают эту выборку в вывод
  • thisвывод сравнивается с данным изображением, что дает стоимость

Что я хочу сделать, это сохранить mu и sigma, взять несколько выборок z,распространяйте их по остальной части NN и сравнивайте несколько изображений, которые я получаю, с данным изображением.

Обратите внимание, что шаг z -> вывод изображения вызывает другой пакет, я бы не хотел копаться в этих ...

Что я сделал до сих пор:

  • Сначала я подумал, что мне не нужно проходить через все эти хлопоты: я беру batch_size одного, как будто я делаю Монте-Карло, выполняя NN несколько раз.Но мне на самом деле нужна нейронная сеть, чтобы попробовать несколько изображений перед обновлением весов и, таким образом, изменить mu и sigma.
  • Я просто выбрал несколько z, а затем распространил их через сеть.Но вскоре я обнаружил, что я дублировал все слои, делая код ужасно медленным медленным, и, прежде всего, мешал мне брать много образцов для достижения MC, на который я нацеливаюсь.

Конечно, я обновил классы потерь и ввода данных, чтобы учесть это.

У вас есть идеи?По сути, я бы хотел эффективный способ сделать z -> output многократно экономически эффективным способом.У меня еще есть чему поучиться у tenorflow и keras, поэтому я немного растерялся, как это сделать.Как обычно, прошу прощения, если ответ где-то уже существует, я сделал все возможное, чтобы найти один самостоятельно!

1 Ответ

0 голосов
/ 08 февраля 2019

Хорошо, мой вопрос был немного глупым.Чтобы не дублировать слои, я создал несколько слоев срезов, а затем просто распространил их через сеть с ранее объявленными слоями.Вот мой код:

# First declare layers
a = layer_A()
b = layer_B()
# And so on ...
# Generate samples
samples = generate_samples()([mu, sigma])
# for all the monte carlo samples, do : 
for i in range(mc_samples):
    cur_sample = Lambda(lambda x: K.slice(x, (0, 0, 0, 2*i), (-1, -1, -1, 2)), name="slice-%i" % i)(samples)
    cur_output = a(cur_sample)
    cur_output = b(cur_output)
    all_output.append(output)
output_of_net = keras.layers.concatenate(all_output)
return Model(inputs=inputs, outputs=output_of_net)

Просто зациклите последнее измерение в функции потерь, среднее значение, и все готово!Взгляд на мою потерю:

loss = 0
for i in range(mc_samples):
    loss += f(y_true[..., i], y_pred[..., i])
return loss/mc_samples
...