Dive Into MindSpore – Conv2d Operator For Network Construction
MindSpore易点通·精讲系列–网络构建之Conv2d算子
本文开发环境
- Ubuntu 20.04
- Python 3.8
- MindSpore 1.7.0
本文内容摘要
- 先看文档
- 普通卷积
- 深度卷积
- 空洞卷积
- 数据格式
- 填充方式
- 输出维度
- 本文总结
- 本文参考
1. 先看文档
老传统,先看官方文档。

参数解读:
- in_channels – 输入通道数
- out_channels – 输出通道数
- kernel_size – 二维卷积核的高度和宽度。值应该为整型(代表高度和宽度均为该值)或两个整型的tuple(分别代表高度和宽度值)
- stride – 二维卷积的移动步长
- pad_mode – 填充模式
- padding – 填充数量
- dilation – 二维卷积核膨胀尺寸,输入值同kernel_size。空洞卷积参数
- group – 将过滤器拆分为组。深度卷积参数
- has_bias – 是否添加偏置
- data_format – 输入数据的数据格式,
NCHW或NHWC
2. 普通卷积
普通卷积,又可以称为常规卷积。由于是在深度学习相关课程中最先接触到的CNN卷积方式,本文不再对其原理展开介绍。下面通过一个实例来介绍MindSpore中的用法。
例如:
对于二维的8×8原始图像,图像格式为RGB(即通道数为3),可以认为这是一个3维图片,数据维度为 3×8×8(NCHW)或8×8×3(NHWC)。
假设我们对上述图片进行普通卷积操作,卷积核大小为3×3,步长为1,卷积后的输出通道数为4,padding方式为same,即输入和输出的高和宽一致。
其示意图如下所示:

如何用MindSpore来定义这样的普通卷积呢,示例代码如下:
这里的批数为2
import numpy as np
from mindspore import nn
from mindspore.common import dtype as mstype
from mindspore.common import Tensor
def common_conv_demo():
img_data = np.random.rand(2, 3, 8, 8)
ms_in = Tensor(img_data, dtype=mstype.float32)
conv_op = nn.Conv2d(3, 4, 3, 1)
ms_out = conv_op(ms_in)
print("in shape: {}".format(ms_in.shape), flush=True)
print("out shape: {}".format(ms_out.shape), flush=True)
def main():
common_conv_demo()
if __name__ == "__main__":
main()
代码解读:
核心代码为
nn.Conv2d(3, 4, 3, 1)
参数数字3表示输入通道
参数数字4表示输出通道。
参数数字3表示卷积核大小,这里因为高&宽的卷积值相等,所以使用整型表示。
参数数字1表示卷积移动步长。
nn.Conv2d默认卷积方式为same,故没有在这里的参数中体现。
将上述代码保存到common_conv2d.py文件,使用如下命令运行:
python3 common_conv2d.py
输出内容为:
可以看到输出的通道为4,因为填充方式为
same,输出的高度和宽度与输入数据相同。
in shape: (2, 3, 8, 8)
out shape: (2, 4, 8, 8)
3. 深度卷积
深度卷积(Depthwise Convolution)的一个卷积核负责一个通道,一个通道只被一个卷积核卷积,可以看出其卷积方式与普通卷积明显不同。深度卷积一般与逐点卷积(Pointwise Convolution)结合,组成深度可分离卷积(Depthwise Separable Convolution),当然也可以单独使用,比如,经典的MobileNet网络就用到了深度可分离卷积。
那么在MindSpore中如何实现深度卷积呢,我们先从文档说起。
- group (int) – Splits filter into groups, in_channels and out_channels must be divisible by group. If the group is equal to in_channels and out_channels, this 2D convolution layer also can be called 2D depthwise convolution layer. Default: 1.
- group (int) – 将过滤器拆分为组, in_channels 和 out_channels 必须可被 group 整除。如果组数等于 in_channels 和 out_channels ,这个二维卷积层也被称为二维深度卷积层。默认值:1.
从文档可以看出,当in_channels、out_channels、group三个参数的值相等时,可以认为即为2D的深度卷积。下面通过一个案例来进一步讲解。
例如:
对于二维的8×8原始图像,图像格式为RGB(即通道数为3),可以认为这是一个3维图片,数据维度为 3×8×8(NCHW)或8×8×3(NHWC)。
假设我们对上述图片进行深度卷积操作,卷积核大小为3×3,步长为1,卷积后的输出通道数为3(与输入通道一致),padding方式为same,即输入和输出的高和宽一致。
其示意图如下所示:

MindSpore示例代码如下:
import numpy as np
from mindspore import nn
from mindspore.common import dtype as mstype
from mindspore.common import Tensor
def depthwise_conv_demo():
img_data = np.random.rand(2, 3, 8, 8)
ms_in = Tensor(img_data, dtype=mstype.float32)
conv_op = nn

最低0.47元/天 解锁文章
2438

被折叠的 条评论
为什么被折叠?



