计算Tensorflow损失函数中的多索引和

时间:2017-07-12 10:14:19

标签: python tensorflow neural-network keras

我正在尝试使用相当于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)))

1 个答案:

答案 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)))