tf.while_loop
может быть сложным в использовании, обязательно внимательно прочитайте документацию.Возвращаемое значение тела должно иметь ту же структуру, что и переменные цикла, а возвращаемое значение операции tf.while_loop
является окончательным значением переменных.Чтобы сделать вычисление, вы должны передать дополнительную переменную цикла для хранения частичных результатов.Вы можете сделать что-то вроде этого:
def body1(i, result):
global data
N = len(data) * positive_samples
j = tf.constant(0)
condition2 = lambda j, i, result: tf.less(j, N)
result = 0
def body2(j, i, result):
global similarity_matrix, U, V
result_j = (tf.transpose(U[:, i]) * V[:, j])
return j + 1, i, result + result_j
j, i, result = tf.while_loop(condition2, body2, loop_vars=[j, i, result])
return i + 1, result
def loss_function(x):
global data
N = len(data)*positive_samples
i = tf.constant(0)
result = tf.constant(0, dtype=tf.float32)
condition1 = lambda i, result: tf.less(i, N)
i, result = tf.while_loop(condition1, body1, [i, result])
return result
Из вашего кода неясно, где будет использоваться x
.В этом случае, однако, результат операции должен быть равен просто:
result = tf.reduce_sum(tf.transpose(U) @ V)
# Equivalent
result = tf.reduce_sum(tf.matmul(tf.transpose(U), V))
, что также будет намного быстрее.