常见算子操作
激活函数Permalink
ReluPermalink
f(x)={x,ifx≥00,ifx<0LeakyReluPermalink
f(x)={x,ifx≥0x×negative_slope,ifx<0PReluPermalink
f(x)={x,ifx≥0x×slope_data[c],ifx<0SigmoidPermalink
f(x)=11+e−x将变量映射到(0,1),S型曲线,求导方便,求导过程:f′(x)=e−x(1+e−x)2=f(x)×(1−f(x))
TanhPermalink
f(x)=sinh(x)cosh(x)=ex−e−xex+e−x将变量映射到(-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)powerBatchNormPermalink
mean=1mm∑i=1xi求均值variance=1mm∑i=1(xi−mean)2求方差ui=xi−mean√variance+eps归一化,eps用于防止除0yi=γ×ui+β⇒BNγ,β(xi)γ,β训练生成归一化,将网络层的输入转化到均值为 0方差为1的标准正态分布上,使梯度变化增大,加快训练收敛速度。
caffe中batchnorm,通常没有第四步,推理运算过程如下:
mean=blobs0,variance=blobs1,scale=blobs2[0]yi=xi−meancscale√variancecscale+epsLRNPermalink
bix,y=aix,y/(k+αmin(N−1,i+n/2)∑j=max(0,i−n/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],ifmaxSoftmaxPermalink
xi=xi−max(x0,...,xn)yi=exi∑nj=0exj通常用于分类网络中判断类别的概率。举例如下:
[31−3]⇒[0−2−6]⇒[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]