Python 如何实现一个神经网络来玩无休止的跑步游戏?

Python 如何实现一个神经网络来玩无休止的跑步游戏?,python,tensorflow,machine-learning,neural-network,Python,Tensorflow,Machine Learning,Neural Network,在学习了神经网络的基础知识之后,我想创建一个小但独特的项目(比手写数字等更难的项目)。 我选择实现一个无休止的跑步游戏,记录我的动作,并用收集到的数据训练一个神经网络 游戏看起来像这样: 玩家可以左右移动(箭头),目标是避开小行星。 当玩家按下左箭头时,所有小行星的坐标、玩家位置和左移都会被记录下来。 当玩家按下向右箭头时,同样的事情发生,但“移动”被设置为向右。 我有一个问题,想知道如何记录没有运动,所以我编码它记录没有运动(直)当我按下向上箭头。所以当我不动的时候,我按向上箭头(以中等速度

在学习了神经网络的基础知识之后,我想创建一个小但独特的项目(比手写数字等更难的项目)。 我选择实现一个无休止的跑步游戏,记录我的动作,并用收集到的数据训练一个神经网络

游戏看起来像这样:

玩家可以左右移动(箭头),目标是避开小行星。 当玩家按下左箭头时,所有小行星的坐标、玩家位置和左移都会被记录下来。 当玩家按下向右箭头时,同样的事情发生,但“移动”被设置为向右。 我有一个问题,想知道如何记录没有运动,所以我编码它记录没有运动(直)当我按下向上箭头。所以当我不动的时候,我按向上箭头(以中等速度)

最多可以有20颗小行星,但我收集了一个较小的数据集的数据,看看它是如何工作的

收集的数据如下所示:

正如您在第一行中看到的,共有42列。 板上所有小行星的x坐标为20列。 板上所有小行星的y坐标为20列。 1列代表玩家的x坐标 移动1列(0-左;1-右;2-直,不移动)

我收集了4042个样本: 左1140 1122对 1780直

正如我之前所说,我准备处理20颗小行星,但我只收集了其中少数小行星的数据,所以其余列都用零填充

我使用tensorflow来训练神经网络

data = pd.read_csv('collected_data.csv')
y = data['move']
x = data.drop('move', axis=1)
x_train = x.to_numpy()
y_train = y.to_numpy()

x_train = tf.keras.utils.normalize(x_train, axis=1)

model = tf.keras.Sequential([
    tf.keras.layers.Dense(41,activation='hard_sigmoid',input_shape=x_train[0].shape),
    tf.keras.layers.Dense(41, activation='hard_sigmoid'),
    tf.keras.layers.Dense(41, activation='hard_sigmoid'),
    tf.keras.layers.Dense(3,activation='hard_sigmoid')
])
model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), metrics=['accuracy'])

model.fit(x_train, y_train, epochs=10)

model.save('model.h5')
结果:

我的型号一点也不合适。当我运行游戏时,宇宙飞船根本不动,总是选择直行。我尝试了不同的神经网络结构,更多的层,更少的层等等,但它几乎没有改变结果。我没有足够的数据吗?数据太复杂了?我选错型号了吗?
如有任何建议,我将不胜感激。谢谢

嗨,Bartosz,我建议你针对这样的问题来研究强化学习。强化学习擅长学习有一系列目标的游戏,这些目标会导致游戏成功(幸存)或失败(崩溃)。请参阅\Hi,谢谢您的评论。我知道强化学习通常用于这些事情,我想用监督学习做同样的事情。可能吗?理论上是的,但你现在的做法可能不可能。我认为您需要生成一些可以从中采样的概率输出(如强化学习),否则您的模型将始终执行相同的操作(这可能不是一件坏事)。另外,您可能希望跟踪历史,以便查看之前的N个移动是什么或其他。另一件事是,您应该删除最后一层的激活功能,因为您已经指定丢失功能为“from_logits”。好的,谢谢。我将尝试通过强化学习来做到这一点。