我目前有一个RNN,其中我的标签有两个类。输出[1,0]或[0,1]。我喜欢实现一个损失矩阵,以便错误地猜测[1,0] [0,1]的成本比[1,0]的[0,1]猜测成本高100倍。所以我认为我的损失矩阵是[[0,1],[100,0]]。
这是否可以使用张量流?如果是这样,我应该使用什么成本函数?谢谢
答案 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.]