mxnet 常用层,卷积激活损失

举报
风吹稻花香 发表于 2021/06/04 23:35:46 2021/06/04
【摘要】   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)


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


 

计算过程如图:
 


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


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


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

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


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


3.激活层(Activation)


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




#均值池化


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




5.全连接层(FullyConnected)


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




6. 损失函数层


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


 


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


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


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


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

 

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

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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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