Какой будет выход из плотного слоя тензорного потока, если мы назначим себя в качестве входных и выходных данных при создании нейронной сети? - PullRequest
0 голосов
/ 11 апреля 2020

Я проходил реализацию нейронной сети в коде openAI для любого градиента политики Vanilla (на самом деле эта часть используется практически везде). Код выглядит примерно так:

def mlp_categorical_policy(x, a, hidden_sizes, activation, output_activation, action_space):
    act_dim = action_space.n
    logits = mlp(x, list(hidden_sizes) + [act_dim], activation, None)
    logp_all = tf.nn.log_softmax(logits)
    pi = tf.squeeze(tf.random.categorical(logits, 1), axis=1)
    logp = tf.reduce_sum(tf.one_hot(a, depth=act_dim) * logp_all, axis=1)
    logp_pi = tf.reduce_sum(tf.one_hot(pi, depth=act_dim) * logp_all, axis=1)
    return pi, logp, logp_pi

, и эта многослойная сеть персептрона определяется следующим образом:

def mlp(x, hidden_sizes=(32,), activation=tf.tanh, output_activation=None):
    for h in hidden_sizes[:-1]:
        x = tf.layers.dense(inputs=x, units=h, activation=activation)
    return tf.layers.dense(inputs=x, units=hidden_sizes[-1], activation=output_activation)

Мой вопрос: каков возврат этой функции mlp? Я имею в виду структуру или форму. Это N-мерный тензор? Если да, то как он задается как tf.random_categorical? Если нет, и он просто имеет форму [hidden_layer2, output], то что случилось с другими слоями? Согласно их описанию сайта о random_categorical требуется только 2-D вход. Полный код алгоритма VPG openAI можно найти здесь. MLP реализован здесь . Я был бы очень признателен, если бы кто-то просто сказал мне, что делает mlp_categorical_policy()?

Примечание: скрытый размер - [64, 64], размер действия - 3

Спасибо и веселит

1 Ответ

1 голос
/ 12 апреля 2020

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

Для этого MLP возвращает логиты (которые являются функцией вероятностей) различных действий. Это указывается в коде + [act_dim], который добавляет счетчик action_space в качестве конечного уровня MLP. Обратите внимание, что последний уровень MLP является выходным уровнем. Входной слой не определен в тензорном потоке, он выводится из входных данных.

tf.random.categorical берет логиты и выбирает из них действие политики pi, которое возвращается как число.

mlp_categorical_policy также возвращает logp, логарифмическая вероятность действия a (используется для назначения кредита) и logp_pi, логарифмическая вероятность действия политики pi.


Похоже, ваш вопрос больше касается возврата из mlp.

mlp создает серию полностью связанных слоев в al oop. На каждой итерации l oop, mlp равен , создавая новый слой, используя предыдущий слой x в качестве входных данных, и назначая его вывод перезаписать x с этой строкой x = tf.layers.dense(inputs=x, units=h, activation=activation).

Таким образом, выходные данные не совпадают с входными данными, на каждой итерации x перезаписывается значением нового слоя. Это тот же вид кодирования, что и x = x + 1, который увеличивает x на 1. Это эффективно объединяет слои в слои.

Вывод tf.layers.dense имеет тензор размера [:,h], где : - размер партии (обычно его можно игнорировать). Создание последнего слоя происходит вне l oop, видно, что число узлов в этом слое равно act_dim (поэтому форма равна [:,3]). Вы можете проверить форму, выполнив это:

import tensorflow.compat.v1 as tf
import numpy as np

def mlp(x, hidden_sizes=(32,), activation=tf.tanh, output_activation=None):
    for h in hidden_sizes[:-1]:
        x = tf.layers.dense(x, units=h, activation=activation)
    return tf.layers.dense(x, units=hidden_sizes[-1], activation=output_activation)

obs = np.array([[1.0,2.0]])
logits = mlp(obs, [64, 64, 3], tf.nn.relu, None)
print(logits.shape)

результат: TensorShape([1, 3])

Обратите внимание, что наблюдение в этом случае [1.,2.], оно вложено в партию размером 1 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...