Matrix 矩阵中细胞的邻域

Matrix 矩阵中细胞的邻域,matrix,pytorch,Matrix,Pytorch,我正在尝试使用下面的部分代码获取pytorch中矩阵单元的邻域。 它工作正常,但非常耗时。 你有什么加快速度的建议吗 def neighbour(x): result=F.pad(input=x, pad=(1, 1, 1, 1), mode='constant', value=0) for m in range(1,x.size(0)+1): for n in range(1,x.size(1)+1): y=torch.Tenso

我正在尝试使用下面的部分代码获取pytorch中矩阵单元的邻域。 它工作正常,但非常耗时。 你有什么加快速度的建议吗

def neighbour(x):
    result=F.pad(input=x, pad=(1, 1, 1, 1), mode='constant', value=0)
    for m in range(1,x.size(0)+1):
        for n in range(1,x.size(1)+1):
                y=torch.Tensor([result[m][n],result[m-1][n-1],result[m-1][n],result[m-1] 
           [n+1],result[m][n-1],result[m][n+1],result[m+1][n-1],result[m+1][n],result[m+1][n+1]])
                x[m-1][n-1]=y.mean()

    return x

如果仅在以每个像素为中心的9个元素的平均值之后,则最佳选择是使用2D卷积和恒定3x3滤波器:

import torch.nn.功能与nnf相同
def平均值过滤器(x_bchw):
"""
计算每个3x3邻域的平均值。
输入:
-x_bchw:批量通道高度宽度尺寸的输入张量
输出:
-y_bchw:y中的每个元素是x_bchw中9个对应元素的平均值
"""
#定义过滤器
box=torch.ones((3,3),dtype=x_bchw.dtype,device=x_bchw.device,required_grad=False)
box=box/box.sum()
box=box[None,None,…]重复(x_bchw.size(1,1,1,1)
#使用分组卷积-使每个通道分别平均。
y_bchw=nnf.conv2d(x_bchw,框,填充=1,组=x_bchw.size(1))
返回y_bchw
但是,如果您想对每个邻域应用更复杂的函数,您可能需要使用。此操作将每个3x3(或定义的任何矩形邻域)转换为向量。一旦你有了所有的向量,你就可以对它们应用你的函数。

有关
展开
折叠

的更多详细信息,请参阅使用正确的内核应用卷积,您将获得平均值。