Kerugian keras dan nilai metrik tidak cocok dengan fungsi yang sama di masing-masing
Saya menggunakan keras dengan fungsi kerugian kustom seperti di bawah ini:
def custom_fn(y_true, y_pred):
# changing y_true, y_pred values systematically
return mean_absolute_percentage_error(y_true, y_pred)
Kemudian saya menelepon model.compile(loss=custom_fn)
danmodel.fit(X, y,..validation_data=(X_val, y_val)..)
Keras kemudian disimpan loss
dan val_loss
dalam riwayat model. Sebagai pemeriksaan kesehatan, saat model menyelesaikan pelatihan, saya menggunakan model.predict(X_val)
agar saya dapat menghitung kerugian validasi secara manual dengan custom_fn
menggunakan model terlatih saya.
Saya menyimpan model dengan epoch terbaik menggunakan callback ini:
callbacks.append(ModelCheckpoint(path, save_best_only=True, monitor='val_loss', mode='min'))
jadi setelah menghitung ini, kerugian validasi harus sesuai dengan val_loss
nilai keras ' dari epoch terbaik. Tapi ini tidak terjadi.
Sebagai upaya lain untuk memecahkan masalah ini, saya juga melakukan ini:
model.compile(loss=custom_fn, metrics=[custom_fn])
Dan saya terkejut, val_loss
dan val_custom_fn
tidak cocok (tidak loss
atau loss_custom_fn
dalam hal ini).
Ini benar-benar aneh, saya custom_fn
pada dasarnya adalah keras 'yang dibangun mape
dengan y_true
dan y_pred
sedikit dimanipulasi. apa yang terjadi disini?
PS : lapisan yang saya gunakan adalah LSTM
lapisan dan lapisan terakhir Dense
. Tapi menurut saya informasi ini tidak relevan dengan masalah. Saya juga menggunakan regularisasi sebagai hyperparameter tetapi bukan putus sekolah.
Memperbarui
Bahkan menghapus custom_fn
dan menggunakan keras 'bawaan mape
sebagai fungsi dan metrik kerugian seperti ini:
model.compile(loss='mape', metrics=['mape'])
dan untuk kesederhanaan, menghapus ModelCheckpoint
panggilan balik memiliki efek yang sama; val_loss
dan val_mape
untuk setiap zaman tidak setara . Ini sangat aneh bagiku. Saya melewatkan sesuatu atau ada bug di kode Keras .. yang pertama mungkin lebih realistis.
Jawaban
Entri blog ini menyarankan agar keras menambahkan regularisasi apa pun yang digunakan dalam pelatihan saat menghitung kehilangan validasi. Dan jelas, saat menghitung metrik pilihan tidak ada regularisasi yang diterapkan. Inilah sebabnya mengapa ini terjadi dengan fungsi pilihan kerugian apa pun seperti yang dinyatakan dalam pertanyaan.
Ini adalah sesuatu yang saya tidak dapat menemukan dokumentasi apa pun dari Keras. Namun, tampaknya bertahan sejak ketika saya menghapus semua hyperparameter regularisasi, val_loss
dan val_custom_fn
cocok persis di setiap epoch.
Solusi yang mudah adalah dengan menggunakan the custom_fn
sebagai metrik dan menyimpan model terbaik berdasarkan metrik ( val_custom_fn
) daripada pada val_loss
. Atau Ulangi setiap epoch secara manual dan hitung yang benar val_loss
secara manual setelah melatih setiap epoch. Yang terakhir tampaknya lebih masuk akal karena tidak ada alasan untuk menyertakan custom_fn
baik sebagai metrik maupun sebagai fungsi kerugian.
Jika ada yang bisa menemukan bukti ini di dokumentasi Keras yang akan sangat membantu.