避免在autograd中进行数组赋值

时间:2018-04-27 17:11:29

标签: python arrays numpy autograd

我从autograd教程中了解到,当数组包含在要区分的目标中时,不支持数组赋值。但是,我目前在我的代码中有以下目标函数,我想区分theta:

def obj(theta):
    """
    Computes the objective function to be differentiated.

    Args:
        theta: np.array of shape (n, d)

    Return:
        res: np.array of shape (n,)
    """
    theta = np.atleast_2d(theta)
    n = theta.shape[0]

    res = np.zeros(n)  # Scores
    for i in xrange(n):
        res[i] = ... # Do some computations with theta[i, :]

    return res

通常我可以通过在θ上向量化矢量来避免for循环;然而,在这种情况下,计算已经涉及给定特定行的θ(作为超参数)的各种线性代数运算(逆等),并且我发现很难在θ的所有行上向量化操作。在这种情况下,我不知道比使用for循环逐行填充res数组更好的方法。

我尝试了一种通过创建列表来避免数组赋值的天真方法,并在每次迭代时将结果附加到该列表,然后在返回res时最终将列表转换为数组,但最终得到全零渐变...

我想知道此设置中的一般推荐解决方案是什么?

1 个答案:

答案 0 :(得分:1)

您可以使用numpy.apply_along_axis为数据中的某个轴应用函数。

def func(row):
    # return the computation result for "row"

def obj(theta):
    """
    Computes the objective function to be differentiated.

    Args:
        theta: np.array of shape (n, d)

    Return:
        res: np.array of shape (n,)
    """
    theta = np.atleast_2d(theta)
    n = theta.shape[0]

    res = np.apply_along_axis(func1d=func, axis=1, arr=a)

    return res