【发布时间】:2019-09-08 22:42:08
【问题描述】:
我需要帮助为 Keras 编写自定义损失/度量函数。我的类别是二进制编码的(不是一次性的)。我想在真实类和预测类之间进行逐位比较。
例如, 真实标签:0x1111111111 预测标签:0x1011101111
预测标签的 10 位中有 8 位是正确的,因此该匹配的准确度应该是 0.8 而不是 0.0。我不知道如何支持使用 Keras 命令执行此操作。
编辑 1: 目前我正在使用这样的东西,但它还没有工作:
def custom_binary_error(y_true, y_pred, n=11):
diff_dec = K.tf.bitwise.bitwise_xor(K.tf.cast(y_true, K.tf.int32), K.tf.cast(y_pred, K.tf.int32))
diff_bin = K.tf.mod(K.tf.bitwise.right_shift(K.tf.expand_dims(diff_dec,1), K.tf.range(n)), 2)
diff_sum = K.tf.math.reduce_sum(diff_bin, 1)
diff_percent = K.tf.math.divide(diff_sum, 11)
return K.tf.math.reduce_mean(diff_percent, 0)
我收到此错误:
ValueError: Dimensions must be equal, but are 2048 and 11 for 'loss/activation_1_loss/RightShift' (op: 'RightShift') with input shapes: [?,1,2048], [11].
【问题讨论】:
-
您的预测结果如何?是整数值还是别的什么?
-
对我来说真是个奇怪的编码!请问您为什么选择以输出实数的方式设计模型(稍后需要将其转换为整数)?相反,您可以将其建模为一个多标签分类任务,最后一层是 sigmoid 层。
-
所以我的最后一层将是一个密集层,其节点数与我的类编码中的位数一样多,并使用 sigmoid 激活将输出映射到 0-1。那么我的损失/准确性度量是什么?
-
@RyanHope 没错。您需要使用
binary_crossentropy作为损失,使用accuracy作为指标(它会自动切换到binary_accuracy)。
标签: keras deep-learning categorical-data loss-function multiclass-classification