Tensorflow 2.0: объект numpy .dtype не имеет атрибута is_floating при использовании GradientTape для явного вычисления и применения градиента - PullRequest
0 голосов
/ 09 января 2020

Для обучения с подкреплением я хотел бы явно

  • вычислить градиент нейронной сети относительно вероятностей вывода softmax
  • обновить веса нейронной сети градиентами * оценка преимуществ действий. (увеличить вероятность успешных действий, уменьшить вероятность неудачных действий)

Я создал агент с простой политикой сети:

def simple_policy_model(self):        
    inputs = Input(shape=(self.state_size,), name="Input")
    outputs = Dense(self.action_size, activation='softmax', name="Output")(inputs)
    predict_model = Model(inputs=[inputs], outputs=[outputs])
    return predict_model

Затем я пытаюсь получить градиенты:

agent = REINFORCE_Agent(state_size=env.observation_space.shape[0],
                        action_size=env.action_space.n)
print(agent.predict_model.summary())
state_memory = np.random.uniform(size=(3,4))/10
#state_memory = tf.convert_to_tensor(state_memory)
print(state_memory)
print(agent.predict_model.predict(state_memory))

with tf.GradientTape() as tape:
    probs = agent.predict_model.predict(state_memory)
    ### fails below ###
    grads = tape.gradient(probs, agent.predict_model.trainable_weights)

Вывод:

Model: "model_18"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
Input (InputLayer)           (None, 4)                 0         
_________________________________________________________________
Output (Dense)               (None, 2)                 10        
=================================================================
Total params: 10
Trainable params: 10
Non-trainable params: 0
_________________________________________________________________
None
state_memory [[0.01130021 0.01476066 0.09524527 0.05552276]
 [0.02018996 0.03127809 0.07232339 0.07146596]
 [0.08925738 0.08890574 0.04845396 0.0056015 ]]
prediction [[0.5127161  0.4872839 ]
 [0.5063317  0.49366832]
 [0.4817074  0.51829267]]
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
...
AttributeError: 'numpy.dtype' object has no attribute 'is_floating'

Если я преобразую state_memory в тензор, раскомментировав convert_to_tensor, он завершится неудачей в .predict ():

ValueError: If your data is in the form of symbolic tensors, you should specify the `steps` argument (instead of the `batch_size` argument, because symbolic tensors are expected to produce batches of input data).

Кажется достаточно простым, но получилось довольно застрял, есть идеи, как правильно получить градиенты?

1 Ответ

0 голосов
/ 09 января 2020

Проблема в том, что

probs = agent.predict_model.predict(state_memory)

Создает тензор numpy в качестве вывода. И вы не можете получить градиенты w.r.t numpy тензоров. Вместо этого вам нужно tf.Tensor от вашей модели. Для этого сделайте следующее.

with tf.GradientTape() as tape:
    probs = agent.predict_model(state_memory)
    ### fails below ###
grads = tape.gradient(probs, agent.predict_model.trainable_weights)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...