Keras 中验证集的不同损失函数
Different loss function for validation set in 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')
验证损失函数只是一个指标,实际上不需要用于训练。它在那里是因为比较您的网络实际优化的指标是有意义的。
所以你可以在编译过程中添加任何其他损失函数作为度量,你会在训练过程中看到它。
您可以尝试后端函数 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
可以看到,训练阶段的loss确实是1乘以0
请注意,如果您的模型中没有 dropout 或 batch norm,您需要手动 "turn on" _uses_learning_phase
布尔开关,否则 K.in_train_phase()
默认无效.
我有不平衡的 training
数据集,这就是我构建自定义 weighted categorical cross entropy loss
函数的原因。但问题是我的 validation
集是平衡的,我想使用常规的分类交叉熵损失。那么我可以在 Keras 中为验证集传递不同的损失函数吗?我的意思是训练集的加权集和验证集的常规集?
def weighted_loss(y_pred, y_ture):
'
'
'
return loss
model.compile(loss= weighted_loss, metric='accuracy')
验证损失函数只是一个指标,实际上不需要用于训练。它在那里是因为比较您的网络实际优化的指标是有意义的。 所以你可以在编译过程中添加任何其他损失函数作为度量,你会在训练过程中看到它。
您可以尝试后端函数 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
可以看到,训练阶段的loss确实是1乘以0
请注意,如果您的模型中没有 dropout 或 batch norm,您需要手动 "turn on" _uses_learning_phase
布尔开关,否则 K.in_train_phase()
默认无效.