pytorch卷积层权重之 二维互相关运算(corr2d) (亲测,已解决)
卷积神经网络(Convolutional Neural Network,简称CNN)是一种深度学习模型,广泛应用于图像识别、计算机视觉和模式识别等领域。它的设计灵感来自于生物学中视觉皮层的工作原理。卷积层、池化层和全连接层组成。
卷积层主要用于提取图像的局部特征,通过卷积操作和激活函数的处理,可以学习到图像的特征表示池化层则用于降低特征图的维度,减少参数数量,同时保留主要的特征信息。
全连接层则用于将提取到的特征映射到不同类别的概率上,进行分类或回归任务。
卷积神经网络在图像处理方面具有很强的优势,它能够自动学习到具有层次结构的特征表示,并且对平移、缩放和旋转等图像变换具有一定的不变性。这些特点使得卷积神经网络成为图像分类、目标检测、语义分割等任务的首选模型。除了图像处理,卷积神经网络也可以应用于其他领域,如自然语言处理和时间序列分析。通过将文本或时间序列数据转换成二维形式,可以利用卷积神经网络进行相关任务的处理。
torch.nn:PyTorch中的神经网络模块,提供了各种神经网络层和函数,
torch.nn.functional:PyTorch中的函数形式的神经网络层,如激活函数和损失函数等
二维互相关运算(corr2d)
如前文所示,在计算卷积的过程中,需要进行卷积核翻转,在具体实现上,一般会以互相关操作来代替卷积从而会减少一些不必要的操作或开销。
翻转指从两个维度(从 上到下、从左到右)颠倒次序,即旋转180度。
互相关和卷积的区别仅仅在于卷积核是否进行翻转,因此互相关也可以称为不翻转卷积
在神经网络中使用卷积是为了进行特征抽取,卷积核是否进行翻转和其特征抽取的能力无关。特别是当卷积核是可学习的参数时,卷积和互相关在能力上是等价的,因此,为了实现上(或描述上)的方便起见,我们用互相关来代替卷积,事实上,很多深度学习工具中卷积操作其实都是互相关操作。
def corr2d(X, K):#h, w = K.shapeY = torch.zeros((X.shape[0] - h + 1, X.shape[1] - w + 1))for i in range(Y.shape[0]):for j in range(Y.shape[0]):Y[i, j] = (X[i:i + h, j:j + w] * K).sum()return Y
2.二维卷积层类(Conv2D)
class Conv2D(nn.Module):def __init__(self, kernel_size,weight = None):super().__init__()if weight is not None:self.weight = weightelse:self.weight = nn.Parameter(torch.rand(kernel_size))self.bias = nn.Parameter(torch.zeros(1))def forward(self, x):return corr2d(x, self.weight) + self.bias
a._init_(初始化)
接受一个 kemel size 参数作为卷积核的大小,并可选地接受一个 weight 参数作为卷积核的权重。如果没有提供 weignt 参数,则会随机生成一个与 kemnel size 相同形状的权重,并将其设置为可训练的参数nn.Parameter)。
定义了一个偏置项 bias ,也将其设置为可训练的参数。
b.forward(前向传播函数)
调用之前的 corr2d 函数,对输入 x和卷积核权重 self.weint 进行相关性计算,并将计算结果与偏置项self.bias 相加,作为前向传播的输出。
3.模型测试
#由于卷积层还未实现多通道,所以图像也默认是单通道
fake_image=torch.randn((5,5))
#实例化 卷积算子
conv=Conv2D(kernel_size=(3,3))
output = conv(fake_image)
print(output)
输出结果: