Keras损失很大,每个时代都没有减少

问题描述 投票:3回答:1

我正在学习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%)更好?如果这是真的,为什么它在第一个时代达到了准确度0.57?

neural-network keras
1个回答
6
投票

那么为什么损失不会像我读到的一些NN教程那样下降?

原因可能有很多 - 全部取决于您的数据。以下是您可以调整的内容:

  • 批量很小。虽然有些数据实际上可能会对此作出反应,但我认为在大多数情况下批量大小的1会太小 - 没有开始使用批量大小时显示的结构的冗余性。批量大小非常依赖于你有多少数据,但是如果你有足够的数据,可以在20-30左右尝试一下。
  • 尝试不同的激活函数(但在最后一层总是有softmaxsigmoid,因为你想要01之间的数字)。
  • 增加第一层和/或第二层中的单元数(如果有足够的数据)。
  • 尝试为Adam优化器设置学习率(lr):model.compile(optimizer=keras.optimizers.Adam(lr=0.001), ...)

是因为我提供的数据只是噪音

如果你的数据是跨类的纯噪声,那很可能,因为每个类中的数据点数量大致相同,准确度大约为33%,因为它基本上只是随机猜测。

因为acc总是在0.55左右(所以50%)。这是否意味着NN实际上比随机猜测(33%)更好?

不必要。准确度是衡量正确分类的类别数量的指标。假设验证数据(通常是计算精度的数据集部分)仅包含来自一个类的数据。然后,如果NN仅将所有内容分类到该类,则验证数据将具有100%的准确性!

这意味着如果每个类没有相同数量的数据点,则不能单独信任准确度!在有不平衡数据集的情况下,更好的衡量标准是: AUC(ROC曲线下面积)或F1得分,也考虑了误报。


我建议你研究一下这背后的理论。盲目地跑来跑去可能会非常烦人,因为你很难获得好成绩。即使你取得了不错的成绩,也可能没有你想象的那么好。一个地方是Ian Goodfellow's book on deep learning

© www.soinside.com 2019 - 2024. All rights reserved.