张量流中的自定义类损失函数

时间:2019-05-02 08:23:56

标签: python tensorflow keras metrics loss-function

对于我的问题,我想预测客户评论分数,范围从1到5 。 我认为将其作为回归问题来实施将是一件好事,因为模型预测的1表示真实值,而5表示真实值应该比4预测“差”。 还希望该模型能够以某种方式对于所有评论得分类别都同样好。 因为我的数据集高度不平衡,所以我想创建一个指标/损耗,该指标/损耗可以捕获此指标(我认为就像F1进行分类)。 因此,我创建了以下指标(目前仅与mse相关):

def custom_metric(y_true, y_pred):
    df = pd.DataFrame(np.column_stack([y_pred, y_true]), columns=["Predicted", "Truth"])
    class_mse = 0
    #class_mae = 0
    print("MAE for Classes:")
    for i in df.Truth.unique():
        temp = df[df["Truth"]==i]
        mse = mean_squared_error(temp.Truth, temp.Predicted)
        #mae = mean_absolute_error(temp.Truth, temp.Predicted)
        print("Class {}: {}".format(i, mse))
        class_mse += mse
        #class_mae += mae
    print()
    print("AVG MSE over Classes {}".format(class_mse/len(df.Truth.unique())))
    #print("AVG MAE over Classes {}".format(class_mae/len(df.Truth.unique())))

现在是一个预测示例:

import numpy as np
import pandas as pd
from sklearn.metrics import mean_squared_error, mean_absolute_error

# sample predictions: "model" messed up at class 2 and 3 
y_true = np.array((1,1,1,2,2,2,3,3,3,4,4,4,5,5,5))
y_pred = np.array((1,1,1,2,2,3,5,4,3,4,4,4,5,5,5))

custom_metric(y_true, y_pred)

现在我的问题是:它能够创建一个自定义的张量流损失函数,该函数能够以类似的方式起作用吗?我还研究了尚未实现张量流但可能更相似的实现:

def custom_metric(y_true, y_pred):
    mse_class = 0
    num_classes = len(np.unique(y_true))
    stacked = np.vstack((y_true, y_pred))
    for i in np.unique(stacked[0]):     
        y_true_temp = stacked[0][np.where(stacked[0]==i)]
        y_pred_temp = stacked[1][np.where(stacked[0]==i)]
        mse = np.mean(np.square(y_pred_temp - y_true_temp))
        mse_class += mse
    return mse_class/num_classes

但是,我仍然不确定如何在for循环中解决类似tensorflow的定义。

在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

for循环应该通过张量上的numpy / tensorflow操作来精确处理。

自定义指标示例为:

  from keras import backend as K

  def custom_mean_squared_error(y_true, y_pred):
        return K.mean(K.square(y_pred - y_true), axis=-1)

其中y_true是地面真实标签,y_pred是您的预测。您可以看到没有显式的for循环。

不使用for循环的动机是矢量化操作(同时存在于numpy和tensorflow中)利用了现代CPU体系结构的优势,将多个迭代操作转换为矩阵操作。考虑到numpy中的点积实现比Python中常规的for循环要少大约30倍。