我从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时最终将列表转换为数组,但最终得到全零渐变...
我想知道此设置中的一般推荐解决方案是什么?
答案 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