Keras 模型:RL 代理的输入形状尺寸错误

Keras model: Input shape dimension error for RL agent

我的目标是开发一个 DQN-agent,它将根据某个 strategy/policy 选择其动作。我以前使用 OpenAi 健身房环境,但现在我想创建自己的 RL 环境。

在此阶段,代理 应选择随机动作或根据深度神经网络(在 class 中定义)给出的预测选择动作DQN)。

到目前为止,我已经设置了 神经网络模型和我的环境 。 NN 应接收状态作为其输入。这些状态表示 11 个可能的标量值,范围从 9.5 到 10.5(9.5、9.6、...、10.4、10.5)。由于我们正在处理 RL,因此代理会在训练过程中生成其数据。输出应该是对应于推荐操作的 0 和 1。

现在,我想向我的代理提供一个 标量值:例如x = 10 的示例状态并让他决定要采取的操作(调用 Agent.select_action()),我遇到了与输入 shape/input 维度相关的问题。

代码如下: 1。 DQN Class:

class DQN():

    def __init__(self, state_size, action_size, lr):
        self.state_size = state_size
        self.action_size = action_size
        self.lr = lr

        self.model = Sequential()
        self.model.add(Dense(128, input_dim=self.state_size, activation='relu'))
        self.model.add(Dense(128, activation='relu'))
        self.model.add(Dense(self.action_size, activation='linear'))

        self.model.compile(optimizer=Adam(lr=self.lr), loss='mse')

        self.model.summary()


    def model_info(self):
        model_description = '\n\n---Model_INFO Summary: The model was passed {} state sizes,\
            \n {} action sizes and a learning rate of {} -----'\
                            .format(self.state_size, self.action_size, self.lr)
        return model_description

    def predict(self, state):
        return self.model.predict(state)

    def train(self, state, q_values):
        self.state = state
        self.q_values = q_values
        return self.model.fit(state, q_values, verbose=0)

    def load_weights(self, path):
        self.model.load_weights(path)

    def save_weights(self, path):
        self.model.save_weights(path)

2。特工 Class:

NUM_EPISODES = 100
MAX_STEPS_PER_EPISODE = 100
EPSILON = 0.5 
EPSILON_DECAY_RATE = 0.001
EPSILON_MIN = 0.01
EPSILON_MAX = 1
DISCOUNT_FACTOR = 0.99
REPLAY_MEMORY_SIZE = 50000
BATCH_SIZE = 50
TRAIN_START = 100
ACTION_SPACE = [0, 1]
STATE_SIZE = 11 
LEARNING_RATE = 0.01

class Agent():
    def __init__(self, num_episodes, max_steps_per_episode, epsilon, epsilon_decay_rate, \
        epsilon_min, epsilon_max, discount_factor, replay_memory_size, batch_size, train_start):
        self.num_episodes = NUM_EPISODES
        self.max_steps_per_episode = MAX_STEPS_PER_EPISODE
        self.epsilon = EPSILON
        self.epsilon_decay_rate = EPSILON_DECAY_RATE
        self.epsilon_min = EPSILON_MIN
        self.epsilon_max = EPSILON_MAX
        self.discount_factor = DISCOUNT_FACTOR
        self.replay_memory_size = REPLAY_MEMORY_SIZE
        self.replay_memory = deque(maxlen=self.replay_memory_size)
        self.batch_size = BATCH_SIZE
        self.train_start = TRAIN_START
        self.action_space = ACTION_SPACE
        self.action_size = len(self.action_space)
        self.state_size = STATE_SIZE
        self.learning_rate = LEARNING_RATE
        self.model = DQN(self.state_size, self.action_size, self.learning_rate)

    def select_action(self, state):
        random_value = np.random.rand()
        if random_value < self.epsilon:
            print('random_value = ', random_value)       
            chosen_action = random.choice(self.action_space) # = EXPLORATION Strategy
            print('Agent randomly chooses the following EXPLORATION action:', chosen_action)       
        else: 
            print('random_value = {} is greater than epsilon'.format(random_value))       
            state = np.float32(state) # Transforming passed state into numpy array
            prediction_by_model = self.model.predict(state) 
            chosen_action = np.argmax(prediction_by_model[0]) # = EXPLOITATION strategy
            print('NN chooses the following EXPLOITATION action:', chosen_action)       
        return chosen_action

if __name__ == "__main__":
    agent_test = Agent(NUM_EPISODES, MAX_STEPS_PER_EPISODE, EPSILON, EPSILON_DECAY_RATE, \
        EPSILON_MIN, EPSILON_MAX, DISCOUNT_FACTOR, REPLAY_MEMORY_SIZE, BATCH_SIZE, \
            TRAIN_START)
    # Test of select_action function:
    state = 10 
    state = np.array(state)
    print(state.shape)
    print(agent_test.select_action(state))

这是我在 运行 这段代码时得到的回溯错误:

**ValueError**: Error when checking input: expected dense_209_input to have 2 dimensions, but got array with shape ()

我不确定为什么会出现有关二维的错误,因为我已将 DQN class 中的神经网络配置为仅接收一维。

我已经通读了关于 Whosebug 的类似问题 (, , )。但是,我还无法根据我的用例调整这些建议。

您有什么建议或提示吗?感谢您的帮助!

这里有几个问题。首先,你所说的 state_size 实际上是一个状态 space,即你的代理可能处于的所有可能状态的集合。状态大小实际上是 1,因为你只想传递一个参数作为一个州。

当您在此处定义输入层时:

self.model.add(Dense(128, input_dim=self.state_size, activation='relu'))

你说你的输入维度将等于 11,但是当你调用预测时,你传递给它 1 个数字 (10)。

所以你要么需要修改 input_dim 以只接收一个数字,要么你可以像 state = np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) 一样定义你的状态向量,每个数字对应一个可能的状态(从 9.5 到 10.5)。因此,当状态为 9.5 时,您的状态向量为 [1, 0, 0, ...0] 依此类推。

第二个问题是,当你定义你的状态时,你应该放在方括号中

state = np.array([10])

否则数组的形状是 (),我相信你已经发现了。

希望对您有所帮助!如果您需要任何说明,请告诉我。