Python TypeError:len对于符号张量没有很好的定义。(激活3/Identity:0)请拨打'x.shape'而不是'len(x)`获取形状信息

Python TypeError:len对于符号张量没有很好的定义。(激活3/Identity:0)请拨打'x.shape'而不是'len(x)`获取形状信息,python,tensorflow,keras,reinforcement-learning,keras-rl,Python,Tensorflow,Keras,Reinforcement Learning,Keras Rl,我试图在openAI gym的一个游戏上实现一个DQL模型。但它给了我以下的错误 TypeError:len对于符号张量没有很好的定义。 (激活\u 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 我的模型如下所示: mod

我试图在openAI gym的一个游戏上实现一个DQL模型。但它给了我以下的错误

TypeError:len对于符号张量没有很好的定义。 (激活\u 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())
将该模型与keral rl的DQN模型拟合如下:

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和tensorflow==2.1.0。基于其他答案,我也尝试了tensorflow==2.0.0-beta0,但它没有解决错误

有人能给我解释一下为什么我要面对这个错误吗?如何解决呢


谢谢。

这个中断的原因是,
tf.Tensor
tf2.0.0(和tf1.15)重载了
\uu len\uuu
。但是,例如TF1.14没有
\uu len\uu
属性

因此,任何TF 1.15+(包括TF 1.15+)都会破坏keras rl(特别是),这会导致上述错误。所以你有两个选择

  • 降级至TF 1.14(推荐)
  • 删除TensorFlow源中的重载(不推荐使用,因为这会破坏其他内容)

    • 对我来说,暂时的解决办法是改变这一行

      if hasattr(model.output, '__len__') and len(model.output) > 1:
      
      在agentfile中,错误来自何处,在我的例子中是dqn.py to:

      if hasattr(model.output, '__len__') and len([model.output.shape.dims.__len__()]) > 1:
      

      什么是
      env
      len
      在哪里发生?或者它是回调的一部分?
      env
      是用于训练RL模型的健身房游戏环境<代码>len正在TensorFlow库中的某个地方进行。我已经更新了问题的更多细节。谢谢你的回答。它在TF1.14上运行得很好。