예측을 True 값과 비교하는 Tensorflow 사용자 지정 정규화 용어

Dec 08 2020

안녕하세요, 내 (이진 교차 엔트로피) 손실 함수에 추가 할 사용자 지정 정규화 용어가 필요합니다. 누군가 이것을 구현하기 위해 Tensorflow 구문으로 나를 도울 수 있습니까? 나는 나를 도울 수 있도록 모든 것을 가능한 한 많이 단순화했습니다.

이 모델은 18 x 18 바이너리 구성의 데이터 세트 10000을 입력으로 사용하고 16x16 구성 세트를 출력으로 사용합니다. 신경망은 2 개의 Convlutional 계층으로 만 구성됩니다.

내 모델은 다음과 같습니다.

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) 

이제 정규화 용어로 사용할 추가 정규화 용어로 사용하려는 함수를 작성했습니다. 이 함수는 참과 예측을 취합니다. 기본적으로 두 가지의 모든 점을 '올바른'이웃과 곱합니다. 그런 다음 차이가 발생합니다. 참 및 예측 용어는 16x16 (10000x16x16이 아님)이라고 가정했습니다. 이 올바른지?

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

신경망이이 '올바른 이웃'상호 작용을 더 잘 훈련하도록 도와 준 내 손실에 정규화 용어로이 함수와 같은 것을 추가하는 데 도움을 주시면 정말 감사하겠습니다. 사용자 정의 가능한 Tensorflow 기능을 사용하는 데 정말 어려움을 겪고 있습니다. 감사합니다. 감사합니다.

답변

2 Nikaido Dec 08 2020 at 21:50

아주 간단합니다. 추가 정규화 항을 정의하는 사용자 지정 손실을 지정해야합니다. 이 같은:

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

keras가 말한대로 :

손실 배열 (입력 배치의 샘플 중 하나)을 반환하는 loss_fn (y_true, y_pred) 서명이있는 모든 콜 러블은 손실로 compile ()에 전달할 수 있습니다. 이러한 손실에 대해 샘플 가중치가 자동으로 지원됩니다.

따라서 손실 배열을 반환해야합니다 ( 편집 : 지금 볼 수 있듯이 간단한 스칼라도 반환 할 수 있습니다. 예를 들어 reduce 함수를 사용하는 것은 중요하지 않습니다 ). 기본적으로 y_true 및 y_predicted는 배치 크기를 첫 번째 차원으로 사용합니다 .

여기에 세부 사항 : https://keras.io/api/losses/