Błąd typu: len nie jest dobrze zdefiniowany dla symbolicznych Tensorów. (aktywacja_3 / Tożsamość: 0) Zadzwoń do „x.shape” zamiast do „len (x)” w celu uzyskania informacji o kształcie

10

Próbuję wdrożyć model DQL w jednej grze na siłowni openAI. Ale daje mi następujący błąd.

Błąd typu: len nie jest dobrze zdefiniowany dla symbolicznych Tensorów. (aktywacja_3 / Tożsamość: 0) Zadzwoń x.shapezamiast len(x) informacji o kształcie.

Tworzenie środowiska na siłowni:

ENV_NAME = 'CartPole-v0'

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

Mój model wygląda następująco:

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

Dopasuj ten model do modelu DQN z keral-rl w następujący sposób:

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)

Błąd pochodzi z tego wiersza:

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

Używam keras-rl == 0.4.2 i tensorflow == 2.1.0. W oparciu o inne odpowiedzi próbowałem również tensorflow == 2.0.0-beta0, ale to nie rozwiązuje błędu.

Czy ktoś może mi wyjaśnić, dlaczego mam do czynienia z tym błędem? i jak to rozwiązać?

Dziękuję Ci.

vivekpadia70
źródło
2
Co to jest env? Gdzie się lendzieje? Czy jest to część oddzwaniania?
Celius Stingher
envto środowisko gry siłowni do treningu modelu RL. lenodbywa się gdzieś w bibliotece TensorFlow. Zaktualizowałem pytanie, aby uzyskać więcej informacji.
vivekpadia70

Odpowiedzi:

3

Powodem tego jest to, że tf.TensorTF 2.0.0 (i TF 1.15) ma __len__przeciążenie i zgłasza wyjątek . Ale na przykład TF 1.14 nie ma tego __len__atrybutu.

Dlatego wszystko TF 1.15+ (włącznie) psuje się keras-rl(szczególnie tutaj ), co daje powyższy błąd. Masz dwie opcje,

  • Obniż wersję do TF 1.14 (zalecane)
  • Usuń __len__przeciążenie w źródle TensorFlow ( niezalecane, ponieważ może to uszkodzić inne rzeczy)
thushv89
źródło
Dziękuję za odpowiedź. Działa idealnie na TF 1.14.
vivekpadia70