目录

一、前言

二、算法理论

三、激活函数

四、参数初始化

五、基本实现(matlab)

六、处理流程


一、前言

        毫米波雷达以高适应性低识别力著称,但选择适合的分类算法依然可以达到85%甚至95%以上的准确率。一般工程做选择距离信噪比经验公式来做类型判断;置信度通过信噪比(反射强度)、跟踪命中次数及丢失次数来计算。

        之前工程中看到SVM与NN相关分类准确度比较,NN超平面学习效果比SVM提高的多。NN在分类上仍少不了传统特征分析与选取,神经元个数,层数,激活函数、损失函数设计,学习率等参数的调整。本篇基于西瓜书matlab实现最基本的NN,特征的选择。

二、算法理论

BP网络及算法如下所示:

 5.3到5.17的公式可以根据南瓜书看具体推导,这里我们可以先只关注结论即可,误差逆传播算法如下:

三、激活函数

激活函数就是在原来的线性组合的基础上加上非线性函数,让模型的表达能力更强。

ReLU(Rectified Linear Unit) - 用于隐层神经元输出,Relu实质就是个取最大值的函数

f(x) = max(0,x)。

优点:

输入是负值的情况下,它会输出0,那么神经元就不会被激活。这意味着同一时间只有部分神经元会被激活,从而使得网络很稀疏,进而对计算来说是非常有效率的。

缺点:神经元很容易“死亡”,因此需要设置较小的学习率

 Sigmoid - 用于隐层神经元输出,对于二分类的神经网络来说,最后一层的激活函数一般都是sigmoid函数。

 

 x是输入量,w是权重,b是偏移量(bias),权重w使得sigmoid函数可以调整其倾斜程度(上下),偏移量b不会改变曲线大体形状(左右)

小结:对比sigmoid类函数主要变化是:单侧抑制;相对宽阔的兴奋边界 ;稀疏激活性。

 Softmax - 用于多分类神经网络输出。softmax函数,又称归一化指数函数它是二分类函数sigmoid在多分类上的推广,目的是将多分类的结果以概率的形式展现出来。1)预测的概率为非负数;2)各种预测结果概率之和等于1

小结:softmax一般用于多分类的结果,一般和one-hot的真实标签值配合使用,大多数用于网络的最后一层;而sigmoid是原本一种隐层之间的激活函数,但是因为效果比其他激活函数差,目前一般也只会出现在二分类的输出层中,与0 1真实标签配合使用 。

Linear - 用于回归神经网络输出(或二分类问题)y= ax+b

损失函数(loss function)是用来估量你模型的预测值f(x)与真实值Y的不一致程度,它是一个非负实值函数,通常使用L(Y, f(x))来表示,损失函数越小,模型的鲁棒性就越好。

交叉熵损失函数

随机梯度下降

L表示最后一层,从最后一层开始,由损失函数逐步向后求导

四、参数初始化

  1. 基于固定方差的参数初始化
  • 高斯分布初始化:使用高斯分布  N(0,\sigma ^{2 }) 对每个参数随机初始化;
  • 均匀分布初始化:在[-r, r] 内采用均匀分布初始化,其方差为var(x) = \frac{(b-a)^{2}}{12}  ,得到:r=\sqrt{3\sigma ^{2}}  

固定方差参数初始化的关键是:如何设置方差,如果太小,一是导致神经元输出过小,经过多层则信号消失了;二是sigmoid激活丢失非线性(0附近基本是近似线性的)。如果太大,sigmoid激活梯度接近0,导致梯度消失。一般需要配合逐层归一化一起使用。

2. 基于方差缩放的参数初始化

如果一个神经元输入很多,则每个输入连接上的权重就应该小一些,以免输出过大,导致梯度爆炸(ReLU)或梯度消失(sigmoid)。因此,需要尽量保持每个神经元输入和输出方差一直,可以根据神经元连接数量自适应调整初始化分布的方差,称为“方差缩放”。

  • 2.1 Xavier初始化(也称为Glorot初始化,因为发明人为Xavier Glorot)
  • 2.2 He初始化(也称为Kaiming初始化)

表1 Xavier初始化和He初始化的具体设置情况

五、基本实现(matlab)

