python – 在pytorch(或Numpy)中实现此等式的更有效方法
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 在pytorch(或Numpy)中实现此等式的更有效方法,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1762字,纯文字阅读大概需要3分钟。
内容图文
我正在实现这个功能的分析形式
其中k(x,y)是RBF核k(x,y)= exp( – || x-y || ^ 2 /(2h))
我的函数原型是
def A(X, Y, grad_log_px,Kxy):
pass
X,Y是NxD矩阵,其中N是批量大小,D是维度.因此,X是上面等式中具有大小N的一批x,grad_log_px是使用autograd计算的一些NxD矩阵.
Kxy是NxN矩阵,其中每个条目(i,j)是RBF内核K(X [i],Y [j])
这里的挑战是,在上面的等式中,y只是一个维数为D的向量.我想要传递给一批y. (所以传递NxD大小的矩阵Y)
使用循环批量大小的方程式很好,但我无法以更整洁的方式实现
这是我尝试的循环解决方案:
def A(X, Y, grad_log_px,Kxy):
res = []
for i in range(Y.shape[0]):
temp = 0
for j in range(X.shape[0]):
# first term of equation
temp += grad_log_px[j].reshape(D,1)@(Kxy[j,i] * (X[i] - Y[j]) / h).reshape(1,D)
temp += Kxy[j,i] * np.identity(D) - ((X[i] - Y[j]) / h).reshape(D,1)@(Kxy[j,i] * (X[i] - Y[j]) / h).reshape(1,D) # second term of equation
temp /= X.shape[0]
res.append(temp)
return np.asarray(res) # return NxDxD array
在等式中:grad_ {x}和grad_ {y}都是维D
解决方法:
鉴于我正确推断了各种术语的所有维度,这是一种解决方法.但首先是维度的摘要(截图,因为它更容易用数学类型设置解释;请验证它们是否正确):
另请注意第二项的双重导数,它给出:
下标表示样本,上标表示功能.
因此,我们可以使用np.einsum(类似于torch.einsum)和array broadcasting创建两个术语:
grad_y_K = (X[:, None, :] - Y) / h * K[:, :, None] # Shape: N_x, N_y, D
term_1 = np.einsum('ij,ikl->ikjl', grad_log_px, grad_y_K) # Shape: N_x, N_y, D_x, D_y
term_2_h = np.einsum('ij,kl->ijkl', K, np.eye(D)) / h # Shape: N_x, N_y, D_x, D_y
term_2_h2_xy = np.einsum('ijk,ijl->ijkl', grad_y_K, grad_y_K) # Shape: N_x, N_y, D_x, D_y
term_2_h2 = K[:, :, None, None] * term_2_h2_xy / h**2 # Shape: N_x, N_y, D_x, D_y
term_2 = term_2_h - term_2_h2 # Shape: N_x, N_y, D_x, D_y
然后结果由下式给出:
(term_1 + term_2).sum(axis=0) / N # Shape: N_y, D_x, D_y
内容总结
以上是互联网集市为您收集整理的python – 在pytorch(或Numpy)中实现此等式的更有效方法全部内容,希望文章能够帮你解决python – 在pytorch(或Numpy)中实现此等式的更有效方法所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。