Создание softmax из выходного слоя tf.distributions.Categorical - PullRequest
1 голос
/ 29 марта 2019

Я обучаю агента действовать в дискретной среде, и я использую выходной слой tf.distributions.Categorical, который затем пробую, чтобы создать вывод softmax, чтобы определить, какое действие предпринять. Я создаю свою политику сети следующим образом:

pi_eval, _ = self._build_anet(self.state, 'pi', reuse=True)

def _build_anet(self, state_in, name, reuse=False):
    w_reg = tf.contrib.layers.l2_regularizer(L2_REG)
    with tf.variable_scope(name, reuse=reuse):
        layer_1 = tf.layers.dense(state_in, HIDDEN_LAYER_NEURONS, tf.nn.relu, kernel_regularizer=w_reg, name="pi_l1")
        layer_2 = tf.layers.dense(layer_1, HIDDEN_LAYER_NEURONS, tf.nn.relu, kernel_regularizer=w_reg, name="pi_l2")
        a_logits = tf.layers.dense(layer_2, self.a_dim, kernel_regularizer=w_reg, name="pi_logits")
        dist = tf.distributions.Categorical(logits=a_logits)
    params = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope=name)
    return dist, params

Затем я делаю выборку из сети и создаю вывод распределения классов, который будет действовать как вывод softmax, используя пример из tf.distributions.Categorical webpage :

n = 1e4
self.logits_action = tf.cast(tf.histogram_fixed_width(values=pi_eval.sample(int(n)), value_range=[0, 1], nbins=self.a_dim), dtype=tf.float32) / n

Беги так:

softmax = self.sess.run([self.logits_action], {self.state: state[np.newaxis, :]})

Но на выходах всегда есть только две ненулевые записи:

[0.44329998 0.         0.         0.5567    ]
[0.92139995 0.         0.         0.0786    ]
[0.95699996 0.         0.         0.043     ]
[0.7051 0.     0.     0.2949]

Моя догадка как-то связана с value_range, что в документации гласит:

value_range: Shape 2 Тензор того же типа d, что и значения. значения <= value_range [0] будет отображаться в исторических [0], значения> = value_range 1 будет сопоставлен с историей [-1].

Но я не уверен, какой диапазон значений мне следует использовать? Интересно, были ли у кого-нибудь идеи?

1 Ответ

0 голосов
/ 29 марта 2019

Действительно, как я и подозревал, это было как-то связано с value_range, и я должен установить верхний размер для измерения действия:

value_range=[0, self.a_dim]
...