MindSpore易点通·精讲系列–网络构建之Conv2d算子

Dive Into MindSpore – Conv2d Operator For Network Construction

MindSpore易点通·精讲系列–网络构建之Conv2d算子

本文开发环境

  • Ubuntu 20.04
  • Python 3.8
  • MindSpore 1.7.0

本文内容摘要

  • 先看文档
  • 普通卷积
  • 深度卷积
  • 空洞卷积
  • 数据格式
  • 填充方式
  • 输出维度
  • 本文总结
  • 本文参考

1. 先看文档

老传统,先看官方文档。
api

参数解读:

  • in_channels – 输入通道数
  • out_channels – 输出通道数
  • kernel_size – 二维卷积核的高度和宽度。值应该为整型(代表高度和宽度均为该值)或两个整型的tuple(分别代表高度和宽度值)
  • stride – 二维卷积的移动步长
  • pad_mode – 填充模式
  • padding – 填充数量
  • dilation – 二维卷积核膨胀尺寸,输入值同kernel_size。空洞卷积参数
  • group – 将过滤器拆分为组。深度卷积参数
  • has_bias – 是否添加偏置
  • data_format – 输入数据的数据格式,NCHWNHWC

2. 普通卷积

普通卷积,又可以称为常规卷积。由于是在深度学习相关课程中最先接触到的CNN卷积方式,本文不再对其原理展开介绍。下面通过一个实例来介绍MindSpore中的用法。

例如:

对于二维的8×8原始图像,图像格式为RGB(即通道数为3),可以认为这是一个3维图片,数据维度为 3×8×8(NCHW)或8×8×3(NHWC)。

假设我们对上述图片进行普通卷积操作,卷积核大小为3×3,步长为1,卷积后的输出通道数为4,padding方式为same,即输入和输出的高和宽一致。

其示意图如下所示:
common_conv

如何用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_channelsout_channelsgroup三个参数的值相等时,可以认为即为2D的深度卷积。下面通过一个案例来进一步讲解。

例如:

对于二维的8×8原始图像,图像格式为RGB(即通道数为3),可以认为这是一个3维图片,数据维度为 3×8×8(NCHW)或8×8×3(NHWC)。

假设我们对上述图片进行深度卷积操作,卷积核大小为3×3,步长为1,卷积后的输出通道数为3(与输入通道一致),padding方式为same,即输入和输出的高和宽一致。

其示意图如下所示:
depthwise_conv

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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值