我正在研究一个图网络问题,我想利用TensorFlow的能力。在
但我在正确实现TensorFlow中的成本函数时遇到了困难。在
我的成本函数如下:sum_i>j A_ij*log(pi_ij)+(1-A_ij)*log(1-pi_ij)
其中:pi_ij = sigmoid(-|z_i-z_j|+beta)
| |是欧几里得距离,pi_ij表示i和{}之间连接的机会,A_ij = 1如果链接和0如果不是(在一个简单的邻接矩阵中),两者都是相同大小的矩阵。我已经用python和一个简单的SGD方法手动解决了这个优化问题。我计算成本函数如下:
^{pr2}$
在TensorFlow中如何定义这样一个损失函数?有可能吗?任何帮助或推动在正确的方向将不胜感激。在
编辑
我在张量流中记下了:tfY = tf.placeholder(shape=(15, 15), dtype=tf.float32)
with tf.variable_scope('test'):
shape = [] # Shape [] means that we're using a scalar variable
B = tf.Variable(tf.zeros(shape))
tfZ = tf.Variable(tf.zeros(shape=(15,2)))
def loss():
r = tf.reduce_sum(tfZ*tfZ, 1)
r = tf.reshape(r, [-1, 1])
D = tf.sqrt(r - 2*tf.matmul(tfZ, tf.transpose(tfZ)) + tf.transpose(r))
return tf.reduce_sum(tfY*tf.log(tf.sigmoid(D+B))+(1-tfY)*tf.log(1-tf.sigmoid(D+B)))
LOSS = loss()
GRADIENT = tf.gradients(LOSS, [B, tfZ])
sess = tf.Session()
sess.run(tf.global_variables_initializer())
tot_loss = sess.run(LOSS, feed_dict={tfZ: Z,
tfY: Y})
print(tot_loss)
loss_grad = sess.run(GRADIENT, feed_dict={tfZ: Z,
tfY: Y})
print(loss_grad)
打印以下内容:-487.9079
[-152.56271, array([[nan, nan],
[nan, nan],
[nan, nan],
[nan, nan],
[nan, nan],
[nan, nan],
[nan, nan],
[nan, nan],
[nan, nan],
[nan, nan],
[nan, nan],
[nan, nan],
[nan, nan],
[nan, nan],
[nan, nan]], dtype=float32)]
我的beta值返回一个值,将其乘以学习率可以提高分数,但我的tfZ向量只返回nans,我显然做错了什么,如果有人能发现我做错了什么,我将不胜感激。在