【发布时间】:2020-02-17 22:06:53
【问题描述】:
在学习了神经网络的基础知识后,我想创建一个小而独特的项目(比手写数字等更难的项目)。 我选择实现一个无尽的跑步游戏,记录我的动作并使用收集的数据训练一个神经网络。
游戏是这样的:
玩家可以左右移动(箭头),目标是避开小行星。 当玩家按下左箭头时,所有小行星的坐标、玩家位置和左移都会被记录下来。 当玩家按下右箭头时,会发生同样的事情,但“移动”设置为向右。 我在弄清楚如何记录不运动时遇到了问题,所以当我按下向上箭头时,我将其编码为不记录运动(直线)。所以当我不动的时候,我按向上箭头(以中等速度)
最多可以有 20 颗小行星,但我收集了一个较小数据集的数据,看看它是如何工作的。
收集的数据如下所示:
如您在第一行中所见,共有 42 列。 板上所有小行星的 x 坐标的 20 列。 20 列显示板上所有小行星的 y 坐标。 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,我建议您研究强化学习来解决此类问题。强化学习擅长学习有一组目标导致游戏成功(幸存)或不成功(崩溃)的游戏。见gym.openai.com\
-
您好,感谢您的评论。问题是我知道强化学习通常用于此类事情,我想对监督学习做同样的事情。有可能吗?
-
理论上是的,但你这样做的方式可能不是。我认为您需要生成一些可以从中采样的概率输出(例如强化学习),否则您的模型将始终做同样的事情(这可能不是一件坏事)。其他你可能想要跟踪历史的东西,这样你就可以看到之前的 N 个动作是什么。另一件事是您应该删除最后一层的激活函数,因为您已指定损失函数为“from_logits”。
-
好的,谢谢。我将尝试通过强化学习来做到这一点。
标签: python tensorflow machine-learning neural-network