Niestandardowy termin regularyzacji Tensorflow porównujący prognozę z wartością True

Dec 08 2020

Witam Potrzebuję niestandardowego terminu regularyzacji, aby dodać do mojej (binarnej entropii krzyżowej) funkcji straty. Czy ktoś może mi pomóc ze składnią Tensorflow, aby to zaimplementować? Uprościłem wszystko tak bardzo, jak to tylko możliwe, żeby łatwiej było mi pomóc.

Model przyjmuje zestaw danych 10000 konfiguracji binarnych 18 x 18 jako dane wejściowe i ma konfigurację 16x16 ustawioną jako dane wyjściowe. Sieć neuronowa składa się tylko z 2 warstw Convlutional.

Mój model wygląda tak:

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) 

Teraz napisałem funkcję, której chciałbym użyć jako dodatkowego członu regularyzacji, który miałbym mieć jako człon regularyzacyjny. Ta funkcja przyjmuje prawdę i prognozę. Zasadniczo mnoży każdy punkt obu ze swoim „właściwym” sąsiadem. Wtedy bierze się różnicę. Założyłem, że wartość prawdziwa i przewidywana to 16x16 (a nie 10000x16x16). Czy to jest poprawne?

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

Naprawdę byłbym wdzięczny za pomoc w dodaniu czegoś podobnego do tej funkcji jako terminu regularyzacji mojej straty, aby pomóc sieci neuronowej w lepszym trenowaniu do interakcji z „prawym sąsiadem”. Naprawdę mam problemy z korzystaniem z konfigurowalnych funkcji Tensorflow. Dziękuję, bardzo doceniam.

Odpowiedzi

2 Nikaido Dec 08 2020 at 21:50

To całkiem proste. Musisz określić niestandardową stratę, w której definiujesz okres dodawania regularyzacji. Coś takiego:

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

Jak stwierdził keras:

Wszystkie wywoływane z sygnaturą loss_fn (y_true, y_pred), które zwracają tablicę strat (jedną z próbek w partii wejściowej) mogą być przekazane do metody compile () jako strata. Należy pamiętać, że ważenie próbki jest automatycznie obsługiwane w przypadku każdej takiej utraty.

Więc pamiętaj, aby zwrócić tablicę strat ( EDYCJA: jak widzę teraz możliwe jest zwrócenie również prostego skalara. Nie ma znaczenia, czy użyjesz na przykład funkcji redukuj ). Zasadniczo y_true i y_predicted mają jako pierwszy wymiar rozmiar partii .

tutaj szczegóły: https://keras.io/api/losses/