猿问

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

我的目标是开发一个DQN代理,它将根据特定的策略/策略选择其操作。我以前使用OpenAi健身房环境,但现在我想创建自己的RL环境。


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


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


现在,我想给我的代理一个标量值:例如,一个样本状态x = 10,让他决定要执行的操作(调用Agent.select_action()),我遇到了与输入形状/输入维度相关的问题。


代码如下:1. DQN 类:


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. 代理类:


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


桃花长相依
浏览 102回答 1
1回答

大话西游666

这里有几个问题。首先,您所说的实际上是一个状态空间,即您的代理可以处于的所有可能状态的集合。状态大小实际上是 1,因为只有一个参数要作为状态传递。state_size在此处定义输入图层时:self.model.add(Dense(128, input_dim=self.state_size, activation='relu'))您说输入维度将等于 11,但当您调用预测时,您将它传递给 1 个数字 (10)。因此,您要么需要修改以仅接收一个数字,要么可以定义状态向量,例如,每个数字对应于一个可能的状态(从9.5到10.5)。因此,当状态为 9.5 时,您的状态向量为 9.5,依此类推。input_dimstate = np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])[1, 0, 0, ...0]第二个问题是,当你定义你的状态时,你应该把方括号state = np.array([10])否则数组的形状是(),我相信你已经发现了。希望它有帮助!如果您需要任何澄清,请告诉我。
随时随地看视频慕课网APP

相关分类

Python
我要回答