Вычисление градиента tSNE с использованием автограда

Я пытаюсь реализовать алгоритм tSNE в Python. Я использую пакет autograd для вычисления градиентов вместо обычно используемого аналитического градиента.

Но я не могу рассчитать градиенты по мере необходимости. Я новичок в ML и пробую свои силы с autograd и другими фреймворками.

Итак, это мой подход. Сначала я вычисляю матрицу подобия P. Затем я вычисляю низкоразмерную матрицу сродства Q на ходу, вычисляя потери. Это мой код -

def compute_kl_loss(Y, P, n):
    loss = 0
    for i in range(n):
        qij = 1 / (1 + np.sum((Y[i,:] - Y)**2),1)
        for j in range(n):
            loss += P[i,j]* np.log(P[i,j]) - P[i,j]*np.log(qij)
    return loss

def get_grad(Y, P):
    n = Y.shape[0]
    loss_kld = lambda Y: compute_kl_loss(Y, P, n)
    gradY = grad(loss_kld) 
    dY = gradY(Y).

Но этот подход, похоже, не работает. Я получаю следующую ошибку -

  File "tsne.py", line 130, in compute_kl_loss
    qij = 1 / (1 + np.sum((Y[i,:] - Y)**2),1)
TypeError: unsupported operand type(s) for /: 'int' and 'tuple'

Пожалуйста, покажите мне, как исправить это. И мой подход правильный? Или есть лучший способ сделать это?

Спасибо.

1 ответ

В этой строке:

qij = 1 / (1 + np.sum((Y[i,:] - Y)**2),1)

вы создаете кортеж, состоящий из:

left_part: 1 + np.sum((Y[i,:] - Y)**2)
right_part: 1

кортеж существо: my_tuple = (left_part, right_part)

что в значительной степени объясняется вашей ошибкой.

Операция 1 / (x, y) ((x, y) будучи кортежем) недопустим в Python, как объяснено в ошибке!

Так что вы, вероятно, должны проверить свои скобки.

Другие вопросы по тегам