ValueError: Слой model_3 был вызван с вводом, который не является символом c тензором. Полученный тип: ndarray. Все входы в слой должны быть тензорами - PullRequest
0 голосов
/ 22 апреля 2020

Я пытаюсь вычислить градиент 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

Заранее благодарим за проявленный интерес!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...