训练数据集上的Keras模型评估精度低于拟合精度

时间:2018-12-25 07:38:23

标签: keras conv-neural-network

在使用训练数据集评估模型时,我得到一些奇怪的结果。 我想开发具有这种结构的cnn:

Input --> conv1d --> MaxPool1D --> Flatten --> Dense --> Dense

这是我的模特

model = Model(inputs=[inputLayerU, inputLayerM], outputs=outputLayer)
model.compile(loss='categorical_crossentropy', optimizer=Adam(lr=0.01), metrics=['accuracy'])    
model.fit([inputU, inputM],outputY , epochs=100, steps_per_epoch=500)

这是训练模型的结果:

Epoch 95/100
500/500 [==============================] - 329s 659ms/step - loss: 0.5058 - acc: 0.8845
Epoch 96/100
500/500 [==============================] - 329s 659ms/step - loss: 0.4137 - acc: 0.9259
Epoch 97/100
500/500 [==============================] - 329s 659ms/step - loss: 0.3221 - acc: 0.9534
Epoch 98/100
500/500 [==============================] - 329s 659ms/step - loss: 0.2938 - acc: 0.9596
Epoch 99/100
500/500 [==============================] - 330s 659ms/step - loss: 0.4707 - acc: 0.9352
Epoch 100/100
500/500 [==============================] - 329s 659ms/step - loss: 0.4324 - acc: 0.9543

我保存模型和权重,然后使用相同的训练数据集加载它们并评估模型:

loaded_model = model_from_json(loaded_model_json)
loaded_model.load_weights("GCN-conv1d-acc.h5")
loaded_model.compile(loss='categorical_crossentropy', optimizer=Adam(lr=0.01), metrics=['accuracy'])
score = loaded_model.evaluate(inputTrain,outTrain,steps=500, verbose=0)

但是我得到这个结果:

[7.320816993713379, 0.3042338788509369]

我希望能得到一些接近拟合结果的结果,但距离太远了。 我检查了这些帖子:

Strange behaviour of the loss function in keras model, with pretrained convolutional base

http://blog.datumbox.com/the-batch-normalization-layer-of-keras-is-broken/

他们说Keras在批处理规范化和辍学层方面存在一些问题,但是我都不使用它们。

1 个答案:

答案 0 :(得分:0)

据我所知,亚当是SGD的变体,它不考虑模型拟合的整个数据点,而是选择一批(行的子集)进行训练,

因此,当您第一次训练模型并节省重量时,这可能会导致不一致, 下次您使用相同的权重运行算法时,应用于权重的子集可能已更改