TensorFlow:损失矩阵函数

时间:2018-06-10 12:49:21

标签: python tensorflow neural-network

我目前有一个RNN,其中我的标签有两个类。输出[1,0]或[0,1]。我喜欢实现一个损失矩阵,以便错误地猜测[1,0] [0,1]的成本比[1,0]的[0,1]猜测成本高100倍。所以我认为我的损失矩阵是[[0,1],[100,0]]。

这是否可以使用张量流?如果是这样,我应该使用什么成本函数?谢谢

1 个答案:

答案 0 :(得分:3)

一种选择是使用查找表来表示不同的组合。这样,您就可以根据离散化的预测来衡量您使用的损失(例如交叉熵)(因为此查找操作不可区分)。

import tensorflow as tf

# This example is using eager execution, but the same code will work with graph
# building if you run it in a Session.
tf.enable_eager_execution()

penalties = tf.constant([
    # Predicted 0
    0.,    # Label 0
    100.,  # Label 1
    # Predicted 1
    1.,    # Label 0
    0.     # Label 1
])

def compute_loss_weight(predicted, label):
  sparse_predicted = tf.argmax(predicted, axis=-1)
  sparse_label = tf.argmax(label, axis=-1)
  offset = sparse_predicted * tf.shape(label, out_type=tf.int64)[-1] + sparse_label
  return tf.gather(params=penalties, indices=offset)

print(compute_loss_weight(predicted=[1, 0], label=[0, 1]))  # 100.
print(compute_loss_weight(predicted=[0, 1], label=[1, 0]))  # 1.
# Also works on batches
print(compute_loss_weight(predicted=[[1, 0], [1, 0], [0, 1], [0, 1]],
                          label=    [[0, 1], [1, 0], [0, 1], [1, 0]]))
# Prints                             [100.   0.       0.      1.]