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.shape
zamiastlen(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.
python
tensorflow
keras
reinforcement-learning
keras-rl
vivekpadia70
źródło
źródło
env
? Gdzie sięlen
dzieje? Czy jest to część oddzwaniania?env
to środowisko gry siłowni do treningu modelu RL.len
odbywa się gdzieś w bibliotece TensorFlow. Zaktualizowałem pytanie, aby uzyskać więcej informacji.Odpowiedzi:
Powodem tego jest to, że
tf.Tensor
TF 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,__len__
przeciążenie w źródle TensorFlow ( niezalecane, ponieważ może to uszkodzić inne rzeczy)źródło