clc
clear
close all
%load data and init
data = csvread('watermelon3.csv',1,1);
x_in=[data(:,1:2),data(:,4:end)];
y_in = data(:,3);
learning = 0.1;
costs=[];
%layer: w1=3x19 b1=1x3; 1layer: w2=1x3 b2=1x1
layer_dims = [size(x_in,2);3;1];
%Xavier init:used for update
para.w1 = unifrnd(-sqrt(6)/sqrt(layer_dims(1)+layer_dims(2)),sqrt(6)/sqrt(layer_dims(1)+layer_dims(2)),layer_dims(1),layer_dims(2));
para.b1 = zeros(1,layer_dims(2));
para.w2 = unifrnd(-sqrt(6)/sqrt(layer_dims(2)),sqrt(6)/sqrt(layer_dims(2)),layer_dims(2),layer_dims(3));
para.b2 = zeros(1,layer_dims(3));
%learn
for i = 1:200
    %% Forward
    %1.forward first layer
    layer1.in = x_in;
    layer1.w = para.w1;
    layer1.b = para.b1;
    layer1.z = layer1.in*layer1.w+repmat(layer1.b,size(layer1.in,1),1);
    % 'relu' activate function
    layer1.out = max(0,layer1.z);
    %2.forward second layer
    layer2.in = layer1.out;
    layer2.w = para.w2;
    layer2.b = para.b2;
    layer2.z = layer2.in*layer2.w+repmat(layer2.b,size(layer2.in,1),1);
    % 'sigmoid' activate function
    layer2.out = 1./(1+exp(-layer2.z));
    %% Backward
    %二分类交叉熵损失函数,反向传播,求导=-yr/yh + (1-yr)/(1-yh),公式(5-10)求gi
    %参考:https://www.cnblogs.com/nullzx/p/9234058.html
    back1.gi = -y_in./layer2.out + (1-y_in)./(1-layer2.out);
    m = length(back1.gi);
    %sigmoid 求导 5.9
    exp_z = 1./(1+exp(-layer2.z));
    back1.dz = back1.gi .* exp_z .* (1-exp_z);
    back1.dw = back1.dz'*layer2.in/m;
    back1.db = sum(back1.dz)/m;
    back1.dy = back1.dz*layer2.w';
    %back2
    %relu 求导:输出为负值,求导为<0 = 0 ; >0  = 1 
    m = length(back1.dy);
    back2.dz = back1.dy;
    back2.dz(find(layer1.z<=0)) = 0;
    back2.dw = back2.dz'*layer1.in/m;
    back2.db = sum(back2.dz)/m;
    back2.dy = back2.dz*layer1.w';
    
    %% update
    para.w1 = para.w1 - learning*back2.dw';
    para.b1 = para.b1 - learning*back2.db;
    para.w2 = para.w2 - learning*back1.dw';
    para.b2 = para.b2 - learning*back1.db;
    
    %% Cost 
    %sigmod二分类交叉熵
    cost = -(y_in'*log(layer2.out) + ((1-y_in')*log(1-layer2.out)) )/length(y_in);
    costs = [costs;cost];
end
plot(costs);
%% predict
%使用梯度迭代的参数进行一次前向即可
    %% Forward
    %1.forward first layer
    layer1.in = x_in;
    layer1.w = para.w1;
    layer1.b = para.b1;
    layer1.z = layer1.in*layer1.w+repmat(layer1.b,size(layer1.in,1),1);
    % 'relu' activate function
    layer1.out = max(0,layer1.z);
    %2.forward second layer
    layer2.in = layer1.out;
    layer2.w = para.w2;
    layer2.b = para.b2;
    layer2.z = layer2.in*layer2.w+repmat(layer2.b,size(layer2.in,1),1);
    % 'sigmoid' activate function
    layer2.out = 1./(1+exp(-layer2.z));
    y_pre = layer2.out;
    y_pre(find(layer2.out>=0.5))=1;
    y_pre(find(layer2.out<0.5))=0;
    

六、处理流程

(1)首先要获取目标数据集,采集数据一般使用GPS定位法、速腾有Reference、摄像头和毫米波雷达融合,使用摄像头识别目标及毫米波获取的目标信息等方法获取数据集。

(2)选取特征信息包括目标相对距离、速度、方位角,RCS,距离RCS,速度RCS,方位角RCS,本车yawRate(本车运动姿态)

(3)选择合适NN参数,学习、预测

(4)雷达板子工程部署NN,上位机显示处理可视化

参考:

机器学习西瓜书——神经网络中的误差逆传播算法(BP算法) | TriaL (bjtu-hxs.github.io)

深度学习常用激活函数之— Sigmoid & ReLU & Softmax_Leo_Xu06的博客-CSDN博客_relu与sigmoid

激活函数:sigmoid、softmax、Relu_thisissally的博客-CSDN博客_激活函数softmax

二分类神经网络公式推导过程 - nullzx - 博客园 (cnblogs.com)

神经网络参数初始化小结 - 知乎 (zhihu.com)

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