簡體   English   中英

Keras 中 model.evaluate 和 model.predict 的結果存在差異

[英]Discrepancy in the results of model.evaluate and model.predict in Keras

我正在使用 Keras 中的三個 class 標簽執行多類分類。 在訓練過程中,訓練和驗證損失都在減少,准確率在增加。 訓練后,我在訓練集上測試了 model 作為健全性檢查,model.evaluate 和 model 之間似乎存在巨大差異。 我確實找到了一些解決方案,似乎表明這是 BatchNorm 和 Dropout 層的問題,但這不應該導致如此巨大的差異。 相關代碼如下圖。

model=Sequential()
model.add(Conv2D(32, (3, 3), padding="same",input_shape=input_shape))
model.add(Activation("relu"))
model.add(BatchNormalization(axis=chanDim))
model.add(MaxPooling2D(pool_size=(3, 3)))
model.add(Dropout(0.25))
.
.
model.add(Dense(n_classes))
model.add(Activation("softmax"))

optimizer=Adam()
model.compile(loss='categorical_crossentropy', optimizer=optimizer, metrics=['categorical_accuracy'])

datagen = ImageDataGenerator(horizontal_flip=True, fill_mode='nearest')

train_datagen = datagen.flow(X_train, y_train, batch_size=batch_size)
val_datagen = ImageDataGenerator().flow(X_val, y_val, batch_size=batch_size)

history=model.fit(train_datagen, steps_per_epoch=math.ceil(nb_train_samples/batch_size), verbose=2, epochs=50, validation_data=val_datagen, validation_steps=math.ceil(nb_validation_samples/batch_size), class_weight=d_class_weights)

print('model.evaluate accuracy: ', model.evaluate(X_train, y_train, batch_size=batch_size)[1])
test_pred = model.predict(ImageDataGenerator().flow(X_train, y=None, batch_size=batch_size), steps=math.ceil(nb_train_samples/batch_size))
test_result=np.array(test_pred)
test_result = np.zeros(test_result.shape)
test_result[np.arange(len(test_pred)), test_pred.argmax(1)] = 1
total=0
count=0
for i in range(test_result.shape[0]):
    total+=1
    count+=(test_result[i]==y_train[i]).all()
print('model.predict accuracy: ', count/total)

我得到的output如下:-

66/66 [==============================] - 12s 177ms/step - loss: 0.0010 - categorical_accuracy: 1.0000
model.evaluate accuracy:  1.0
model.predict accuracy:  0.42138063279002874

我一直在嘗試解決這個問題一段時間,但沒有找到任何東西。 我已經在最后一層使用了 categorical_crossentropy、categorical_accuracy 和 softmax 激活,所以我不知道出了什么問題。 任何幫助將不勝感激!

我終於找到了解決方案,原來我只是將X_train傳遞給預測 function,並且shuffle參數默認為True ,因此預測與基本事實不符。 設置shuffle=False解決了這個問題。

test_pred = model.predict(ImageDataGenerator().flow(X_train, y=None, batch_size=batch_size, shuffle=False), steps=math.ceil(nb_train_samples/batch_size))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM