Другая функция потерь для проверки, установленная в Керасе - PullRequest
0 голосов
/ 31 августа 2018

У меня несбалансированный набор данных training, поэтому я создал пользовательскую функцию weighted categorical cross entropy loss. Но проблема в том, что мой validation набор сбалансирован, и я хочу использовать регулярную категориальную кросс-энтропийную потерю. Так могу ли я передать другую функцию потерь для проверки в Keras? Я имею в виду уравновешенный для обучения и обычный для проверки?

def weighted_loss(y_pred, y_ture):
 '
 '
 '


return loss

model.compile(loss= weighted_loss, metric='accuracy')

Ответы [ 2 ]

0 голосов
/ 01 сентября 2018

Вы можете попробовать бэкэнд-функцию K.in_train_phase(), которая используется слоями Dropout и BatchNormalization для реализации различного поведения при обучении и проверке.

def custom_loss(y_true, y_pred):
    weighted_loss = ... # your implementation of weighted crossentropy loss
    unweighted_loss = K.sparse_categorical_crossentropy(y_true, y_pred)
    return K.in_train_phase(weighted_loss, unweighted_loss)

Первый аргумент K.in_train_phase() - это тензор, используемый на этапе обучения, а второй - тот, который используется на этапе тестирования.

Например, если мы установим weighted_loss в 0 (просто для проверки эффекта функции K.in_train_phase()):

def custom_loss(y_true, y_pred):
    weighted_loss = 0 * K.sparse_categorical_crossentropy(y_true, y_pred)
    unweighted_loss = K.sparse_categorical_crossentropy(y_true, y_pred)
    return K.in_train_phase(weighted_loss, unweighted_loss)

model = Sequential([Dense(100, activation='relu', input_shape=(100,)), Dense(1000, activation='softmax')])
model.compile(optimizer='adam', loss=custom_loss)
model.outputs[0]._uses_learning_phase = True  # required if no dropout or batch norm in the model

X = np.random.rand(1000, 100)
y = np.random.randint(1000, size=1000)
model.fit(X, y, validation_split=0.1)

Epoch 1/10
900/900 [==============================] - 1s 868us/step - loss: 0.0000e+00 - val_loss: 6.9438

Как видите, потеря на этапе обучения действительно умножается на 0.

Обратите внимание, что если в вашей модели отсутствуют выпадающие или пакетные нормы, вам необходимо вручную "включить" логический переключатель _uses_learning_phase, в противном случае K.in_train_phase() не будет действовать по умолчанию.

0 голосов
/ 31 августа 2018

Функция потерь при проверке является просто метрикой и фактически не требуется для обучения. Это потому, что имеет смысл сравнивать показатели, по которым ваша сеть на самом деле оптимизируется. Таким образом, вы можете добавить любую другую функцию потерь в качестве метрики во время компиляции, и вы увидите ее во время тренировки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...