TypeError: len não está bem definido para tensores simbólicos. (activation_3 / Identity: 0) Por favor, chame `x.shape` em vez de` len (x) `para obter informações sobre a forma

10

Estou tentando implementar um modelo DQL em um jogo da academia openAI. Mas está me dando o seguinte erro.

TypeError: len não está bem definido para tensores simbólicos. (activation_3 / Identidade: 0) Por favor, ligue x.shape, em vez de len(x) para a informação da forma.

Criando um ambiente de academia:

ENV_NAME = 'CartPole-v0'

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

Meu modelo fica assim:

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

Ajustando esse modelo ao modelo DQN de keral-rl, da seguinte maneira:

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)

O erro é desta linha:

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

Estou usando o keras-rl == 0.4.2 e tensorflow == 2.1.0. Com base em outras respostas, também tentei o tensorflow == 2.0.0-beta0, mas isso não resolve o erro.

Alguém pode me explicar por que estou enfrentando esse erro? e como resolver isso?

Obrigado.

vivekpadia70
fonte
2
O que é env? Onde está lenocorrendo? Ou isso faz parte dos retornos de chamada?
Celius Stingher
envé um ambiente de jogo de ginástica para o treinamento do modelo RL. lenestá ocorrendo em algum lugar da biblioteca TensorFlow. Atualizei a pergunta para obter mais detalhes.
vivekpadia70 11/01

Respostas:

3

A razão pela qual isso ocorre é porque o tf.TensorTF 2.0.0 (e o TF 1.15) está __len__sobrecarregado e gera uma exceção . Mas o TF 1,14, por exemplo, não tem o __len__atributo

Portanto, qualquer coisa que o TF 1.15+ (inclusive) interrompa keras-rl(especificamente aqui ), resultando no erro acima. Então você tem duas opções,

  • Faça o downgrade para o TF 1.14 (recomendado)
  • Exclua a __len__sobrecarga na fonte do TensorFlow ( não recomendado, pois isso pode quebrar outras coisas)
thushv89
fonte
Obrigado pela resposta. Está funcionando perfeitamente no TF 1.14.
vivekpadia70 17/01