为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

桃花长相依 2022-09-06 16:40:18
我的目标是开发一个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 = 100MAX_STEPS_PER_EPISODE = 100EPSILON = 0.5 EPSILON_DECAY_RATE = 0.001EPSILON_MIN = 0.01EPSILON_MAX = 1DISCOUNT_FACTOR = 0.99REPLAY_MEMORY_SIZE = 50000BATCH_SIZE = 50TRAIN_START = 100ACTION_SPACE = [0, 1]STATE_SIZE = 11 LEARNING_RATE = 0.01
查看完整描述

1 回答

?
大话西游666

TA贡献1817条经验 获得超14个赞

这里有几个问题。首先,您所说的实际上是一个状态空间,即您的代理可以处于的所有可能状态的集合。状态大小实际上是 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])

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

希望它有帮助!如果您需要任何澄清,请告诉我。


查看完整回答
反对 回复 2022-09-06
  • 1 回答
  • 0 关注
  • 100 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信