Istilah Regularisasi Kustom Tensorflow membandingkan Prediksi dengan nilai Sebenarnya

Halo Saya memerlukan istilah regularisasi khusus untuk ditambahkan ke fungsi Kerugian (biner lintas entropi) saya. Adakah yang bisa membantu saya dengan sintaks Tensorflow untuk mengimplementasikan ini? Saya menyederhanakan semuanya semaksimal mungkin sehingga lebih mudah untuk membantu saya.

Model ini mengambil kumpulan data 10.000 konfigurasi biner 18 x 18 sebagai masukan dan memiliki kumpulan konfigurasi 16x16 sebagai keluaran. Jaringan saraf hanya terdiri dari 2 lapisan Konvlusional.

Model saya terlihat seperti ini:

import tensorflow as tf
from tensorflow.keras import datasets, layers, models
EPOCHS = 10
model = models.Sequential()
model.add(layers.Conv2D(1,2,activation='relu',input_shape=[18,18,1]))
model.add(layers.Conv2D(1,2,activation='sigmoid',input_shape=[17,17,1]))
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=1e-3),loss=tf.keras.losses.BinaryCrossentropy())
model.fit(initial.reshape(10000,18,18,1),target.reshape(10000,16,16,1),batch_size = 1000, epochs=EPOCHS, verbose=1)
output = model(initial).numpy().reshape(10000,16,16) 

Sekarang saya menulis sebuah fungsi yang ingin saya gunakan sebagai istilah regularisasi tambahan sebagai istilah regularisasi. Fungsi ini mengambil kebenaran dan prediksi. Pada dasarnya ia mengalikan setiap titik dari keduanya dengan tetangganya yang 'kanan'. Kemudian selisihnya diambil. Saya berasumsi bahwa suku benar dan prediksi adalah 16x16 (dan bukan 10000x16x16). Apakah ini benar?

def regularization_term(prediction, true):
    order = list(range(1,4))
    order.append(0)
    
    deviation = (true*true[:,order]) - (prediction*prediction[:,order])
    deviation = abs(deviation)**2
    return 0.2 * deviation

Saya akan sangat menghargai bantuan dengan menambahkan sesuatu seperti fungsi ini sebagai istilah regularisasi pada kerugian saya karena membantu jaringan saraf berlatih lebih baik dalam interaksi 'tetangga kanan' ini. Saya benar-benar kesulitan dalam menggunakan fungsi Tensorflow yang dapat disesuaikan. Terima kasih, sangat dihargai.


person hegal    schedule 08.12.2020    source sumber


Jawaban (1)


Ini cukup sederhana. Anda perlu menentukan kerugian khusus di mana Anda menentukan istilah penambahan regularisasi. Sesuatu seperti ini:

# to minimize!
def regularization_term(true, prediction):
    order = list(range(1,4))
    order.append(0)
    
    deviation = (true*true[:,order]) - (prediction*prediction[:,order])
    deviation = abs(deviation)**2
    return 0.2 * deviation

def my_custom_loss(y_true, y_pred):
    return tf.keras.losses.BinaryCrossentropy()(y_true, y_pred) + regularization_term(y_true, y_pred)


model.compile(optimizer='Adam', loss=my_custom_loss)

Seperti yang dinyatakan oleh keras:

Setiap callable dengan tanda tangan loss_fn(y_true, y_pred) yang mengembalikan array kerugian (salah satu sampel dalam kumpulan masukan) dapat diteruskan ke kompilasi() sebagai kerugian. Perhatikan bahwa pembobotan sampel secara otomatis didukung untuk setiap kerugian tersebut.

Jadi pastikan untuk mengembalikan serangkaian kerugian (EDIT: seperti yang saya lihat sekarang dimungkinkan untuk mengembalikan skalar sederhana juga. Tidak masalah jika Anda menggunakan misalnya fungsi pengurangan). Pada dasarnya y_true dan y_predicted memiliki dimensi pertama pada ukuran batch.

berikut detailnya: https://keras.io/api/losses/

person Nikaido    schedule 08.12.2020