Различные функции потерь для проверки, установленные в Keras

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

def weighted_loss(y_pred, y_ture):
 '
 '
 '


return loss

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

person W. Sam    schedule 31.08.2018    source источник


Ответы (2)


Вы можете попробовать внутреннюю функцию 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() по умолчанию не будет действовать.

person Yu-Yang    schedule 01.09.2018
comment
Вот что я ищу. Спасибо Ю-Ян. Только один вопрос о последнем, что вы сказали о включении «_uses_learning_phase». Я думаю, что значение по умолчанию — «0» для теста и «1» для обучения, моя модель имеет слой batch_normalizaition и dropout. Так что мне нужно включить его вручную? - person W. Sam; 01.09.2018
comment
И вы имеете в виду флаг «обучение», потому что я не нашел флаг «_uses_learning_phase». Я имею в виду, что в tf.keras.backend.in_train_phase есть только ( x, alt, training=None ) - person W. Sam; 01.09.2018
comment
_uses_learning_phase, о котором я упомянул, это совсем другое. Это логическая переменная, которая контролирует, будет ли переменная фазы обучения (то есть та, которую вы упомянули — 0 для теста и 1 для обучения) иметь какое-либо влияние на обучение модели. Если в вашей модели есть отсев, вам не нужно включать его вручную. - person Yu-Yang; 01.09.2018
comment
_uses_learning_phase — это внутренняя переменная, которая будет прикреплена к выходным данным модели, если есть какой-либо компонент (например, отсев, норма партии), который действует по-разному при обучении/валидации. - person Yu-Yang; 01.09.2018
comment
Я понимаю. Спасибо, Ю-Ян. - person W. Sam; 01.09.2018
comment
Конечно. Рад помочь. - person Yu-Yang; 01.09.2018
comment
Извините, еще одна последняя вещь. Если у меня нет уровня пакетной нормализации или исключения и мне нужно его включить, должен ли я сделать это, установив его vi 'set_variable()? Я не нашел никакой документации об этой переменной ни в тензорном потоке, ни в Керасе. - person W. Sam; 01.09.2018
comment
Вы можете выбрать любой выходной тензор вашей модели и установить его _uses_learning_phase = True, как я сделал в примере в этом ответе (model.outputs[0]._uses_learning_phase = True). Это деталь реализации, поэтому я думаю, что маловероятно, что она будет где-либо задокументирована. - person Yu-Yang; 01.09.2018
comment
Извините, я не увидел ту строку, где вы включаете его. Виноват. Теперь я понимаю. Спасибо - person W. Sam; 01.09.2018
comment
вы казались настолько квалифицированными с функциями потерь, вы можете увидеть мой вопрос здесь и посмотреть, сможете ли вы мне помочь. Я буду признателен за это. stackoverflow.com/questions/52269603 / - person W. Sam; 11.09.2018
comment
@ Ю-Ян Спасибо за этот ответ. Сэр, можем ли мы каким-либо образом использовать функцию sampled_softmax_loss в k.in_train_phase(), потому что sampled_softmax ожидает y_true, входные данные там, где sparse_softmax ожидает y_true, y_pred.. Можно ли как-то это реализовать? - person user_12; 15.01.2020

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

person dennis-w    schedule 31.08.2018
comment
Я знаю, что значение, сообщаемое потерей проверки в конце каждой эпохи, предназначено только для целей оптимизации и для того, чтобы увидеть, насколько хороша ваша модель. Но когда набор проверки сбалансирован, это означает, что значение потери проверки, сообщаемое в каждую эпоху, является неправильным числом, чтобы посмотреть на него и настроить режим, поскольку он основан на обучении несбалансированного набора. Я прав? И я не понимаю, когда вы говорите, что я могу добавить любую другую функцию потерь в качестве метрики, можете ли вы объяснить больше. Мне нужно иметь функцию потерь, которая имеет разный вес при обучении от проверочного набора. - person W. Sam; 01.09.2018
comment
Звучит правильно для меня. Что касается метрики: keras model.compile имеет параметр метрики, в котором вы можете передавать метрические функции, такие как точность. Эти показатели будут оцениваться в конце эпохи как на обучающем, так и на оценочном наборе. Таким образом, вы можете добавить свою собственную функцию потери веса, используя разные веса. Если это невозможно, покажите какой-нибудь код того, как вы передаете свою пользовательскую функцию потерь в качестве функции потерь модели. - person dennis-w; 01.09.2018
comment
Я изменяю сообщение, чтобы включить простой код. Думаю, я понимаю, что вы имеете в виду. вы имели в виду передачу нормальной категориальной перекрестной энтропийной потери в качестве метрики, чтобы сообщить значение точной потери проверки. Но тогда как насчет метрики точности, которую я хочу использовать для оценки модели, могу ли я передать две метрики для оценки? - person W. Sam; 01.09.2018
comment
Да, вы можете передать массив метрик с любым количеством показателей. - person dennis-w; 01.09.2018