TypeError: len ist für symbolische Tensoren nicht gut definiert. (Aktivierung_3 / Identität: 0) Bitte rufen Sie "x.shape" anstelle von "len (x)" auf, um Informationen zur Form zu erhalten

10

Ich versuche, ein DQL-Modell für ein Spiel von openAI Gym zu implementieren. Aber es gibt mir folgenden Fehler.

TypeError: len ist für symbolische Tensoren nicht gut definiert. (Aktivierung_3 / Identität: 0) Bitte x.shapeeher anrufen alslen(x) Informationen zur Form zu erhalten.

Erstellen einer Fitnessumgebung:

ENV_NAME = 'CartPole-v0'

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

Mein Modell sieht so aus:

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

Anpassen dieses Modells an das DQN-Modell von keral-rl wie folgt:

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)

Der Fehler stammt aus dieser Zeile:

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

Ich benutze keras-rl == 0.4.2 und tensorflow == 2.1.0. Basierend auf anderen Antworten habe ich auch Tensorflow == 2.0.0-beta0 ausprobiert, aber es löst den Fehler nicht.

Kann mir bitte jemand erklären, warum ich mit diesem Fehler konfrontiert bin? und wie man es löst?

Vielen Dank.

vivekpadia70
quelle
2
Was ist env? Wo findet das lenstatt? Oder ist es Teil der Rückrufe?
Celius Stingher
envist eine Fitness-Spielumgebung zum Trainieren des RL-Modells. lenfindet irgendwo in der TensorFlow-Bibliothek statt. Ich habe die Frage für weitere Details aktualisiert.
vivekpadia70

Antworten:

3

Der Grund dafür ist, dass tf.TensorTF 2.0.0 (und TF 1.15) __len__überlastet sind und eine Ausnahme auslösen . Aber TF 1.14 zum Beispiel hat das __len__Attribut nicht.

Daher bricht alles, was TF 1.15+ (einschließlich) ist keras-rl(speziell hier ), was Ihnen den obigen Fehler gibt. Sie haben also zwei Möglichkeiten:

  • Downgrade auf TF 1.14 (empfohlen)
  • Löschen Sie die __len__ Überladung in der TensorFlow-Quelle ( nicht empfohlen, da dies andere Probleme verursachen kann).
thushv89
quelle
Danke für die Antwort. Es funktioniert perfekt mit TF 1.14.
vivekpadia70