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