Tensorflow Custom Regularization Term, der die Vorhersage mit dem True-Wert vergleicht

Dec 08 2020

Hallo, ich benötige einen benutzerdefinierten Regularisierungsterm, um meine Verlustfunktion (binäre Kreuzentropie) zu erweitern. Kann mir jemand mit der Tensorflow-Syntax helfen, dies zu implementieren? Ich habe alles so weit wie möglich vereinfacht, damit es einfacher sein kann, mir zu helfen.

Das Modell verwendet einen Datensatz 10000 mit 18 x 18 Binärkonfigurationen als Eingabe und einen 16 x 16 eines Konfigurationssatzes als Ausgabe. Das neuronale Netzwerk besteht nur aus 2 Convlutional-Schichten.

Mein Modell sieht so aus:

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) 

Jetzt habe ich eine Funktion geschrieben, die ich als zusätzliche Regularisierungsbedingung als Regularisierungsbegriff verwenden möchte. Diese Funktion übernimmt die wahre und die Vorhersage. Grundsätzlich multipliziert es jeden Punkt von beiden mit seinem "richtigen" Nachbarn. Dann wird der Unterschied genommen. Ich nahm an, dass der wahre und vorhergesagte Term 16x16 (und nicht 10000x16x16) ist. Ist das richtig?

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

Ich würde mich sehr über Hilfe freuen, wenn ich so etwas wie diese Funktion als Regularisierungsbegriff zu meinem Verlust hinzufüge, um dem neuronalen Netzwerk zu helfen, besser auf diese Interaktion mit dem „richtigen Nachbarn“ zu trainieren. Ich habe wirklich Probleme damit, die anpassbaren Tensorflow-Funktionen zu verwenden. Vielen Dank, sehr geschätzt.

Antworten

2 Nikaido Dec 08 2020 at 21:50

Es ist ganz einfach. Sie müssen einen benutzerdefinierten Verlust angeben, in dem Sie Ihren hinzugefügten Regularisierungsbegriff definieren. Etwas wie das:

# 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)

Wie von Keras angegeben:

Jeder Aufruf mit der Signatur loss_fn (y_true, y_pred), der ein Array von Verlusten zurückgibt (eines der Stichproben im Eingabestapel), kann als Verlust an compile () übergeben werden. Beachten Sie, dass die Probengewichtung für einen solchen Verlust automatisch unterstützt wird.

Stellen Sie also sicher, dass Sie eine Reihe von Verlusten zurückgeben ( BEARBEITEN: Wie ich jetzt sehen kann, ist es möglich, auch einen einfachen Skalar zurückzugeben. Es spielt keine Rolle, ob Sie beispielsweise die Reduktionsfunktion verwenden ). Grundsätzlich haben y_true und y_predicted als erste Dimension die Stapelgröße .

hier Details: https://keras.io/api/losses/