Keras中用于验证的不同损失函数

时间:2018-08-31 02:08:18

标签: keras loss

我的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 :(得分:7)

您可以尝试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

如您所见,训练阶段的损失确实是1乘以0。

请注意,如果您的模型中没有辍学或批处理规范,则需要手动“打开” _uses_learning_phase布尔开关,否则K.in_train_phase()在默认情况下将无效。

答案 1 :(得分:3)

验证损失功能只是一个度量,实际上不需要培训。之所以在这里是因为比较网络实际要优化的指标是有意义的。 因此,您可以在编译过程中将任何其他损失函数添加为指标,然后在训练过程中会看到它。