Мне удалось запустить тензор потока.nn.softmax_cross_entropy_with_logits_v2 () с метками и логитами с формой [Нет, 1], где этот тензор является индексом действия (категория). У меня был сбой на стороне графического процессора, и я понял, что все время был неправ, и забыл об одной из самых важных функций: кодировании одним нажатием. Я использовал многочлен для вычисления индекса, а затем один горячий результат. Пример ниже:
import tensorflow as tf
import numpy as np
p = tf.placeholder(shape = [None,4],dtype=tf.float32)
t = tf.nn.softmax(p)
t1 = tf.random.categorical(tf.log(t),1)
t2 = tf.one_hot(t1, 4,
on_value=1.0, off_value=0.0,
axis=-1)
with tf.Session() as sess:
inArray = [[0.8,0.5,0.1,0.2]]
index, outArray = sess.run([t1,t2],feed_dict={p:inArray})
print("Index:",index)
print("Array:",outArray)
Это была, конечно, ошибка новичка, я новичок в ML и с трудом понимал тензорный поток.
Теперь агент выглядит так:
class agentY():
def __init__(self,lr,s_size,a_size,h_size):
self.state_in = tf.placeholder(shape = [None]+list(s_size),dtype=tf.float32)
conv1 = tf.layers.conv2d(self.state_in,32,4,strides=(4, 4))
max_pool1 = tf.layers.max_pooling2d(conv1,32,4)
flatten = tf.layers.flatten(max_pool1)
hidden = tf.layers.dense(flatten,4096,activation=tf.nn.tanh)
hidden_action = tf.layers.dense(hidden,2048, activation=tf.nn.elu)
self.action_logits = tf.layers.dense(hidden_action,9, activation=tf.nn.softmax)
self.action_out = tf.one_hot(tf.multinomial(self.action_logits,1), 9,on_value=1.0, off_value=0.0,axis=-1)
cross_entropy = tf.nn.softmax_cross_entropy_with_logits_v2(labels=self.action_out,
logits=self.action_logits)
optimizer = tf.train.AdamOptimizer(lr)
grads_and_vars = optimizer.compute_gradients(cross_entropy)
self.gradients = [grad for grad, variable in grads_and_vars]
self.gradient_placeholders = []
grads_and_vars_feed = []
for grad, variable in grads_and_vars:
gradient_placeholder = tf.placeholder(tf.float32, shape=grad.get_shape())
self.gradient_placeholders.append(gradient_placeholder)
grads_and_vars_feed.append((gradient_placeholder, variable))
self.training_op = optimizer.apply_gradients(grads_and_vars_feed)
tf.reset_default_graph()
testAgent = agentY(0.1,(300,400,1),9,11)
Проблема сейчас в том, что Iam собирает градиенты при каждом решении Агента. Это занимает огромное количество оперативной памяти, и я уверен, что не рекомендуется. Посмотрите ниже:
while True:
time0 = time.time()
#-----------------zzx
if collectData:
state = get_state()
action_out, gradients = sess.run([myAgent.action_out,myAgent.gradients], feed_dict={myAgent.state_in:[state]})
if do_action:
releaseKeys();
update_pressed_keys(categoriesToKeys(action))
reward = reward + delta_time
current_rewards.append(reward)
current_gradients.append(gradients)
Позже я буду использовать эти градиенты в функции teach_agent (), чтобы ввести вознаграждение в сеть Агента. (teach_agent опубликован в оригинальном сообщении) Прежде чем я вернусь к книге и попытаюсь понять следующий пример агента Q-Learning, может ли кто-нибудь (если это возможно) легко объяснить другой способ Q-Learning или Reinforce Learning?