我正在尝试使用Keras解决FizzBuzz,它适用于1到10.000之间的数字(90-100%的胜率和接近0的损失)。但是,如果我尝试更高的数字,那就是1到100.000之间的数字,它似乎表现不佳(约50%的赢率,损失约0.3)。事实上,它的表现非常糟糕,我不知道我能做些什么来解决这个任务。到目前为止,我使用的是一个非常简单的神经网络架构,有3个隐藏层:
model = Sequential()
model.add(Dense(2000, input_dim=state_size, activation="relu"))
model.add(Dense(1000, activation="relu"))
model.add(Dense(500, activation="relu"))
model.add(Dense(num_actions, activation="softmax"))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=["accuracy"])
我发现我拥有的神经元越多,表现越好,至少对于低于10.000的数字。
我正在以逐步的方式训练我的神经网络,这意味着我不是事先计算输入和目标,而是逐步训练网络。再次,这很好用,它不应该有所作为吗?这是主循环:
for epoch in range(np_epochs):
action = random_number()
x_raw = to_binary(action)
x = np.expand_dims(x_raw, 0)
prediction = model.predict(x)
y, victory, _, _ = check_prediction(action, prediction)
memory.append((x_raw, y))
curr_batch_size = min(batch_size, len(memory))
batch = random.sample(memory, curr_batch_size)
inputs = []
targets = []
for i, t in batch:
inputs.append(i)
targets.append(t)
if victory:
wins += 1
loss, accuracy = model.train_on_batch(np.array(inputs), np.array(targets))
正如您所看到的,我正在训练我的网络而不是十进制数字,但在将它们送入网络之前先将它们转换为二进制数。
这里要提到的另一件事是我正在使用记忆,使其更像是一个受监督的问题。我认为如果对神经网络已经训练过的数字进行训练可能会表现得更好。它似乎没有任何区别。
我能用神经网络解决这个特殊问题吗?我的意思是函数逼近器很难弄清楚FizzBuzz背后的简单数学吗?难道我做错了什么?你有不同的建筑吗?
在MachineLabs上查看我的代码。如果你愿意的话,你可以简单地分叉我的实验室并摆弄它。要查看代码,只需单击顶部的“编辑器”选项卡即可。