激活函数的作用主要是引入非线性因素,解决线性模型表达能力不足的缺陷
sigmoid函数可以从图像中看出,当x向两端走的时候,y值越来越接近1和-1,这种现象称为饱和,饱和意味着当x=100和x=1000的映射结果是一样的,这种转化相当于将1000大于100的信息丢失了很多,所以一般需要归一化数据。
softplus函数相比于relu函数更加平滑,会保存部分小于零的函数,但是计算量也更大了。
relu函数在信号响应上有很多优势,但是仅仅在正向传播中,由于其对负值全部舍去很容易使模型输出全零而无法训练。例如:随机初始化的w中存在负值,其对应的正值输入特征也就被全部屏蔽了,同理对应的负值输入反而被激活了。因此,一些relu变种被开发,此处不详细讲解。
Swish是谷歌公司发现一个效果更优于relu的激活函数:
神经网络激活函数总结:
tanh函数适用于特征相差明显时的效果会很好,在循环中会不断扩大特征效果并将其显示出来。但当特征之间相差比较复杂没有明显的区别,或者特征间的相差不是特别大需要细微的分类判断时,sigmoid函数的效果会更好。relu函数的优势在于经过处理后的数据具有很好的稀疏性。
keras中自定义激活函数:
from keras import backend as K from keras.models import Sequential,Model from keras.layers import Dense import numpy as np def Swish(x): return x*K.sigmoid(1.0*x) model = Sequential() model.add(Dense(32,activation="relu",input_dim=100)) model.add(Dense(16,activation="relu",name="Dense_1")) model.add(Dense(1, activation=Swish,name="Dense_2"))
model.compile(optimizer='rmsprop',loss='binary_crossentropy',metrics=['accuracy']) #假设训练和测试使用同一组数据 data = np.random.random((1000, 100)) labels = np.random.randint(2, size=(1000, 1)) model.fit(data,labels,epochs=10,batch_size=32) model.predict(data)