python - 此功能的完美 numpy 实现
问题描述
这似乎是一个更直接的问题。最后我会概括一下。
我正在尝试在 numpy 中使用此功能。我已经成功地使用了嵌套的 for 循环,但我想不出一个 numpy 的方法来做到这一点。
我的实现方式:
bs = 10 # batch_size
nb = 8 # number of bounding boxes
nc = 15 # number of classes
bbox = np.random.random(size=(bs, nb, 4)) # model output bounding boxes
p = np.random.random(size=(bs, nb, nc)) # model output probability
p = softmax(p, axis=-1)
s_rand = np.random.random(size=(nc, nc))
s = (s_rand + s_rand.T)/2 # similarity matrix
pp = np.random.random(size=(bs, nb, nc)) # proposed probability
pp = softmax(pp, axis=-1)
first_term = 0
for b in range(nb):
for b_1 in range(nb):
if b_1 == b:
continue
for l in range(nc):
for l_1 in range(nc):
first_term += (s[l, l_1] * (pp[:, b, l] - pp[:, b_1, l_1])**2)
second_term = 0
for b in range(nb):
for l in range(nc):
second_term += (np.linalg.norm(s[l, :], ord=1) * (pp[:, b, l] - p[:, b, l])**2)
second_term *= nb
epsilon = 0.5
output = ((1 - epsilon) * first_term) + (epsilon * second_term)
我已经努力删除循环并使用np.tile
andnp.repeat
来完成任务。但是想不出可行的办法。
我曾尝试在 google 上搜索这样的练习,这些练习可以帮助我在 numpy 中学习此类转换,但没有成功。
解决方案
P_hat.shape
是 (B,L),S.shape
是 (L,L),P.shape
是 (B,L)。
array_before_sum = S[None,:,None,:]*(P_hat[:,:,None,None]- P_hat[None,None,:,:])**2
array_after_sum = array_before_sum.sum(axis=(1,3))
array_sum_again = (array_after_sum*(1-np.ones((B,B)))).sum()
first_term = (1-epsilon)*array_sum_again
second_term = epsilon*(B*np.abs(S).sum(axis=1)[None,:]*(P_hat - P)**2).sum()
推荐阅读
- nginx - 我们可以比 NginX/Apache 更快地从 Tomcat 提供静态文件吗?
- batch-file - 按下按钮停止执行内容
- php - 如何在“add_meta_boxes”中使用全局函数?
- node.js - 格式错误的响应错误:使我的代理时出现空语音响应
- javascript - 在 mongodb 中搜索多个集合
- c# - 使用 RestAPI 将文件上传到 OneDrive
- flask-sqlalchemy - 数据库问题“无法从字符串解析 rfc1738 URL”
- javascript - 'v-if' 添加到 'return' 函数时不起作用。为什么?
- c++ - 为什么 spi.recieve() 函数总是在 mbed 的 SPI 中返回零?
- php - 如何从 HTML 注释标签中删除缩进或空格?