import torch


def conv2d(x, kernel):
    """
    二维卷积运算（互相关）
    :param x: 二维数据
    :param kernel: 二维卷积核
    :return: 经过卷积运算后的数据
    """
    # 获得卷积核的高度和宽度
    height, width = kernel.size()
    # 初始化经过卷积后的二维数组
    y = torch.zeros(size=(x.size(0) - height + 1, x.size(1) - width + 1))
    # print('卷积后的形状：{}'.format(y.size()))
    for i in range(y.size(0)):
        for j in range(y.size(1)):
            # 进行卷积运算，并更新
            y[i, j] = (x[i:height+i, j:width+j]*kernel).sum()
    return y