CNN中2d卷积算子的分析与实验
为了和之前的GNN中图卷积算子的实验相对应,本次实验主要对CNN中的2d卷积进行了分析。
在CNN中,我们通过卷积的计算操作来提取图像局部的特征,每一层都会计算出一些局部特征,这些局部特征再汇总到下一层,这样一层一层的传递下去,特征由小变大,最后在通过这些局部的特征对图片进行处理,这样大大提高了计算效率,也提高了准确度。
2d卷积作为一种基本的算子,广泛应用于很多模型当中,例如LeNet、AlexNet、GoogleNet、ResNet。和GNN不同,各种不同CNN模型的卷积操作都是一致的,即(在pytorch中)都是用函数torch.nn.Conv2d
为基础来构建整个模型(只不过卷积的参数略有区别),具体模型结构可以。因此,使用何种模型进行实验反而不那么重要了。
经典的模型结构可以参考:https://github.com/zergtant/pytorch-handbook/blob/master/chapter2/2.4-cnn.ipynb
下面的实验是在手写数字识别实验的基础上进行的——用LeNet-5来训练MNIST数据集。
torch.nn.Conv2d的研究与分析
torch.nn.Conv2d
的源代码在torch/nn/modules/conv.py
中实现,而通过查看源代码又可以将核心的2d卷积操作追溯到F.conv2d()
函数,但找不到这个对应的 python 代码,只是在文件torch/_C/_VariableFunctions.pyi
中进行了函数的声明,因为它来自于通过C++编写的THNN库(为了加速)。
追溯的路径和思路如下:
torch.nn.Conv2d-->torch/nn/modules/conv.py-->F.conv2d()-->torch/