打开 onnx 模型图,可以看到它是一个有向无环图。除了 Input、Output ,其他都是算子(是操作,而不是节点)
在ONNX(Open Neural Network Exchange)模型中,除了输入和输出,其他都是算子(Operations)。算子是表示神经网络模型中的不同操作或层的元素。一个ONNX模型由一系列算子组成,通过连接这些算子来定义模型的计算流程。
常见的算子包括卷积、全连接、池化、激活函数(如ReLU、Sigmoid)、批归一化(如Batch Normalization)、Dropout等。每个算子都有自己的输入和输出张量,并且可能有一些可调参数用于控制其行为。
算子之间的连接关系形成了一个有向图,反映了模型中不同操作的计算顺序。输入张量通过算子进行计算,然后产生输出张量,这些输出张量又可以作为其他算子的输入。最后一个算子的输出张量即为模型的输出。
ONNX提供了一种通用的中间表示形式,使得各种深度学习框架之间可以相互转换模型。通过使用ONNX,可以将模型从一个框架导出为ONNX格式,然后将其导入到另一个框架中进行训练或推理。这种灵活性使得研究人员和开发人员能够更方便地在不同框架之间共享和使用模型。
在onnx中,每个 conv 算子算一层
Conv (卷积)
conv 相当于在 gemm 基础上做了稀疏化和权重共享
attribute(属性)
pad 补零: auto_pad 自动补零 pads 指定补零
dilations 膨胀:
用于指定卷积核在输入张量的各个维度上的扩张率。这个属性是一个整数列表,长度通常与输入张量的维度相同。每个整数表示对应维度上的扩张率。
dilations 用于控制卷积核在输入张量的各个维度上的滑动步长,通过增加扩张率可以增加卷积操作的感受野,提取更多的特征信息。
group(分组):
在深度卷积神经网络中,group属性用于指定卷积操作的分组数。这个属性是一个整数值,用于将输入张量和卷积核进行分组,并对每个组进行独立的卷积运算。
具体来说,当group属性的值大于1时,输入张量和卷积核会被分成group个组,每个组包含相同数量的通道。然后,对每个组进行独立的卷积运算,最后将各个组的输出结果进行拼接,得到最终的卷积操作的输出张量。
总结来说,group属性用于将输入张量和卷积核进行分组,并对每个组进行独立的卷积运算。通过设置group属性,可以减少卷积操作的计算量,但可能会降低特征的表达能力。
kernel_shape(卷积核形状)
kernel_shape属性用于指定卷积核的形状。kernel_shape是一个整数列表,其长度应与输入张量的维度相同,每个元素表示卷积核在对应维度上的大小。
具体来说,对于二维卷积操作,输入张量的形状通常为[batch_size, height, width, channels],而kernel_shape应该是一个长度为2的整数列表,表示卷积核在高度和宽度上的大小。
例如,如果希望使用一个3x3的卷积核进行二维卷积操作,可以将kernel_shape设置为[3, 3]。
需要注意的是,kernel_shape属性只用于指定卷积核的形状,卷积核的通道数是由卷积层的参数决定的,而不是通过kernel_shape属性来指定的。
总结起来,kernel_shape属性是用于指定卷积核形状的属性,它是一个整数列表,长度与输入张量的维度相同,每个元素表示卷积核在对应维度上的大小。
strides(步长)
conv属性strides是卷积层的步长参数,用于控制卷积核在输入数据上滑动的步幅。它是一个包含两个整数的元组,分别表示在水平和竖直方向上的步长大小。默认值为(1, 1),即卷积核每次水平和竖直方向上移动一个像素。较大的步长可以减少输出特征图的大小,同时也会降低模型的计算量。