常见算子操作

15 分钟阅读

激活函数Permalink

ReluPermalink

f(x)={x,ifx00,ifx<0

LeakyReluPermalink

f(x)={x,ifx0x×negative_slope,ifx<0

PReluPermalink

f(x)={x,ifx0x×slope_data[c],ifx<0

SigmoidPermalink

f(x)=11+ex

将变量映射到(0,1),S型曲线,求导方便,求导过程:f(x)=ex(1+ex)2=f(x)×(1f(x))

TanhPermalink

f(x)=sinh(x)cosh(x)=exexex+ex

将变量映射到(-1,1),S型曲线.

MishPermalink

f(x)=x×tanh(ς(x)),ς(x)=ln(1+ex)

YOLOv4网络使用的激活函数,类似relu,但是负值保持光滑非单调。

元素操作Permalink

ScalePermalink

f(x)=scale[c]×x+bias[c]

PowerPermalink

f(x)=(scale×x+shift)power

BatchNormPermalink

mean=1mmi=1xivariance=1mmi=1(ximean)2ui=ximeanvariance+eps,eps0yi=γ×ui+βBNγ,β(xi)γ,β

归一化,将网络层的输入转化到均值为 0方差为1的标准正态分布上,使梯度变化增大,加快训练收敛速度。

caffe中batchnorm,通常没有第四步,推理运算过程如下:

mean=blobs0,variance=blobs1,scale=blobs2[0]yi=ximeancscalevariancecscale+eps

LRNPermalink

bix,y=aix,y/(k+αmin(N1,i+n/2)j=max(0,in/2)(ajx,y)2)β

局部相应归一化,基本上只有googlenet在用。通俗来说就是局部相邻元素归一,分通道间相邻和通道内相邻。

LayerNormPermalink

torch.nn.LayerNorm(normalized_shape: Union[int, List[int], torch.Size],
                   eps: float = 1e-05,
                   elementwise_affine: bool = True)

计算过程与BatchNorm相同,区别在于BatchNorm会在train阶段跟踪统计全局的均值方差;而LayerNorm不受train影响,推理时直接计算指定范围的均值方差。

向量操作Permalink

PoolingPermalink

[12345678]{[68],ifmax[3.55.5],ifaverage

从大feature map转为小feature map,防止过拟合,减少参数

UpsamplePermalink

[1234][1122112233443344]

上采样,用于扩大feature map,通常有这几种:

  • 如图中所示,各个元素翻倍
  • unpooling max,只有在pooling max位置填值,其余补0
  • deconv,input填0后做卷积操作

TilePermalink

[1234][1212343412123434]

维度翻倍,上图是将(h,w)转换为(2h,2w)

Permute (Transpose)Permalink

[12345678][15263748]

维度转换,比如图片三维HWC转换为CHW,可以用numpy如下操作:

x = np.transpose(x, (2,0,1))

ConcatPermalink

[12],[34],[56][123456]

按指定维度进行合并。例子中axis=1;如果axis=0,则结果为[1 2 3 4 5 6]

ReshapePermalink

[12345678][12345678]

不改变存储顺序,只改变tensor shape。

在caffe中由reshape_param.shape.dim指定新shape,如果dim=0,则保持不变;dim=-1,则指定为剩余维度。

ReorgPermalink

[[13245768]][[12],[34],[56],[78]]

重组,stride指定间隔,reverse指定是否反向。令r = stride, 则:

当reverse为false时,[N,C,H,W][N,r2×C,Hr,Wr]

当reverse为true时,[N,C,H,W][N,Cr2,H×r,W×r],注意C=r2×Cr2

pixelshufflePermalink

[N,C,H,W][N,Cr2,H×r,W×r],注意 C=Cr2×r2

与reorg reverse为true比较类似,区别在于C维降维的次序不同

EltwisePermalink

[[12],[34],[56],[78]]{[105384],ifprod[1620],ifsum[78],ifmax

SoftmaxPermalink

xi=ximax(x0,...,xn)yi=exinj=0exj

通常用于分类网络中判断类别的概率。举例如下:

[313][026][0.880.120]

ArgmaxPermalink

[092534]{[101],ifaxis=0[10],ifaxis=1

指定维度,得到最大值的index,对应操作numpy.argmax()。比如[n, c, h, w],如果axis = 0, 得到[c,h,w];如果axis = 1, 得到[n, h, w];如果 axis = 2, 得到[n, c, w]。

InnerProduct (FullyConnected)Permalink

二维矩阵运算,(MN)×(NK)(MK)

其他操作Permalink

GridSamplePermalink

参见torch.nn.functional.grid_sample,输入和输出关系如下: \(Input_{(N, C, H_{in}, W_{in})}, Grid_{(N, H_{out}, W_{out}, 2)} \Rightarrow Output_{(N,C,H_{out},W_{out})}\) 网格在输入中采用,其中2对应Input的H和W坐标。坐标不一定是范围内的整数,

ScatterNDPermalink

参见ScatterND,它等同于torch的索引操作,对局部向量进行更新。它对应三个输入,和一个输出。举例如下:

data    = [1, 2, 3, 4, 5, 6, 7, 8]
indices = [[4], [3], [1], [7]]
updates = [9, 10, 11, 12]
output  = [1, 11, 3, 10, 9, 6, 7, 12]