TypeError: len n'est pas bien défini pour les tenseurs symboliques. (activation_3 / Identité: 0) Veuillez appeler `x.shape` plutôt que` len (x) `pour des informations sur la forme

10

J'essaie d'implémenter un modèle DQL sur un jeu de gym openAI. Mais cela me donne l'erreur suivante.

TypeError: len n'est pas bien défini pour les tenseurs symboliques. (activation_3 / Identité: 0) Veuillez appeler x.shapeplutôt que len(x) pour obtenir des informations sur la forme.

Créer un environnement de gym:

ENV_NAME = 'CartPole-v0'

env = gym.make(ENV_NAME)
np.random.seed(123)
env.seed(123)
nb_actions = env.action_space.n

Mon modèle ressemble à ceci:

model = Sequential()
model.add(Flatten(input_shape=(1,) + env.observation_space.shape))
model.add(Dense(16))
model.add(Activation('relu'))
model.add(Dense(nb_actions))
model.add(Activation('linear'))
print(model.summary())

Ajustement de ce modèle au modèle DQN de keral-rl comme suit:

policy = EpsGreedyQPolicy()
memory = SequentialMemory(limit=50000, window_length=1)
dqn = DQNAgent(model=model, nb_actions=nb_actions, memory=memory, nb_steps_warmup=10, target_model_update=0.001, policy=policy)
dqn.compile(Adam(lr=1e-3), metrics=['mse', 'mae'])
dqn.fit(env, nb_steps=5000, visualize=False, verbose=3)

L'erreur vient de cette ligne:

dqn = DQNAgent(model=model, nb_actions=nb_actions, memory=memory, nb_steps_warmup=10, target_model_update=0.001, policy=policy)

J'utilise keras-rl == 0.4.2 et tensorflow == 2.1.0. Sur la base d'autres réponses, j'ai également essayé tensorflow == 2.0.0-beta0 mais cela ne résout pas l'erreur.

Quelqu'un peut-il m'expliquer pourquoi je fais face à cette erreur? et comment le résoudre?

Je vous remercie.

vivekpadia70
la source
2
Qu'est-ce que c'est env? Où lense déroule-t-il? Ou cela fait-il partie des rappels?
Celius Stingher
envest un environnement de jeu de gym pour l'entraînement du modèle RL. lense déroule quelque part dans la bibliothèque TensorFlow. J'ai mis à jour la question pour plus de détails.
vivekpadia70

Réponses:

3

La raison de cette rupture est que tf.TensorTF 2.0.0 (et TF 1.15) est __len__surchargé et déclenche une exception . Mais TF 1.14 par exemple n'a pas d' __len__attribut.

Par conséquent, tout ce que TF 1.15+ (inclus) casse keras-rl(spécifiquement ici ), ce qui vous donne l'erreur ci-dessus. Vous avez donc deux options,

  • Rétrograder vers TF 1.14 (recommandé)
  • Supprimez la __len__surcharge dans la source TensorFlow ( non recommandé car cela peut casser d'autres choses)
thushv89
la source
Merci d'avoir répondu. Cela fonctionne parfaitement sur TF 1.14.
vivekpadia70