有人能解释一下如何为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?我希望它们是索引列表。
1条答案
按热度按时间7eumitmz1#
我看起来像
argmax()
简单地使用了平面化的y
。你需要指定你想要
argmax()
减少哪个轴。可能是最后一个,在你的例子中是3。然后你会得到pred
,形状为(None, 256, 256)
,包含0到13之间的整数。请尝试以下操作:
pred = K.argmax(y_pred, axis=3)
This是tensorflow argmax的文档。(但我不确定您是否使用了它,因为我看不到K导入为什么)