【发布时间】:2020-05-26 12:49:46
【问题描述】:
这似乎是一个更直接的问题。最后我会概括一下。
我正在尝试在 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 和np.repeat。但想不出可行的办法。
我曾尝试在 google 上搜索类似这样的练习,这些练习可以帮助我在 numpy 中学习此类转换,但没有成功。
【问题讨论】:
-
你有一些输入和一些预期的输出数据吗?
-
不,因为这是我的一个模型的损失函数。但我可以分享 numpy 数组的形状。将更新问题。
-
只是编一些数字?
-
是的..它有效。已经测试过了。所以,我只需要一个更好的选择。顺便说一句,更新了问题。
-
我猜内部循环可以替换为 .dot 操作(产品总和)
标签: python numpy machine-learning loss-function