我正在尝试使用相当于concordance index(c-index)的损失函数来优化神经网络。我想使用的损失函数是(链接中的乳胶方程)
∑{i=0}^N ∑{j=i}^N \sigma ( (y_i - y_j)(y'_i - y'_j ) )
其中y'是预测的向量,y是一批大小为N的标签的向量,\ sigma是sigmoid函数。我希望能够在TensorFlow中实现这一点,但我无法找到表达双指数和的方法。
我已经尝试将等式重新排列为一种不同的形式,可以用TensorFlow和Keras原语表示,但没有成功。我正在使用Keras,因此Keras或TensorFlow实现都可以使用。
Python代码是
from itertools import permutations, combinations
a = np.arange(4)
a = a*100
def loss_ci(y_true, y_pred):
summ = 0.
total=0
for i in range(len(y_true)):
for j in range(i+1,len(y_true)):
summ += 1/(1+np.exp(-(y_true[i]-y_true[j]) * (y_pred[i]-y_pred[j])))
total+=1
return (summ)/total
print("y_true\t\ty_pred\t\tc-index\tloss")
for c in permutations(a,3):
for d in combinations(a,3):
print(c, d, "\t{:.4f}".format(ci(c, d)), "\t{:.4f}".format(loss_ci(c, d)))
答案 0 :(得分:1)
可以使用张量流计算损失,如下面的代码所示:
from itertools import permutations, combinations
a = np.arange(4)
a = a*100
def loss_ci(y_true, y_pred):
summ = 0.
total=0
for i in range(len(y_true)):
for j in range(i+1,len(y_true)):
summ += 1/(1+np.exp(-(y_true[i]-y_true[j]) * (y_pred[i]-y_pred[j])))
return (summ)
def tf_loss_ci(y_true, y_pred):
Y = tf.constant(y_true)
_Y = tf.constant(y_pred)
S = tf.sigmoid(tf.multiply((Y[tf.newaxis,:]-Y[:,tf.newaxis]),(_Y[tf.newaxis,:]-_Y[:,tf.newaxis])))
S = tf.reduce_sum(tf.matrix_set_diag(S,tf.zeros_like(Y))) / 2
sess = tf.InteractiveSession()
tf.global_variables_initializer().run()
return S.eval()
print("y_true\t\ty_pred\t\ttensorloss\tloss")
for c in permutations(a,3):
for d in combinations(a,3):
print(c, d, "\t{:.4f}".format(tf_loss_ci(np.asarray(c, np.float32), np.array(d, np.float32))), "\t{:.4f}".format(loss_ci(c, d)))