ValueError:检查输入时出错:预期 flatten_input 具有形状 (1, 4),但得到的数组具有形状 (1, 2)

问题描述 投票:0回答:5

我对 RL 还很陌生,我不太明白为什么会出现这个错误。

import random
import numpy as np
import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten
from tensorflow.keras.optimizers import Adam
from rl.agents import DQNAgent
from rl.policy import BoltzmannQPolicy
from rl.memory import SequentialMemory



def build_model(states, actions):
    model = Sequential()
    model.add(Flatten(input_shape=(1,states)))
    model.add(Dense(24, activation='relu'))
    model.add(Dense(24, activation='relu'))
    model.add(Dense(actions, activation='linear'))
    return model

def build_agent(model, actions):
    policy = BoltzmannQPolicy()
    memory = SequentialMemory(limit=50000, window_length=1)
    dqn = DQNAgent(model=model, memory=memory, policy=policy, 
                  nb_actions=actions, nb_steps_warmup=10, target_model_update=1e-2)
    return dqn

def main():

    env = gym.make('CartPole-v1')
    states = env.observation_space.shape[0]
    actions = env.action_space.n
    #print(env.reset())
    #print(env.action_space.sample())
    print(env.observation())

    model = build_model(states, actions)


    dqn = build_agent(model, actions)
    dqn.compile(Adam(learning_rate=1e-3),metrics=['mae'])
    dqn.fit(env, nb_steps=50000, visualize=False, verbose=1)


main()

我不明白为什么它会得到一个形状为 (1,2) 的数组。我浏览了一些人的类似问题,但我无法将其应用到我的问题上。 它开始训练,但立即失败,执行了 0 步。

提前致谢!

python tensorflow keras reinforcement-learning openai-gym
5个回答
1
投票

keras-rl2 库自 2021 年起已停产。请在此处查看他们的 github 存储库:https://github.com/taylormcnally/keras-rl2 您可以看到它已存档并且不再更新。

他们还删除了在线文档。

Gym 建议您不要使用 keras-rl2,而是使用其他库,例如 https://github.com/google/dopamine


1
投票

我也有同样的问题。看来这个问题是由于gym和keras-rl之间的兼容性造成的。基本上,gym 希望重置方法返回观察值和信息字典的元组。但 keras-rl 假设重置方法仅返回观察结果。我必须分叉 keras-rl 库并将

observation = env.reset()
调用更改为
observation, info = env.reset()
。我必须对
env.step()
做类似的事情,因为 keras-rl 认为它返回一个大小为 4 的元组,而gym 希望它的大小为 5,带有两个布尔值。


0
投票

虽然它已经停产,但我通过编辑 core.py 修复了它 我改变了

action = self.forward(observation)

            if first_time:
                action = self.forward(observation[0])
                first_time = False
            else:
                action = self.forward(observation)

现在就可以了:)请确保您在方法顶部初始化了first_time = True


0
投票

我正在研究同样的问题并面临完全相同的问题。安装包“rl-agents==0.1.1”为我解决了这个问题。谢谢

这是我这个项目的存储库的链接 https://github.com/tahmiid/DQNCartPoleAI


0
投票

所以我按照这种方式工作,首先,进入 core.py 文件。然后,

  1. 在Agent类的init(self)中初始化first_time的值

self.first_time = True  

  1. 在我的例子中,我更新了 fit(),所以转到 fit() 并替换

action = self.forward(observation)

if self.first_time:
    action = self.forward(observation[0])
    self.first_time = False
else:
    action = self.forward(observation)
  1. 在我们工作的 while 循环内,在

如果观察结果为“无”:

将first_time的值设置为True

if observation is None:  # start of a new episode
    self.first_time = True 
  1. 在同一个循环内,如果你往下走一点,你就可以看到

观察,r,完成,信息 = env.step(action)

将其替换为,

observation, r, done,trunc, info = env.step(action)

这对我来说就完成了工作。希望有帮助:)

© www.soinside.com 2019 - 2024. All rights reserved.