Keras 模型:RL 代理的输入形状尺寸误差
Posted
技术标签:
【中文标题】Keras 模型:RL 代理的输入形状尺寸误差【英文标题】:Keras model: Input shape dimension error for RL agent 【发布时间】:2020-06-30 09:16:19 【问题描述】:我的目标是开发一个 DQN 代理,它将根据特定的策略/政策选择其行动。我之前使用过 OpenAi 健身房环境,但现在我想创建自己的 RL 环境。
在这个阶段,agent 要么选择一个随机动作,要么根据深度神经网络(在类 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
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 ()
我不确定为什么会出现关于 2 维的错误,因为我已将 DQN 类中的 NN 配置为仅接收 1 维。
我已经阅读过有关 *** 的类似问题(Keras Sequential model input shape、Keras model input shape wrong、Keras input explanation: input_shape, units, batch_size, dim, etc)。但是,我还不能根据我的用例调整这些建议。
您有什么建议或提示吗?感谢您的帮助!
【问题讨论】:
【参考方案1】:这里有几个问题。首先,您所说的state_size
实际上是一个状态空间,即您的代理可能处于的所有可能状态的集合。状态大小实际上是 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])
否则数组的形状是 (),我相信你已经发现了。
希望对您有所帮助!如果您需要任何说明,请告诉我。
【讨论】:
非常感谢,罗曼!你是对的,我混淆了 state_sizes 和 state_spaces。我添加了调整并测试了代理的 select_action()。现在它工作正常。感谢您的见解,感谢您的帮助。干杯,马克斯 乐于助人,麦克斯!以上是关于Keras 模型:RL 代理的输入形状尺寸误差的主要内容,如果未能解决你的问题,请参考以下文章
python中kera LSTM网络的模型拟合和尺寸大小误差
Keras ValueError:尺寸必须相等,但对于 'node Equal 输入形状为 2 和 32:[?,2], [?,32,32]