我正在学习 NN 和 Keras。我的测试数据是这样的:
Result, HomeWinPossibility, DrawPossibility, AwayWinPossibility
[['AwayWin' 0.41 0.28 0.31]
['HomeWin' 0.55 0.25 0.2]
['AwayWin' 0.17 0.21 0.62]
.....
这是我的模型:
model = Sequential()
model.add(Dense(16, input_shape=(3,)))
model.add(Activation('sigmoid'))
model.add(Dense(8, activation='relu'))
model.add(Dense(3))
model.add(Activation('softmax'))
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=["accuracy"])
model.fit(train_X, train_y_ohe, epochs=100, batch_size=1, verbose=1);
fit 的输出是:
Epoch 1/100
190/190 [==============================] - 1s 3ms/step - loss: 0.9151 - acc: 0.5737
Epoch 2/100
190/190 [==============================] - 1s 3ms/step - loss: 0.9181 - acc: 0.5474
Epoch 3/100
190/190 [==============================] - 1s 3ms/step - loss: 0.9111 - acc: 0.5526
Epoch 100/100
190/190 [==============================] - 1s 3ms/step - loss: 0.9130 - acc: 0.5579
那么为什么我读过的一些 NN 教程中的损失没有下降呢?是不是因为我提供的数据只是噪音,所以 NN 找不到任何线索或我的模型不正确的东西?
如
acc
总是在 0.55 左右(所以是 50%),这是否意味着 NN 实际上比随机猜测(> 33%)更好?如果这是真的,为什么它在第一个 epoch 时达到了 0.57 的准确率?
最佳答案
So why the loss is not going down as some NN tutorials I read?
这可能有很多原因 - 一切都取决于您的数据。以下是您可以调整的内容:
1
在大多数情况下会太小 - 没有开始使用批量大小 1 时显示的结构的冗余性。批量大小非常依赖于您拥有的数据量和类型,但尝试在 20 左右的某个地方 - 30 如果你有足够的数据。 softmax
或 sigmoid
因为你想要在 0
和 1
之间的数字)。 lr
):model.compile(optimizer=keras.optimizers.Adam(lr=0.001), ...)
Is it because the data I provided are just noises
如果您的数据是跨类别的纯噪声,那么很可能,鉴于每个类别中的数据点数量大致相同,准确度约为 33%,因为它基本上只是随机猜测。
As the acc is always around 0.55(so 50%). does it mean the NN actually achieved better than random guessing (33%)?
不必要。准确率是衡量正确分类的类的数量。假设验证数据(通常是计算准确性的数据集部分)仅包含来自一类的数据。然后,如果 NN 只将所有内容都归类到这一类,则验证数据将具有 100% 的准确度!
这意味着如果您没有来自每个类的相同数量的数据点,则不能单独信任准确性!在数据集不平衡的情况下,更好的衡量标准是例如AUC(ROC 曲线下面积)或 F1 分数,这也考虑了误报。
我建议你研究一下这背后的理论。只是盲目地跑来跑去可能会很烦人,因为你很难得到好的结果。即使你得到了很好的结果,它们也可能没有你想象的那么好。一个可以阅读的地方是 Ian Goodfellow's book on deep learning .
关于neural-network - Keras 高损失,不随 epoch 减少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51113328/