Kerugian keras dan nilai metrik tidak cocok dengan fungsi yang sama di masing-masing

Aug 18 2020

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 lossdan val_lossdalam 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_fnmenggunakan 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_lossnilai 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_lossdan val_custom_fntidak cocok (tidak lossatau loss_custom_fndalam hal ini).

Ini benar-benar aneh, saya custom_fnpada dasarnya adalah keras 'yang dibangun mapedengan y_truedan y_predsedikit dimanipulasi. apa yang terjadi disini?

PS : lapisan yang saya gunakan adalah LSTMlapisan 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_fndan menggunakan keras 'bawaan mapesebagai fungsi dan metrik kerugian seperti ini:

model.compile(loss='mape', metrics=['mape'])

dan untuk kesederhanaan, menghapus ModelCheckpointpanggilan balik memiliki efek yang sama; val_lossdan val_mapeuntuk setiap zaman tidak setara . Ini sangat aneh bagiku. Saya melewatkan sesuatu atau ada bug di kode Keras .. yang pertama mungkin lebih realistis.

Jawaban

3 user7331538 Aug 18 2020 at 19:34

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_lossdan val_custom_fncocok persis di setiap epoch.

Solusi yang mudah adalah dengan menggunakan the custom_fnsebagai 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_losssecara manual setelah melatih setiap epoch. Yang terakhir tampaknya lebih masuk akal karena tidak ada alasan untuk menyertakan custom_fnbaik sebagai metrik maupun sebagai fungsi kerugian.

Jika ada yang bisa menemukan bukti ini di dokumentasi Keras yang akan sangat membantu.