Ошибка типа: len не определено для символов c Тензор. (Activation_3 / Identity: 0) Пожалуйста, вызовите `x.shape` вместо` len (x) `для информации о форме - PullRequest
10 голосов
/ 10 января 2020

Я пытаюсь реализовать модель DQL на одной игре в тренажерный зал openAI. Но это дает мне следующую ошибку:

TypeError: len не определен для символов c Тензор. (активация_3 / идентификационный номер: 0). Для получения информации о фигуре, пожалуйста, позвоните x.shape, а не len(x).

Создание среды в спортзале:

ENV_NAME = 'CartPole-v0'

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

Моя модель выглядит следующим образом:

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

Подгонка этой модели к модели DQN из keral-rl следующим образом:

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)

Ошибка с этой строки:

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

Я использую keras-rl == 0.4.2 и тензор потока == 2.1.0. Основываясь на других ответах, я также попытался использовать tenorflow == 2.0.0-beta0, но это не устраняет ошибку.

Может кто-нибудь объяснить мне, почему я сталкиваюсь с этой ошибкой? и как это решить?

Спасибо.

1 Ответ

3 голосов
/ 15 января 2020

Причина этого перерыва в том, что tf.Tensor TF 2.0.0 (и TF 1.15) перегружен __len__, а вызывает исключение . Но TF 1.14, например, не имеет атрибута __len__.

Следовательно, все, что TF 1.15+ (включительно), нарушает keras-rl (в частности, здесь ), что дает вам вышеуказанное ошибка. Таким образом, у вас есть два варианта:

  • Понижение до TF 1.14 (рекомендуется)
  • Удалить перегрузку __len__ в источнике TensorFlow ( не рекомендуется как это может сломать другие вещи)
...