在keras训练中准确性不会改变,损失几乎不会减少

时间:2019-08-11 13:24:32

标签: python tensorflow keras

我正在尝试训练一个神经网络,以使用keras在5 * 5的网格上解决picross(又名非图)难题。理想情况下,这意味着该网络将针对每个训练案例进行多次正确的激活。

我已经找到了一种随机生成训练数据并初始化神经网络的方法,但是在运行它时,网络的准确性永远不会改变,并且损失只会略有减少:

史诗1/100 100000/100000 [=============================]-13s 133us / sample-损耗:1.6282-acc:0.5001

史诗2/100 100000/100000 [=============================]-13s 131us / sample-损失:1.6233-acc:0.5001

史诗3/100 100000/100000 [=============================]-13s 132us / sample-损耗:1.6175-acc:0.5001

...

时代99/100 100000/100000 [=============================]-14s 136us / sample-损耗:1.4704-acc:0.5001

史诗100/100 100000/100000 [=============================]-14s 136us / sample-损耗:1.4696-acc:0.5001

我正在使用Jupyter笔记本运行它。

有人告诉我,使用“ binary_crossentropy”作为损失函数是解决该问题的理想选择,但是我不知道如何格式化此训练数据标签。它应该是一个一和零的列表,还是一个数字的列表,还是一个数组...?

输出层是25个神经元,每个神经元对应于5 * 5网格上的一个块。它们将正确激活为1或0,具体取决于该块是否为空。

[0.0, 0.2, 0.4, 0.6, 0.8, 1.0]

我希望随着训练的进行,精度会提高,即使只是一点点,但精度始终停留在开始时的任何值上,损失函数只会降低一点。

编辑:提供给神经网络输入的数据是“提示”,按比例缩小为0到1之间的值。这是创建数据的代码:

# Random labels
labels = np.array([0, 1, 4, 2, 1, 3, 4, 0, 5])
# Normalized labels
labels = labels / np.amax(labels)
# Random logits
logits = np.array([1.0, 0.5, 0.4, 0.1, 0.3, 0.6, 0.1, 0.9, 0.2])
loss = tf.nn.sigmoid_cross_entropy_with_logits(labels=labels, logits=logits)
with tf.Session() as sess:
    sess.run(loss)

1 个答案:

答案 0 :(得分:0)

Peteris是正确的,似乎在网络输出层上用“ Sigmoid”代替了“ softmax”激活功能,现在已经帮助精度稳步提高。目前,该网络几乎达到了95%的稳定精度。 (非常感谢,我已经尝试了好几个星期了)