我正在尝试使用神经网络来预测一款汽车模拟游戏的动作,该游戏在另一个文件中运行。我需要获取预测的动作值并传递给游戏,但我在这个过程中遇到了困难。在调用model.predict后,我尝试像访问数组一样获取值,但这返回了一个超出范围的错误。
我对Python的使用还比较新手,更不用说使用Keras了,但我的想法是神经网络将基于其他人玩游戏时收集的数据(保存在CSV文件中)进行训练。然后,当神经网络开始玩游戏时,我可以将每一帧的游戏值传入以生成预测的动作。我认为我已经完成了这一步,但无法获取预测的动作。以下是我的神经网络代码:
def build_nn(self): model = Sequential() model.add(Dense(12, input_dim=8, activation='relu')) model.add(Dense(8, activation='relu')) model.add(Dense(1, activation='linear')) model.compile(loss='mean_squared_error', optimizer=Adam(lr=self.learning_rate)) return model
这是我预测动作的代码(stateVector未被直接接受,所以我必须从中获取值)
def action(self, stateVector): a_action = stateVector['lastAction'] currentLane = stateVector['currentLane'] offRoad = stateVector['offRoad'] collision = stateVector['collision'] lane1 = stateVector['lane1Distance'] lane2 = stateVector['lane2Distance'] lane3 = stateVector['lane3Distance'] a = [currentLane, offRoad, collision, lane1, lane2, lane3, reward, a_action] act_value = self.model.predict(a) act = act_values[a_action] return act
回答:
你向网络输入了一个包含8个元素的列表,而它期望的是一个8维样本的可迭代对象。实际上:
>>> a = [currentLane, offRoad, collision, lane1, lane2, lane3, reward, a_action]>>> a = np.array(a) # 转换为numpy数组>>> a = np.expand_dims(a, 0) # 将形状从(8,)更改为(1,8)>>> model.predict(a) # 成功!