在使用训练数据集评估模型时,我得到了一些奇怪的结果。我想开发一个具有这样的结构的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在批处理规范化和dropout层方面有一些问题,但是我没有使用它们。
发布于 2018-12-25 15:50:44
据我所知,Adam是SGD的变体,它没有考虑整个数据点进行模型拟合,而是挑选一批(行子集)进行训练。
因此,这可能会导致不一致,当您第一次训练模型并保存权重时,下次使用相同的权重运行算法时,应用权重的子集可能会发生变化
https://stackoverflow.com/questions/53920322
复制相似问题