python - 该函数的完美 numpy 实现

标签 python numpy machine-learning loss-function

这似乎是一个更直接的问题。最后我会概括一下。

我正在尝试在 numpy 中使用这个函数。我已经成功地使用嵌套 for 循环,但我想不出一种 numpy 的方法来做到这一点。

function to implement

我的实现方式:

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.tilenp.repeat 代替,以完成任务。但想不出可行的办法。

我尝试在谷歌上搜索类似的练习,这些练习可以帮助我学习 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()

关于python - 该函数的完美 numpy 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60163329/

相关文章:

python - 根据一列的值从二维矩阵中提取值

python - 为什么 SMOTE 不能处理超过 15 个特征/什么方法可以处理超过 15 个特征?

python - 测试和训练数据的 R2 分数即将变为 0

Python 3.6 异或文件解密

python - pycaffe windows - 无法打开 python27.lib

python - 从 Django 中的模型链接 2 个字段

python - 正则表达式、Python 和文档注释 <!-- 文本 -->

python - Pandas :如何获得第一个正数?

python - 如何使用 Python 中的 numpy 和 matplotlib 在 Python 中的曲线内部绘制切线圆?

image-processing - 在图像中找到蚊子的头