Слой softmax для обучения с подкреплением TensorFlow - PullRequest
0 голосов
/ 13 июля 2020

У меня проблема с кодом TensorFlow. Вот фрагмент кода, который я использовал в своей предыдущей среде - Проблема с тележкой

initializer = tf.contrib.layers.variance_scaling_initializer()

X = tf.placeholder(tf.float32, shape=[None, n_inputs])

hidden = tf.layers.dense(X, n_hidden, activation=tf.nn.elu, kernel_initializer=initializer)
logits = tf.layers.dense(hidden, n_outputs)
outputs = tf.nn.sigmoid(logits)  

p_left_and_right = tf.concat(axis=1, values=[outputs, 1 - outputs])
action = tf.multinomial(tf.log(p_left_and_right), num_samples=1)

y = 1. - tf.to_float(action)

cross_entropy = tf.nn.sigmoid_cross_entropy_with_logits(labels=y, logits=logits)
optimizer = tf.train.AdamOptimizer(learning_rate)
grads_and_vars = optimizer.compute_gradients(cross_entropy)

Было два возможных дискретных решения (движение вправо и влево).

Решение было дано по сигмовидному слою, который позже был выбран случайным образом с вероятностями, заданными этим слоем.

Теперь у меня есть среда с тремя дискретными возможными решениями, поэтому я попробовал со слоем softmax, и это не сработало. Когда я запускаю сеанс TensorFlow. Код такой:

initializer = tf.contrib.layers.variance_scaling_initializer()

X = tf.placeholder(tf.float32, shape=[None, n_inputs])

hidden = tf.layers.dense(X, n_hidden, activation=tf.nn.elu, kernel_initializer=initializer)

logits = tf.layers.dense(hidden, n_outputs)

outputs = tf.nn.softmax(logits)  

p_left_and_right = tf.concat(axis=3, values=[outputs])
action = tf.multinomial(tf.log(p_left_and_right), num_samples=1)

y = 1. - tf.to_float(action)
cross_entropy = tf.nn.softmax_cross_entropy_with_logits_v2(labels=y, logits=logits)
optimizer = tf.train.AdamOptimizer(learning_rate)
grads_and_vars = optimizer.compute_gradients(cross_entropy)

Как мне его изменить или улучшить, чтобы добиться подходящего результата и исправить / улучшить код TensorFlow

Ответы [ 2 ]

0 голосов
/ 15 июля 2020

Самым простым решением проблемы является изменение функции кросс-энтропии. Я изменил его на sparse_softmax_cross_entropy_with_logits, которому не нужны метки в одном формате горячего кодирования.

initializer = tf.contrib.layers.variance_scaling_initializer()

X = tf.placeholder(tf.float32, shape=[None, n_inputs])

hidden = tf.layers.dense(X, n_hidden, activation=tf.nn.elu, kernel_initializer=initializer)

logits = tf.layers.dense(hidden, n_outputs)

action = tf.multinomial(logits, num_samples=1)


cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(labels= action[0], logits=logits)
0 голосов
/ 14 июля 2020

Я не пробовал запускать это сам, но я предполагаю отказаться от хаков, которые были введены для сопоставления случая Бернулли с более общим категориальным случаем.

Чтобы быть более конкретным c , Я бы попытался сделать это:


initializer = tf.contrib.layers.variance_scaling_initializer()

X = tf.placeholder(tf.float32, shape=[None, n_inputs])

hidden = tf.layers.dense(X, n_hidden, activation=tf.nn.elu, kernel_initializer=initializer)

logits = tf.layers.dense(hidden, n_outputs)

action = tf.multinomial(logits, num_samples=1)

cross_entropy = tf.nn.softmax_cross_entropy_with_logits_v2(labels=action, logits=logits)
optimizer = tf.train.AdamOptimizer(learning_rate)
grads_and_vars = optimizer.compute_gradients(cross_entropy)

(я предполагаю, что вы используете эти градации для создания правильного сигнала обратной связи, который также включает в себя некоторые доходы / преимущества)

...