我有不平衡的training数据集,这就是为什么我建立自定义 weighted categorical cross entropy loss功能.但问题是我的validation设置是平衡的,我想使用常规的分类交叉熵损失.那么我可以为Keras中的验证集传递不同的损失函数吗?我指的是用于培训的受损者和用于验证集的常规用品?
def weighted_loss(y_pred, y_ture):
'
'
'
return loss
model.compile(loss= weighted_loss, metric='accuracy')
Run Code Online (Sandbox Code Playgroud)
您可以尝试后端功能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)
Run Code Online (Sandbox Code Playgroud)
第一个参数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
Run Code Online (Sandbox Code Playgroud)
如您所见,训练阶段的损失确实是乘以0的.
请注意,如果模型中没有丢失或批处理规范,则需要手动"打开" _uses_learning_phase布尔开关,否则K.in_train_phase()默认情况下无效.
| 归档时间: |
|
| 查看次数: |
1116 次 |
| 最近记录: |