Keras的损失很高,不会随着每个时期的减少而减少

时间:2018-06-30 08:48:27

标签: neural-network keras

我正在学习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的精度?

1 个答案:

答案 0 :(得分:3)

  

那么,为什么损失不像我阅读的一些NN教程那样减少?

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

  • 您的批次批量非常。尽管 some 数据可能实际上对此做出了响应,但我认为1的批量大小在大多数情况下都太小-无需开始使用时所显示结构的冗余性批处理大小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是一个值得阅读的地方。