深层神经网络和批归一化操作、selu激活函数、dropout

深层神经网络其实对比之前的分类模型,他的网络层数更深,层数更多,但是,有时候也会造成过拟合的风险因为参数过多,导致全部拟合完容易记住样本。

model = keras.models.Sequential()
model.add(keras.layers.Flatten(input_shape=[28,28]))
for _ in range(20):
    model.add(keras.layers.Dense(100,activation="relu"))
model.add(keras.layers.Dense(10,activation="softmax"))

下面是批归一化的操作,其实很简单,就是在下面加一个归一化命令

model = keras.models.Sequential()
model.add(keras.layers.Flatten(input_shape=[28,28]))
for _ in range(20):
    model.add(keras.layers.Dense(100,activation="relu"))
    model.add(keras.layers.BatchNormalization())
    """
    model.add(keras.layers.Dense(100))
    model.add(keras.layers.BatchNormalization())
    model.add(keras.layers.Activation('relu'))
    """
model.add(keras.layers.Dense(10,activation="softmax"))

有人对归一化和激活函数先后顺序有着不同意见,其实差不多
批归一化可以减缓梯度消失现象,让更快的收敛

下面换一种新的激活函数:selu
selu自带归一化

ReLU
Sigmoid激活函数现在基本上没有人在使用了,大家都用ReLU。

ReLU的好处:它可以对抗gradient vanishin(梯度消失)等等;
在这里插入图片描述

自从有了ReLU以后,就有各式各样的变形,举例来说,有一个东西叫做Leaky ReLU,Leaky ReLU就是说小于0的地方我们不是乘0,我们小于零的地方乘上0.01,马上就会有人问说为什么是乘0.01呢 ? 那么就出现了Parametric ReLU,Parametric ReLU就是说小于0的地方,我们就乘上一个
a,至于a的值多少根据training data把它learn出来。
在这里插入图片描述

后来又有人想了一招叫Randomized ReLU,那就我所知,Randomized ReLU应该是没有paper的,但是某一个比赛的时候有人用了这一招,然后就得到好的结果,所以就被广为流传这个叫Randomized ReLU,他是说我们今天小于0的地方一样是乘上,但是的值也不是从data learn出来的,他是从distribution做sample出来的。也就是说以前在做training的时候,每次你的都是不一样的,但是在testing的时候你会fix住你的,他就有点类似它是想要做到类似有点dropout的效果。
在这里插入图片描述

ELU
后来有人提出了一个ReLU的进化版叫做ELU,ELU就是Exponential Linear Unit的意思,如果他在大于0的地方跟其他的ReLU的家族是一样的,不一样的地方是在小于零的地方,它是乘上的次方减1,就是那个激活函数的input,所以你可以想象说假设等于0的时候,=0,所以这边是接在一起的。而如果趋向于负无穷大的时候,的负无穷大次方是零,0减-1是-1,然后再乘,所以是,所以如下图绿色的线会收敛在。
在这里插入图片描述

SELU
上面那个ELU,要设多少?后来又出现一种新的方法,叫做:SELU。它相对于ELU做了一个新的变化:就是现在把每一个值的前面都乘上一个入,然后他告诉你说入跟a应该设多少,然后。
在这里插入图片描述
在这里插入图片描述

他的特点是:
它的值有正有负:在整个ReLU的family里里面,除了一开始最原始的ReLU以外都有负值,所以这个特性还好;
有 Saturation Region:其他的ReLU他们没有Saturation Region(饱和区),但是他有Saturation Region,不过ELU其实也有Saturation Region,因为SELU就只是ELU乘上一个而已;乘上这个有什么不同?乘上,让它在某些区域的斜率是大于的,意味着说你进来一个比较小的变化,通过Region以后,他把你的变化放大1.0507700987倍,所以它的input能是会被放大的,而且这是他一个ELU的没有的特色。

model = keras.models.Sequential()
model.add(keras.layers.Flatten(input_shape=[28,28]))
for _ in range(20):
    model.add(keras.layers.Dense(100,activation="selu"))
#selu自带归一化,缓解梯度消失
model.add(keras.layers.Dense(10,activation="softmax"))

下面添加dropout

model = keras.models.Sequential()
model.add(keras.layers.Flatten(input_shape=[28,28]))
for _ in range(20):
    model.add(keras.layers.Dense(100,activation="selu"))
#dropout用来防止过拟合,a—dropout保证均值和方差不变,归一化性质不变
#rate代表丢掉单元的数目比例是多少。0.5时候网络最大
model.add(keras.layers.AlphaDropout(rate=0.5))
#selu自带归一化,缓解梯度消失
model.add(keras.layers.Dense(10,activation="softmax"))
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值