Tensorflow中的激活函数和分类函数

关于激活函数,我已经在一篇博客上讲解了它的常见种类和作用,详情点击激活函数。这篇博客一起来看下在tensorflow下的激活函数,并补充一些激活函数。顺提一下分类函数。

激活函数

激活函数的作用就是用来加入非线性因素的,以解决线性模型表达能力不足的缺陷。常用的激活函数有sigmoid,tanh,relu。

Sigmoid

sigmoid在tensorflow下的对应函数为:

tf.nn.sigmoid(x,name=None)。从sigmoid的图像来看,随着x趋近正负无穷大,y对应的值越来越接近1或-1,这种情况叫做饱和。处于饱和态的激活函数意味着,当x=100和x=1000时的反映都是一样的,这样的特性转换相当于将1000大于100十倍这个信息丢失了。

Tanh

tanh在tensorflow下的对应函数为:

tf.nn.tanh(x,name=None)。 x取值也是从正无穷到负无穷, 但其对应的y值变为-1~1之间, 相对于Sigmoid函数有更广的值域。 但同样也拥有饱和问题。

Relu

relu在tensorflow下的对应函数为:

tf.nn.relu(x,name=None)。该函数非常简单,大于0的留下,否则一律为0。relu函数运算简单,大大提升了机器的运行效率。还有tf.nn.relu6(x,name=None),这是以6为阈值的relu函数。与relu函数类似的还有softplus函数,二者的区别是:Softplus函数会更加平滑,但是计算量很大。

softplus的函数公式:f(x)=ln(1+ex)。在tensorflow中,Softplus函数对应的函数是tf.nn.softplus(x,name=None)

虽然ReLU函数在信号响应上有很多优势, 但这仅仅在正向传播方面。 由于其对负值的全部舍去, 因此很容易使模型输出全零从而无法再进行训练。 例如, 随机初始化的w加入值中有个值是负值, 其对应的正值输入值特征也就被全部屏蔽了, 同理, 对应负值输入值反而被激活了。 这显然不是我们想要的结果。 于是在基于ReLU的基础上又演化出了一些变种函数, 举例如下:

Noise relus:为max中的x加了一个高斯分布的噪声

Leaky relus:在relu的基础上,保留一部分负值,让x为负时乘a,a小于等于1。也就是Leaky relus对负信号不是一昧的拒绝,而是缩小。

在TensorFlow中, Leaky relus公式没有专门的函数, 不过可以利用现有函数组成而得到:

tf.maximum(x,leak*x,name=name) #leakl为传入的参数,可以设为0.01等。

Elus:当x小于0时,做了更复杂的变换。

在tensorflow中,Elus函数对应的函数,tf.nn.elu(x,name=None)

Swish

Swish函数是谷歌公司发现的一个效果更优于Relu的激活函数。

其中β为x的缩放参数,一般情况默认为1即可。在tensorflow的低版本中,没有单独的Swish函数,可以手动封装。

1
2
def Swish(x,beta=1):
return x*tf.nn.sigmoid(x*beta)

分类算法

对于上面讲的激活函数,其输出值只有两种(0、1,或-1、1,0、x),而现实生活中需要对某一问题进行某种分类,这时就需要使用softmax算法。

softmax

softmax, 就是如果判断输入属于某一个类的概率大于属于其他类的概率, 那么这个类对应的值就逼近于1, 其他类的值就逼近于0。 该算法的主要应用就是多分类, 而且是互斥的, 即只能属于其中的一个类。 与sigmoid类的激活函数不同的是, 一般的激活函数只能分两类,所以可以理解成Softmax是Sigmoid类的激活函数的扩展。

把所有值用e的n次方计算出来, 求和后算每个值占的比率, 保证总和为1。一般就可以认为softmax得出的就是概率。

举个例子, 训练的模型可能推测一张包含9的图片代表数字9的概率是80%, 但是判断它是8的概率是5%(因为8和9都有上半部分相似的小圆) ,判断它代表其他数字的概率值更小。 于是取最大 概率的对应数值, 就是这个图片的分类了。 这是一个softmax回归。

常用的分类函数

----本文结束,感谢您的阅读。如有错,请指正。----
大哥大嫂过年好!支持我一下呗
0%