python - 计算 torch 张量的协方差(2d 特征图)

标签 python pytorch covariance torch

我有一个形状为(batch_size、number_maps、x_val、y_val)的 torch 张量。张量使用 sigmoid 函数进行标准化,因此在 [0, 1] 范围内。我想找到每个 map 的协方差,所以我想要一个形状为 (batch_size, number_maps, 2, 2) 的张量。据我所知,numpy 中没有 torch.cov() 函数。如何有效地计算协方差而不将其转换为 numpy?

编辑:

def get_covariance(tensor):
bn, nk, w, h = tensor.shape
tensor_reshape = tensor.reshape(bn, nk, 2, -1)
x = tensor_reshape[:, :, 0, :]
y = tensor_reshape[:, :, 1, :]
mean_x = torch.mean(x, dim=2).unsqueeze(-1)
mean_y = torch.mean(y, dim=2).unsqueeze(-1)

xx = torch.sum((x - mean_x) * (x - mean_x), dim=2).unsqueeze(-1) / (h*w - 1)
xy = torch.sum((x - mean_x) * (y - mean_y), dim=2).unsqueeze(-1) / (h*w - 1)
yx = xy
yy = torch.sum((y - mean_y) * (y - mean_y), dim=2).unsqueeze(-1) / (h*w - 1)

cov = torch.cat((xx, xy, yx, yy), dim=2)
cov = cov.reshape(bn, nk, 2, 2)

return cov

我现在尝试了以下方法,但我很确定它不正确。

最佳答案

您可以尝试Github上推荐的功能:

def cov(x, rowvar=False, bias=False, ddof=None, aweights=None):
    """Estimates covariance matrix like numpy.cov"""
    # ensure at least 2D
    if x.dim() == 1:
        x = x.view(-1, 1)

    # treat each column as a data point, each row as a variable
    if rowvar and x.shape[0] != 1:
        x = x.t()

    if ddof is None:
        if bias == 0:
            ddof = 1
        else:
            ddof = 0

    w = aweights
    if w is not None:
        if not torch.is_tensor(w):
            w = torch.tensor(w, dtype=torch.float)
        w_sum = torch.sum(w)
        avg = torch.sum(x * (w/w_sum)[:,None], 0)
    else:
        avg = torch.mean(x, 0)

    # Determine the normalization
    if w is None:
        fact = x.shape[0] - ddof
    elif ddof == 0:
        fact = w_sum
    elif aweights is None:
        fact = w_sum - ddof
    else:
        fact = w_sum - ddof * torch.sum(w * w) / w_sum

    xm = x.sub(avg.expand_as(x))

    if w is None:
        X_T = xm.t()
    else:
        X_T = torch.mm(torch.diag(w), xm).t()

    c = torch.mm(X_T, xm)
    c = c / fact

    return c.squeeze()

https://github.com/pytorch/pytorch/issues/19037

关于python - 计算 torch 张量的协方差(2d 特征图),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64554658/

相关文章:

python - 我们如何在 jsonpath_ng python 中使用正则表达式过滤器,它将/视为排序方向。有什么替代方案吗?

python-3.x - PyTorch 和 CUDA 驱动程序

c# - 没有使用泛型的显式叶节点类的父子数据结构

scala - 如何确定类型参数的方差?

r - 在R中寻找逆矩阵

python - Tesseract:大写字符问题

python - 我如何猴子修补 PyQT 的 QApplication.notify() 来计时事件

python - 迭代算法到递归的转换

python - 在 Pytorch 中实现 SeparableConv2D

deep-learning - “DataParallel”对象没有属性 ‘init_hidden’