【发布时间】:2016-12-18 18:51:34
【问题描述】:
我正在尝试教 AI 识别带有获胜线的井字游戏模式。
不幸的是,它没有学会正确识别它们。我认为我将游戏表示/编码为向量的方式是错误的。
我选择一种易于人类(尤其是我!)理解的方式:
training_data = np.array([[0,0,0,
0,0,0,
0,0,0],
[0,0,1,
0,1,0,
0,0,1],
[0,0,1,
0,1,0,
1,0,0],
[0,1,0,
0,1,0,
0,1,0]], "float32")
target_data = np.array([[0],[0],[1],[1]], "float32")
这使用长度为 9 的数组来表示 3 x 3 板。前三项表示第一行,后三项表示第二行,依此类推。换行符应该很明显。然后,目标数据将前两个游戏状态映射为“未获胜”,将后两个游戏状态映射为“获胜”。
然后我想创建一些稍微不同的验证数据,看看它是否可以概括。
validation_data = np.array([[0,0,0,
0,0,0,
0,0,0],
[1,0,0,
0,1,0,
1,0,0],
[1,0,0,
0,1,0,
0,0,1],
[0,0,1,
0,0,1,
0,0,1]], "float32")
显然,最后两个游戏状态应该是“胜利”,而前两个不应该。
我尝试调整神经元的数量和学习率,但无论我尝试什么,我的输出看起来都很不正常,例如
[[ 0.01207292]
[ 0.98913926]
[ 0.00925775]
[ 0.00577191]]
我倾向于认为这是我表示游戏状态的方式可能是错误的,但实际上我不知道 :D
谁能帮帮我?
这是我使用的全部代码
import numpy as np
from keras.models import Sequential
from keras.layers.core import Activation, Dense
from keras.optimizers import SGD
training_data = np.array([[0,0,0,
0,0,0,
0,0,0],
[0,0,1,
0,1,0,
0,0,1],
[0,0,1,
0,1,0,
1,0,0],
[0,1,0,
0,1,0,
0,1,0]], "float32")
target_data = np.array([[0],[0],[1],[1]], "float32")
validation_data = np.array([[0,0,0,
0,0,0,
0,0,0],
[1,0,0,
0,1,0,
1,0,0],
[1,0,0,
0,1,0,
0,0,1],
[0,0,1,
0,0,1,
0,0,1]], "float32")
model = Sequential()
model.add(Dense(2, input_dim=9, activation='sigmoid'))
model.add(Dense(1, activation='sigmoid'))
sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='mean_squared_error', optimizer=sgd)
history = model.fit(training_data, target_data, nb_epoch=10000, batch_size=4, verbose=0)
print(model.predict(validation_data))
更新
我尝试遵循建议并使用了更多的训练数据,但到目前为止没有成功。
我的训练集现在是这样的
training_data = np.array([[0,0,0,
0,0,0,
0,0,0],
[0,0,1,
0,0,0,
1,0,0],
[0,0,1,
0,1,0,
0,0,1],
[1,0,1,
0,1,0,
0,0,0],
[0,0,0,
0,1,0,
1,0,1],
[1,0,0,
0,0,0,
0,0,0],
[0,0,0,
0,0,0,
1,0,0],
[0,0,0,
0,1,0,
0,0,1],
[1,0,1,
0,0,0,
0,0,0],
[0,0,0,
0,0,0,
0,0,1],
[1,1,0,
0,0,0,
0,0,0],
[0,0,0,
1,0,0,
1,0,0],
[0,0,0,
1,1,0,
0,0,0],
[0,0,0,
0,0,1,
0,0,1],
[0,0,0,
0,0,0,
0,1,1],
[1,0,0,
1,0,0,
1,0,0],
[1,1,1,
0,0,0,
0,0,0],
[0,0,0,
0,0,0,
1,1,1],
[0,0,1,
0,1,0,
1,0,0],
[0,1,0,
0,1,0,
0,1,0]], "float32")
target_data = np.array([[0],[0],[0],[0],[0],[0],[0],[0],[0],[0],[0],[0],[0],[0],[0],[1],[1],[1],[1],[1]], "float32")
考虑到我只将 1 的模式计算为获胜,因此我表示数据的方式只有 8 种不同的获胜状态。我让 NN 看到其中的 5 个,这样我还有 3 个要测试,看看泛化是否有效。我现在给它喂了 15 个州,它不应该认为是胜利。
但是,我的验证结果似乎实际上变得更糟了。
[[ 1.06987642e-07]
[ 4.72647212e-02]
[ 1.97011139e-03]
[ 2.93282426e-07]]
我尝试过的事情:
- 从 sigmoid 更改为 softmax
- 添加更多神经元
- 添加更多层
- 以上所有内容的混合
【问题讨论】:
-
转自AI beta (access link)。
-
您是否尝试过在预测之前生成更大的样本库?
-
你在这里解决回归问题?似乎它可以作为一个分类问题,这意味着使用 softmax 输出和二元交叉熵损失。
-
@MatiasValdenegro 我也尝试过,但没有成功。我在想这真的是网格的大小太小了。我将尝试使用更大的网格,这样我就有更多的空间来绘制正样本,而无需将所有样本都用于证明泛化。
-
@Christoph 你是什么意思没有成功?你得到了什么准确度?
标签: machine-learning artificial-intelligence classification keras