有关自定义多类指标(Keras)的问题

c86crjj0  于 2022-12-04  发布在  其他
关注(0)|答案(1)|浏览(252)

有人能解释一下如何为Keras编写一个自定义多类度量吗?我试着编写自定义度量,但遇到了一些问题。主要问题是我不熟悉Tensor在训练过程中是如何工作的(我认为它被称为图形模式?)。我能够使用NumPy或Python列表创建混淆矩阵和导出F1得分。
我打印出了y-true和y_pred,并试图理解它们,但输出结果并不是我所期望的:
下面是我使用的函数:

def f1_scores(y_true,y_pred):

    y_true = K.print_tensor(y_true, message='y_true = ')
    y_pred = K.print_tensor(y_pred, message='y_pred = ')
    print(f"y_true_shape:{K.int_shape(y_true)}")
    print(f"y_pred_shape:{K.int_shape(y_pred)}")

    y_true_f = K.flatten(y_true)
    y_pred_f = K.flatten(y_pred)

    gt = K.argmax(y_true_f)
    pred = K.argmax(y_pred_f)

    print(f"pred_print:{pred}")
    print(f"gt_print:{gt}")

    pred = K.print_tensor(pred, message='pred= ')
    gt = K.print_tensor(gt, message='gt =')
    print(f"pred_shape:{K.int_shape(pred)}")
    print(f"gt_shape:{K.int_shape(gt)}")

    pred_f = K.flatten(pred)
    gt_f = K.flatten(gt)

    pred_f = K.print_tensor(pred_f, message='pred_f= ')
    gt_f = K.print_tensor(gt_f, message='gt_f =')
    print(f"pred_f_shape:{K.int_shape(pred_f)}")
    print(f"gt_f_shape:{K.int_shape(gt_f)}")

    conf_mat = tf.math.confusion_matrix(y_true_f,y_pred_f, num_classes = 14)

    """
    add codes to find F1 score for each class
    """

    # return an arbitrary number, as F1 scores not found yet.
    return 1

时段1刚开始时的输出:

y_true_shape:(None, 256, 256, 14)
y_pred_shape:(None, 256, 256, 14)
pred_print:Tensor("ArgMax_1:0", shape=(), dtype=int64)
gt_print:Tensor("ArgMax:0", shape=(), dtype=int64)
pred_shape:()
gt_shape:()
pred_f_shape:(1,)
gt_f_shape:(1,)

然后,其余步骤和时期类似如下:

y_true =  [[[[1 0 0 ... 0 0 0]
   [1 0 0 ... 0 0 0]
   [1 0 0 ... 0 0 0]
   ...

y_pred =  [[[[0.0889623 0.0624801107 0.0729747042 ... 0.0816219151 0.0735477135 0.0698677748]
   [0.0857798532 0.0721047595 0.0754121244 ... 0.0723947287 0.0728530064 0.0676521733]
   [0.0825942457 0.0670698211 0.0879610255 ... 0.0721599609 0.0845924541 0.0638583601]
   ...

pred=  1283828
gt = 0
pred_f=  [1283828]
gt_f = [0]

为什么pred是一个数字而不是一个数字列表,每个数字代表类的索引?同样,为什么pred_f是一个只有一个数字的列表而不是一个索引列表?
对于gt(和gt_f),为什么值是0?我希望它们是索引列表。

7eumitmz

7eumitmz1#

我看起来像argmax()简单地使用了平面化的y
你需要指定你想要argmax()减少哪个轴。可能是最后一个,在你的例子中是3。然后你会得到pred,形状为(None, 256, 256),包含0到13之间的整数。
请尝试以下操作:pred = K.argmax(y_pred, axis=3)
This是tensorflow argmax的文档。(但我不确定您是否使用了它,因为我看不到K导入为什么)

相关问题