Вы можете попробовать внутреннюю функцию 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