TypeError: len no está bien definido para los tensores simbólicos. (activación_3 / Identidad: 0) Llame a `x.shape` en lugar de a` len (x) `para obtener información sobre la forma

10

Estoy tratando de implementar un modelo DQL en un juego de gimnasio openAI. Pero me está dando el siguiente error.

TypeError: len no está bien definido para los tensores simbólicos. (activación_3 / Identidad: 0) Llame en x.shapelugar de len(x) para obtener información sobre la forma.

Crear un ambiente de gimnasio:

ENV_NAME = 'CartPole-v0'

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

Mi modelo se ve así:

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())

Ajuste de ese modelo al modelo DQN de keral-rl de la siguiente manera:

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)

El error es de esta línea:

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

Estoy usando keras-rl == 0.4.2 y tensorflow == 2.1.0. Basado en otras respuestas, también probé tensorflow == 2.0.0-beta0 pero no resuelve el error.

¿Alguien puede explicarme por qué me enfrento a este error? ¿Y como resolverlo?

Gracias.

vivekpadia70
fuente
2
¿Qué es env? ¿Dónde está lenteniendo lugar? ¿O es parte de las devoluciones de llamada?
Celius Stingher
enves un entorno de juego de gimnasia para entrenar el modelo RL. lenestá teniendo lugar en algún lugar de la biblioteca TensorFlow. He actualizado la pregunta para más detalles.
vivekpadia70

Respuestas:

3

La razón por la que esto se rompe es porque tf.TensorTF 2.0.0 (y TF 1.15) tiene la __len__sobrecarga y genera una excepción . Pero TF 1.14, por ejemplo, no tiene el __len__atributo.

Por lo tanto, cualquier cosa TF 1.15+ (inclusive) se rompe keras-rl(específicamente aquí ), lo que le da el error anterior. Entonces tienes dos opciones,

  • Bajar a TF 1.14 (recomendado)
  • Elimine la __len__sobrecarga en la fuente TensorFlow ( no se recomienda ya que esto puede romper otras cosas)
thushv89
fuente
Gracias por la respuesta. Funciona perfectamente en TF 1.14.
vivekpadia70