mxnet 常用层,卷积激活损失

举报
风吹稻花香 发表于 2021/06/04 23:35:46 2021/06/04
2.2k 0 0
【摘要】   MXNet之网络结构搭建 网络结构搭建 1.卷积层(Convolution) 2.BN层(Batch Normalization) 3.激活层(Activation) 4.池化层(Pooling) 5.全连接层(FullyConnected) 6. 损失函数层 7.通道合并层(concat) 8.逐点相加层(element-wise-sum) 1.卷积层(Co...

MXNet之网络结构搭建
网络结构搭建
1.卷积层(Convolution)
2.BN层(Batch Normalization)
3.激活层(Activation)
4.池化层(Pooling)
5.全连接层(FullyConnected)
6. 损失函数层
7.通道合并层(concat)
8.逐点相加层(element-wise-sum)
1.卷积层(Convolution)


      import mxnet as mx
      input_data = mx.nd.arange(1, 51).reshape((1,2,5,5))
      print(input_data)
      weight = mx.nd.arange(1, 37).reshape((2,2,3,3))
      print(weight)
      bias = mx.nd.ones(2)
      print(bias)
      #dilate>1时,表示执行空洞卷积num_proup>1时,表示执行分组卷积操作
      output_data = mx.nd.Convolution(data=input_data, weight=weight, bias=bias,
                                      kernel=(3,3), stride=(1,1), pad=(0,0),
                                      dilate=(1,1), num_filter=2, num_group=1
                                     )
      print(output_data)
  
 


 

计算过程如图:
 


      output_data = mx.nd.Convolution(data=input_data, weight=weight, bias=bias,
                                      kernel=(3,3), stride=(1,1), pad=(0,0),
                                      dilate=(2,2), num_filter=2, num_group=1
                                     ) #dilate=(2,2),实际kernel_size=(5,5)
      print(output_data)
      #此处卷积核的channel与input_data的channel不一样了,但数量是2个,可对input_data做group卷积操作
      weight = mx.nd.arange(1,19).reshape((2,1,3,3))
      print(weight)
  
 


#进行group卷积操作,将输入特征图和卷积核分成两个组,分别做卷积,的到2通道的输出特征图
 


      output_data_group = mx.nd.Convolution(data=input_data, weight=weight, bias=bias,
                                            kernel=(3,3), stride=(1,1), pad=(0,0),
                                            dilate=(1,1), num_filter=2, num_group=2,
                                           )
      print(output_data_group)
  
 

2.BN层(Batch Normalization)
BN(Batch Normalization)层主要对网络层输入做归一化和线性变换的层,能够加快模型收敛.


      import mxnet as mx
      input_data = mx.nd.arange(1,9).reshape(1,2,2,2)
      print(input_data)
      #初始化BN层的gamma参数[1,1]
      #gamma参数用来对归一化的特征图做变换操作,模型在训练中不断学习该参数
      gamma = mx.nd.ones(2)
      #初始化BN层的beta参数[1,1]
      #beta参数是一个偏移参数
      beta  =  mx.nd.ones(2)
      #初始化全局均值[3,3]
      #基于整个数据集集算出的均值
      moving_mean = mx.nd.ones(2) * 3
      #初始化全局方差[2,2]
      #基于整个数据集集算出的方差
      moving_var = mx.nd.ones(2) * 2
      #计算BN层结果; momentum:类似于优化函数的动量参数,默认0.9; fix_gamma设置为1;
      #则gammam参数固定不变,设置为0,网络学习gamma参数;
      #use_global_stats:表示是否用moving_mean替换mean,设置为0代表不替换,一般用于训练,设置为1代表替换,用于测试.
      """
      #data_mean,data_var计算的是当前批次的输入特征图数据,在通道维度上的均值和方差
      #moving_mean,moving_var计算的是整个数据集的均值和方差
      moving_mean = moving_mean * momentum + data_mean * (1 - momentum)
      moving_var = moving_var * momentum + data_var * (1 - momentum)
      """
      out_data = mx.nd.BatchNorm(data=input_data, gamma=gamma, beta=beta,
                                 moving_mean=moving_mean, moving_var=moving_var,
                                 momentum=0.9, fix_gamma=1, use_global_stats=1)
      print(out_data)
  
 


3.激活层(Activation)


      import mxnet as mx
      input_data = mx.nd.arange(-8,8).reshape(1,1,4,4)
      print(input_data)
      #调用relu激活函数
      out_data_relu = mx.nd.Activation(data=input_data,act_type="relu")
      print(out_data_relu)
      #调用sigmoid激活函数
      out_data_sigmoid = mx.nd.Activation(data=input_data, act_type="sigmoid")
      print(out_data_sigmoid)
      #调用softrelu
      out_data_softrelu = mx.nd.Activation(data=input_data, act_type="softrelu")
      print(out_data_softrelu)
      4.池化层(Pooling)
      import mxnet as mx
      input_data = mx.nd.arange(1,51).reshape((1,2,5,5))
      print(input_data)
      #最大值池化
      #pooling_convention住要与输出特征图尺寸计算相关;'valid'代表向下取整,'full'代表向上取整.
      out_data = mx.nd.Pooling(data=input_data, kernel=(2,2),pool_type="max",
                              global_pool=0, pooling_convention='valid',
                              stride=(1,1), pad=(0,0) )
      print(out_data)
  
 




#均值池化


      out_data = mx.nd.Pooling(data=input_data, kernel=(2,2),pool_type="avg",
                              global_pool=0, pooling_convention='valid',
                              stride=(1,1), pad=(0,0) )
      print(out_data)
      #全局最大值池化
      out_data = mx.nd.Pooling(data=input_data, kernel=(2,2),pool_type="max",
                              global_pool=1, pooling_convention='valid',
                              stride=(1,1), pad=(0,0) )
      print(out_data)
  
 




5.全连接层(FullyConnected)


      import mxnet as mx
      input_data = mx.nd.arange(1,19).reshape(1,2,3,3)
      print(input_data)
      #将input_data进行flatten后2*3*3=18,假设最后输出4类,所以reshape成(4,18)
      bias = mx.nd.ones(4)
      weight = mx.nd.arange(1,73).reshape((4,18))
      print(weight)
      out_data = mx.nd.FullyConnected(data=input_data, weight=weight, bias=bias,
                                     num_hidden=4, flatten=1)
      print(out_data)
  
 




6. 损失函数层


      #input_data代表5个样本,4个类别
      import mxnet as mx
      input_data = mx.nd.cast(mx.nd.arange(0.1,2.1,0.1).reshape((5,4)),'float16')
      print(input_data)
      #进行softmax层操作,每一行相加=1
      out_data = mx.nd.softmax(data=input_data,axis=-1)
      print(out_data)
      #假设5个样本真实标签都是0,从`上面结果可知,预测标签都是3,所以全预测错了
      label = mx.nd.array([0,0,0,0,0], dtype='float16')
      ce_loss = mx.nd.softmax_cross_entropy(data=input_data,label=label)
      print(ce_loss)
      #预测对了2个
      label = mx.nd.array([1,0,3,3,0],dtype='float16')
      ce_loss = mx.nd.softmax_cross_entropy(data=input_data,label=label)
      print(ce_loss)
      #全预测对了
      label = mx.nd.array([3,3,3,3,3],dtype='float16')
      ce_loss = mx.nd.softmax_cross_entropy(data=input_data,label=label)
      print(ce_loss)
      因为在这个例子中,没个样本4个类别之间其概率值相差不大,因此预测全对和全错的损失值差别也不大.
      #目标检测算法常用的损失函数--Smooth L1
      smoothl1_loss = mx.nd.smooth_l1(data=input_data, scalar=1)
      print(smoothl1_loss)
  
 


 


7.通道合并层(concat)
通道合并层通过将输入特征图在通道维度上做合并,以达到特征融合的目的,目前在多种图像任务中都有广泛应用.


      import mxnet as mx
      #初始化第一张特征图
      input_data1 = mx.nd.arange(1,51).reshape((1,2,5,5))
      print(input_data1)
      #初始化第二张特征图
      input_data2 = mx.nd.arange(5,31).reshape((1,1,5,5))
      print(input_data2)
      #执行通道融合,合并后通道数是3;dim默认为1,代表通道这个维度.
      out_data = mx.nd.concat(input_data1,input_data2,dim=1)
      print(out_data)
  
 


8.逐点相加层(element-wise-sum)
逐点相加层,是对输入特征图在宽,高纬度做逐点相加得到输出特征图的网络层,也是一种特征融合操作.


      mxnet.symbol.ElementWiseSum()接口进行逐点相加操作
      import mxnet as mx
      input_data1 = mx.nd.arange(1,51).reshape((1,2,5,5))
      input_data2 = mx.nd.arange(2,52).reshape((1,2,5,5))
      out_data = mx.nd.ElementWiseSum(input_data1,input_data2)
      print(out_data)
  
 

文章来源: blog.csdn.net,作者:网奇,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/jacke121/article/details/115627971

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。