Я пытаюсь вычислить градиент NN, используя Tensorflow 2.0 для реализации DDPG (Deep Deterministi c Policy Gradient). Связанная часть моего кода находится здесь: (Также я не уверен, нужна ли там tape.watch ())
...
self.model, self.action, self.state = self.create_critic_network(state_size, action_size)
...
def create_critic_network(self, state_size, action_dim):
print("Now we build the model")
S = Input(shape=[state_size])
A = Input(shape=[action_dim], name='action2')
w1 = Dense(HIDDEN1_UNITS, activation='relu')(S)
a1 = Dense(HIDDEN2_UNITS, activation='linear')(A)
h1 = Dense(HIDDEN2_UNITS, activation='linear')(w1)
h2 = add([h1, a1])
h3 = Dense(HIDDEN2_UNITS, activation='relu')(h2)
V = Dense(action_dim, activation='linear')(h3)
model = Model(inputs=[S, A], outputs=V)
adam = Adam(lr=self.LEARNING_RATE)
model.compile(loss='mse', optimizer=adam)
return model, A, S
# @tf.function
def gradients(self, states, actions):
with tf.GradientTape() as tape:
predictions = self.model([states, actions])
tape.watch(self.action)
return tape.gradient(predictions, self.action)[0]
a_for_grad = agent.actor.model.predict(states)
grads = agent.critic.gradients(states, a_for_grad)
agent.actor.train(states, grads)
Есть 1 сеть актеров и 1 Criti c Сеть. Актор прогнозирует значения действия, а Criti c рассчитывает градиент его выходных значений действия. На этом этапе мне нужно взять этот градиент и снова подать его в сеть акторов.
Но в строке predictions = self.model([states, actions])
я получил ошибку:
Traceback (most recent call last):
File "C:\Users\yasal\PycharmProjects\Socket\venv\lib\site-packages\keras\engine\base_layer.py", line 310, in assert_input_compatibility
K.is_keras_tensor(x)
File "C:\Users\yasal\PycharmProjects\Socket\venv\lib\site-packages\keras\backend\tensorflow_backend.py", line 697, in is_keras_tensor
str(type(x)) + '`. '
ValueError: Unexpectedly found an instance of type `<class 'numpy.ndarray'>`. Expected a symbolic tensor instance.
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:/Users/yasal/PycharmProjects/Socket/DDPG1.py", line 209, in <module>
grads = agent.critic.gradients(states, a_for_grad)
File "C:/Users/yasal/PycharmProjects/Socket/DDPG1.py", line 111, in gradients
predictions = self.model([states, actions])
File "C:\Users\yasal\PycharmProjects\Socket\venv\lib\site-packages\keras\backend\tensorflow_backend.py", line 75, in symbolic_fn_wrapper
return func(*args, **kwargs)
File "C:\Users\yasal\PycharmProjects\Socket\venv\lib\site-packages\keras\engine\base_layer.py", line 472, in __call__
self.assert_input_compatibility(inputs)
File "C:\Users\yasal\PycharmProjects\Socket\venv\lib\site-packages\keras\engine\base_layer.py", line 316, in assert_input_compatibility
str(inputs) + '. All inputs to the layer '
ValueError: Layer model_3 was called with an input that isn't a symbolic tensor. Received type: <class 'numpy.ndarray'>. Full input: [array([[0. , 0. , 0.272 , 0.365516, 1. , 0.21344 ,
0.193161]], dtype=float32), array([[-0.0670751 , 0.03081584]], dtype=float32)]. All inputs to the layer should be tensors.
Если я включу это строка: @tf.function
, я получаю другую ошибку:
Traceback (most recent call last):
File "C:/Users/yasal/PycharmProjects/Socket/DDPG1.py", line 206, in <module>
grads = agent.critic.gradients(states, a_for_grad)
File "C:\Users\yasal\PycharmProjects\Socket\venv\lib\site-packages\tensorflow_core\python\eager\def_function.py", line 568, in __call__
result = self._call(*args, **kwds)
File "C:\Users\yasal\PycharmProjects\Socket\venv\lib\site-packages\tensorflow_core\python\eager\def_function.py", line 615, in _call
self._initialize(args, kwds, add_initializers_to=initializers)
File "C:\Users\yasal\PycharmProjects\Socket\venv\lib\site-packages\tensorflow_core\python\eager\def_function.py", line 497, in _initialize
*args, **kwds))
File "C:\Users\yasal\PycharmProjects\Socket\venv\lib\site-packages\tensorflow_core\python\eager\function.py", line 2389, in _get_concrete_function_internal_garbage_collected
graph_function, _, _ = self._maybe_define_function(args, kwargs)
File "C:\Users\yasal\PycharmProjects\Socket\venv\lib\site-packages\tensorflow_core\python\eager\function.py", line 2703, in _maybe_define_function
graph_function = self._create_graph_function(args, kwargs)
File "C:\Users\yasal\PycharmProjects\Socket\venv\lib\site-packages\tensorflow_core\python\eager\function.py", line 2593, in _create_graph_function
capture_by_value=self._capture_by_value),
File "C:\Users\yasal\PycharmProjects\Socket\venv\lib\site-packages\tensorflow_core\python\framework\func_graph.py", line 978, in func_graph_from_py_func
func_outputs = python_func(*func_args, **func_kwargs)
File "C:\Users\yasal\PycharmProjects\Socket\venv\lib\site-packages\tensorflow_core\python\eager\def_function.py", line 439, in wrapped_fn
return weak_wrapped_fn().__wrapped__(*args, **kwds)
File "C:\Users\yasal\PycharmProjects\Socket\venv\lib\site-packages\tensorflow_core\python\eager\function.py", line 3211, in bound_method_wrapper
return wrapped_fn(*args, **kwargs)
File "C:\Users\yasal\PycharmProjects\Socket\venv\lib\site-packages\tensorflow_core\python\framework\func_graph.py", line 968, in wrapper
raise e.ag_error_metadata.to_exception(e)
NameError: in converted code:
C:/Users/yasal/PycharmProjects/Socket/DDPG1.py:111 gradients *
predictions = self.model([states, actions])
C:\Users\yasal\PycharmProjects\Socket\venv\lib\site-packages\keras\backend\tensorflow_backend.py:417 symbolic_fn_wrapper *
return func(*args, **kwargs)
C:\Users\yasal\PycharmProjects\Socket\venv\lib\site-packages\keras\engine\base_layer.py:506 __call__ *
output_shape = self.compute_output_shape(input_shape)
C:\Users\yasal\PycharmProjects\Socket\venv\lib\site-packages\keras\engine\network.py:656 compute_output_shape *
output_shape = layer.compute_output_shape(
C:\Users\yasal\PycharmProjects\Socket\venv\lib\site-packages\keras\layers\merge.py:173 compute_output_shape *
output_shape = self._compute_elemwise_op_output_shape(output_shape,
C:\Users\yasal\PycharmProjects\Socket\venv\lib\site-packages\keras\layers\merge.py:50 _compute_elemwise_op_output_shape *
for i, j in zip(shape1[-len(shape2):], shape2):
C:\Users\yasal\PycharmProjects\Socket\venv\lib\site-packages\tensorflow_core\python\autograph\operators\control_flow.py:339 for_stmt
return _py_for_stmt(iter_, extra_test, body, get_state, set_state, init_vars)
C:\Users\yasal\PycharmProjects\Socket\venv\lib\site-packages\tensorflow_core\python\autograph\operators\control_flow.py:348 _py_for_stmt
if extra_test is not None and not extra_test(*state):
C:\Users\yasal\AppData\Local\Temp\tmp0kkjwt9c.py:158 extra_test
return ag__.not_(do_return_2)
NameError: free variable 'do_return_2' referenced before assignment in enclosing scope
Process finished with exit code 1
Заранее благодарим за проявленный интерес!