Как обрабатывать функцию потерь и регистрировать вероятности для нейронной сети с несколькими выходами? - PullRequest
2 голосов
/ 22 мая 2019

Я реализовал пользовательскую среду в стиле сред OpenAi Gym, в которой у меня есть фигуры (круги, квадраты и т. Д.), Которые я могу перемещать по плоскости внутри границы.Я хочу применить к этой задаче алгоритмы обучения с подкреплением, такие как REINFORCE, и создал собственную функцию вознаграждения.Но теперь у меня возникли проблемы при проектировании нейронной сети, которая бы принимала состояние и выводила действие.

Чтобы представить некоторые сведения о моих настройках действия состояния.Для состояния я использую 2d-массив, описывающий тип фигуры (круг, квадрат и т. Д.) В виде одного горячо закодированного массива, а также положение (координаты x, y краев ограничительной рамки) и поворот формы (0 - 360) и иметь ряд для каждой фигуры в данный момент на плоскости.Для действия у меня есть 1d-массив с индексом формы для выбора и новой позиции и вращения.Я начал с объединения 2d-массива в один массив, затем со скрытым слоем, а затем разветвил на 3 выхода: Mu и Sigma для распределения вероятностей непрерывного вывода и вероятностей для выбора индекса фигур.

class Model(tf.keras.Model):
    def __init__(self, action_pair, input_shape):
        super().__init__('mlp_policy')

        self.input = kl.Input(shape=input_shape)
        self.flat = kl.Flatten()(self.input)
        self.hidden = kl.Dense(128, activation='relu')(self.flat)
        # action_pair is a tuple with the size of the categorical output and the continuous output
        self.index = kl.Dense(action_pair[0], activation='softmax', name='index')(self.hidden)
        self.mu_branch = kl.Dense(action_pair[1], activation='tanh', name='mu')(self.hidden)
        self.sigma_branch = kl.Dense(action_pair[1], activation='softplus', name='sigma')(self.hidden)


    def call(self, inputs):

        x = self.input(inputs)
        x = self.flat(x)
        hid = self.hidden(x)

        index = self.index(hid)
        mu = self.mu_branch(hid)
        sigma = self.sigma_branch(hid)

        return index_prob, mu, sigma

Я не знаю, как я должен обрабатывать логарифмические вероятности для функции потерь, потому что обычно я использовал бы mu и sigma для вычисления логарифмического вероятности, но теперь я должен также включить категориальные вероятности.Правильно ли предсказывать индекс, мю и сигму с помощью одной нейронной сети?Я только вхожу в RL, спасибо заранее

...