MindSpore算子笔记-nn.conv2d

tech2024-12-09  9

背景

nn.conv2d是卷积神经网络中最重要的成员,由Lecun等AI大神在1998年的论文中首次提出,其基本原理是对一个传入格式为(N,Cin,Hin,Win)的四维张量根据设定长宽的卷积核在Hin和Win维进行2d卷积运算,求解出卷积结果后,移动设定的步长再次执行卷积,依次计算得到所有位置的结果。具体实现可参考论文:http://vision.stanford.edu/cs598_spring07/papers/Lecun98.pdf

nn.Conv2d参数介绍

in_channels(int)—输入通道Cin的数量。

out_channels(int)—输出通道Cout的数量。

kernel_size(Union[int,tuple[int]])—数据类型为int或tuple,需为整数。指定二维卷积窗口的高度和宽度。单个int表示卷积核的高度和宽度的值如果是一个包含2个整数的元组,意味着第一个值代表卷积核的高度,另一个表示卷积核的宽度。

stride(Union[int,tuple[int]])—卷积核移动的距离,单个int表示移动的高度和宽度都是int,两个int数组成的元组分别表示移动的高度和宽度。默认值:1。

pad_mode (str) —指定填充模式。可选值为“same”、“valid”、“pad”。默认值:“same”。

– same:采用补全方式。输出的高度和宽度将与输入的高度和宽度相同。将计算水平和垂直方向的填充总数,并在可能的情况下均匀分布到顶部和底部,左侧和右侧。否则,最后的额外填充将从底部和右侧开始。如果设置了此模式,则填充必须为0。

– valid:采用丢弃方式。输出的可能最大的高度和宽度将返回而无需填充。多余的像素将被丢弃。如果设置了此模式,则填充必须为0。

– pad:输入两侧的隐式填充。填充数量将填充到输入张量边界。填充值应大于或等于0。

padding(int)–输入两侧的隐式填充,当模式为pad时生效。默认值:0

dilation(Union [int,tuple [int]])–数据类型为int或具有2个整数的元组。指定用于膨胀卷积的膨胀率。如果设置为k> 1,则每个采样位置将跳过k-1个像素。其值应大于或等于1,并以输入的高度和宽度为边界。默认值:1。

group(int)–将过滤器分为几组,in_channels和out_channels应该被组数整除。默认值:1。

has_bias(bool)–指定图层是否使用偏差矢量。默认值:False。

weight_init(Union [Tensor,str,Initializer,numbers.Number])–卷积内核的初始化方法。它可以是张量,字符串,初始化器或数字。指定字符串后,可以使用“ TruncatedNormal”,“ Normal”,“ Uniform”,“ HeUniform”和“ XavierUniform”分布以及常量“ One”和“ Zero”分布的值。可以接受别名“ xavier_uniform”,“ he_uniform”,“ ones”和“ zeros”。大写和小写均可。有关更多详细信息,请参考Initializer的值。默认值:“正常”。

bias_init(Union [Tensor,str,Initializer,numbers.Number])–偏置向量的初始化方法。可能的初始化方法和字符串与“ weight_init”相同。有关更多详细信息,请参考Initializer的值。默认值:“零”。

输入: 输入(张量)-形状(N,Cin,Hin,Win)的张量。

输出: 形状的张量(N,Cout,Hout,Wout)。

nn.Conv2d调用方式

import numpy as np import mindspore.nn as nn from mindspore import context, Tensor #pynative模式 context.set_context(mode=context.PYNATIVE_MODE, device_target="CPU") conv = nn.Conv2d(3, 4, 3, bias_init='zeros') input_data = Tensor(np.ones([1, 3, 5, 5]).astype(np.float32)) output = conv(input_data) print(output.asnumpy()) #图模式 context.set_context(mode=context.GRAPH_MODE, device_target="CPU") class Net(nn.Cell): def __init__(self): super(Net, self).__init__() self.conv = nn.Conv2d(3, 4, 3, bias_init='zeros') def construct(self, x): out = self.conv(X) return out input_data = Tensor(np.ones([1, 3, 5, 5]).astype(np.float32)) net = Net() output = net(input_data) print(output.asnumpy())
最新回复(0)