【问题标题】:Computing tSNE gradient using autograd使用 autograd 计算 tSNE 梯度
【发布时间】:2017-09-12 23:14:22
【问题描述】:

我正在尝试在 python 中实现 tSNE 算法。我正在使用 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'

请告诉我如何纠正这个问题。我的方法是正确的吗?或者有更好的方法吗?

谢谢。

【问题讨论】:

    标签: python machine-learning gradient autograd


    【解决方案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中无效,如错误中所述!

    所以你可能应该检查你的括号。

    【讨论】:

      猜你喜欢
      • 2020-12-29
      • 1970-01-01
      • 1970-01-01
      • 2013-04-11
      • 1970-01-01
      • 1970-01-01
      • 2013-07-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多