Проблема агента Tensorflow 2.0 DQN с настраиваемой средой

Итак, я следил за примером / учебником агента DQN и настраивал его, как в примере, с той лишь разницей, что я создал свою собственную среду Python, которую затем обернул в TensorFlow. Однако, как бы я ни формировал свои наблюдения и спецификации действий, мне кажется, что я не могу заставить его работать, когда я даю ему наблюдение и запрашиваю действие. Вот ошибка, которую я получаю:

tensorflow.python.framework.errors_impl.InvalidArgumentError: In[0] не является матрицей. Вместо этого он имеет форму [10] [Op:MatMul]

Вот как я настраиваю своего агента:

layer_parameters = (10,) #10 layers deep, shape is unspecified

#placeholders 
learning_rate = 1e-3  # @param {type:"number"}
train_step_counter = tf.Variable(0)

#instantiate agent

optimizer = tf.compat.v1.train.AdamOptimizer(learning_rate=learning_rate)

env = SumoEnvironment(self._num_actions,self._num_states)
env2 = tf_py_environment.TFPyEnvironment(env)
q_net= q_network.QNetwork(env2.observation_spec(),env2.action_spec(),fc_layer_params = layer_parameters)

print("Time step spec")
print(env2.time_step_spec())

agent = dqn_agent.DqnAgent(env2.time_step_spec(),
env2.action_spec(),
q_network=q_net,
optimizer = optimizer,
td_errors_loss_fn=common.element_wise_squared_loss,
train_step_counter=train_step_counter)

А вот как я настраиваю свою среду:

class SumoEnvironment(py_environment.PyEnvironment):

def __init__(self, no_of_Actions, no_of_Observations):

    #this means that the observation consists of a number of arrays equal to self._num_states, with datatype float32
    self._observation_spec = specs.TensorSpec(shape=(16,),dtype=np.float32,name='observation')
    #action spec, shape unknown, min is 0, max is the number of actions
    self._action_spec = specs.BoundedArraySpec(shape=(1,),dtype=np.int32,minimum=0,maximum=no_of_Actions-1,name='action')


    self._state = 0
    self._episode_ended = False

И вот как выглядят мои вводные / наблюдения:

tf.Tensor([0. 0. 0. 0. 0. 0. 0. 0. -1. -1. -1. -1. 0. 0. 0. -1.], shape = (16,), dtype = float32)

Я пробовал поэкспериментировать с формой и глубиной моей Q_Net, и мне кажется, что [10] в ошибке связано с формой моей q-сети. Установка его параметров слоя на (4,) дает ошибку:

tensorflow.python.framework.errors_impl.InvalidArgumentError: In[0] не является матрицей. Вместо этого он имеет форму [4] [Op:MatMul]

1 ответ

В своей среде Python вы должны определить свой self._observation_spec как тип BoundedArraySpec вместо TensorSpec, тогда tf_py_environment.TFPyEnvironment(env) преобразует среду Python в среду тензорного потока.

Не уверен, что это вызывает эту ошибку, но, по крайней мере, это проблема кода.

Вы можете попробовать установить параметры слоя, как показано ниже,

layer_parameters = (16,)

Сеть q попытается предсказать следующее действие по текущему состоянию. Форма состояния должна соответствовать входным данным базовой сети fc сети q.

Из матрицы ключевых слов в сообщении об ошибке я предполагаю, что TF ожидает двумерный тензор, а не одномерный.

Я бы посоветовал установить параметры слоя на (4, 1) (или (1, 4)).

Я попытаюсь немного поиграть с этим, чтобы подтвердить свой ответ.

Другие вопросы по тегам