Python 自定义损失类别分布

Python 自定义损失类别分布,python,machine-learning,keras,Python,Machine Learning,Keras,我想给分类熵损失加一个因子。它将描述y_pred相对于参考的类分布。一个简化的例子: y_ref = [5, 45, 30, 20] y_pred = [10, 40, 30, 20] factor = 10 目前我只使用这个系数作为衡量标准。我对训练数据进行预测,以验证因子的准确性。该值不正确 我试图返回totalsum_pred,它应该是y_pred中的样本数。但是class_f和val_class_f不是整数(如31.9701)。我没有使用批处理或正则化 有什么问题 def class

我想给分类熵损失加一个因子。它将描述y_pred相对于参考的类分布。一个简化的例子:

y_ref = [5, 45, 30, 20] 
y_pred = [10, 40, 30, 20]
factor = 10
目前我只使用这个系数作为衡量标准。我对训练数据进行预测,以验证因子的准确性。该值不正确

我试图返回totalsum_pred,它应该是y_pred中的样本数。但是class_f和val_class_f不是整数(如31.9701)。我没有使用批处理或正则化

有什么问题

def class_f(y_true, y_pred):

    ref_rate = K.cast([0.05, 0.45, 0.30, 0.20], dtype='float32')

    pred_cast = K.cast(y_pred, dtype='float32')    
    pred_argmax = K.argmax(pred_cast, axis=1)
    pred_onehot = K.one_hot(pred_argmax , 4)

    sum_pred = K.sum(pred_onehot, axis=0)
    totalsum_pred = K.sum(pred_onehot)
    norm_sum_pred = K.cast(sum_pred / totalsum_pred, dtype='float32')

    class_factor = K.sum(K.abs(ref_rate-norm_sum_pred))

    return class_factor 

model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=[class_f])

默认批处理大小不适用于此代码。我将批次大小设置为model.fit函数中的序列样本数