我认为这篇文章写得不错:https://blog.csdn.net/qq_18603599/article/details/80595905
一、激活函数
1、常见激活函数:
【1】
图像:
上图的这个函数很明显就能看出来很适合做二分类问题,1代表一类,0代表另一类,没什么好解释的。
【2】
图像:
这个函数比较常见,从上图中可以看到,当样本数据被归纳到1和-1以外的区间时,函数梯度开始变得平缓,这时学习率不管怎么变化,准确率也不会有所提升,因为激活函数已经达到了一种饱和状态,所以,做数据预处理时,最好把数据归纳到(-1,1)之间,避免出现这种情况的发生。
梯度图像:
可以看到(-1,1)之外的图像梯度几乎为0,梯度流都没有了,训练怎么可能成功?所以,样本的区间处理很重要。
【3】
图像:
这个函数与sigmod函数类似,最好把样本区间归纳到(-1,1)之间。
2、更多激活函数
【1】ReLu激活函数
图像:
ReLu激活函数在(0,+∞)上一直在增长,不会趋于平缓,但是,在(-∞,0]时,却永远只能为0,这已经不是趋于平缓了,而是完全的不动了,所以,如果激活函数的输出值小于或等于0,训练就已经进行不下去了,所以这就是它的缺点,研究表明,如果使用这种激活函数,有20%的神经元会被剔除。它也被叫做“死亡ReLu”
【2】Leaky ReLu
图像:
它在ReLu上做了一点点小小的修改,把小于0的部分开了一个夹角,如上图所示。它的相比于ReLu有如下优点:
(不会死亡是指网络可以一直训练下去,不会停止,除非人工设置阈值)
【3】smooth ReLu
图像:
这个函数也很好理解,它的梯度一直在变化,不会达到饱和状态,因此也是不错的选择。
二、损失函数
(1)L1损失
(2)L2损失
(3)交叉熵损失
(4)Softmax损失
1、L1损失
L1损失就是真实值与预测值之间的差值,然后取绝对值,即:loss_L1=|y-y’|,当然了,这只是单个数据,如果是一个矩阵的话,则:loss_L1=1/n*∑ | yi - yi^ |
比如我们用一串代码来写一下:
y = np.linspace(-1., 1., 100) # [-1,1]之间平均找100个点,这里替代真实值
y_ = 2
# L1损失
loss_L1=np.abs(tf.subtract(y,y_))# 结果应该在[1,3]
sess=tf.Session()
print(sess.run(loss_L1))
结果:
因为有100个真实值点,所以,这里取平均损失:
import tensorflow as tf
import numpy as np
y = np.linspace(-1., 1., 100) # [-1,1]之间平均找100个点,这里替代真实值
y_ = 2
# L1损失
loss_L1=np.abs(tf.subtract(y,y_))# 结果应该在[1,3]
loss_L1=tf.reduce_mean(loss_L1)
sess=tf.Session()
print(sess.run(loss_L1))
结果:
2、L2损失
L2损失就是真实值与预测值之间的差值,然后平方,即:loss_L2=(y-y’)^2,同样,如果是一个矩阵的话,则:loss_L2=1/n*∑ (yi - yi^ )^2
同理:
import tensorflow as tf
import numpy as np
y = np.linspace(-1., 1., 100) # [-1,1]之间平均找100个点,这里替代真实值
y_ = 2
# L1损失
loss_L1=np.abs(tf.subtract(y,y_))# 结果应该在[1,3]
loss_L1=tf.reduce_mean(loss_L1)
# L2损失
loss_L2=tf.square((tf.subtract(y,y_)))
loss_L2=tf.reduce_mean(loss_L2)
sess=tf.Session()
print(sess.run(loss_L2))
结果:
3、交叉熵损失函数
在tensorflow中,有这一条语句tf.nn.sigmoid_cross_entropy_with_logits()
,这条代码代表交叉熵损失函数,如果我们进入这条代码中查看的话,可以看到一条数学公式:
z * -log(sigmoid(x)) + (1 - z) * -log(1 - sigmoid(x))
我们不调用封装好的API,直接用公式写试试看:
cross_loss=tf.add(tf.multiply(y_,-tf.log(tf.sigmoid(y))),tf.multiply((1-y_),-tf.log(1-tf.sigmoid(y))))
cross_loss=tf.reduce_mean(cross_loss)
print(sess.run(cross_loss))
运行结果:
4、Softmax损失函数
tensorflow中也集成了Softmax损失函数:
# softmax损失函数
label=tf.constant([3,4,5],dtype=tf.float32)
logit=tf.constant([0.3,0.05,0.55])
softmax_loss=tf.nn.softmax_cross_entropy_with_logits_v2(labels=label,logits=logit)
print(sess.run(softmax_loss))
运行结果:
贴上所有代码:
import tensorflow as tf
import numpy as np
y = np.linspace(-1., 1., 100,dtype=np.float32) # [-1,1]之间平均找100个点,这里替代真实值
y_ = tf.constant(2.0,dtype=tf.float32)
# L1损失
loss_L1=np.abs(tf.subtract(y,y_))# 结果应该在[1,3]
loss_L1=tf.reduce_mean(loss_L1)
# L2损失
loss_L2=tf.square((tf.subtract(y,y_)))
loss_L2=tf.reduce_mean(loss_L2)
sess=tf.Session()
# print(sess.run(loss_L2))
# 交叉熵损失函数
# z * -log(sigmoid(x)) + (1 - z) * -log(1 - sigmoid(x))
cross_loss=tf.add(tf.multiply(y_,-tf.log(tf.sigmoid(y))),tf.multiply((1-y_),-tf.log(1-tf.sigmoid(y))))
cross_loss=tf.reduce_mean(cross_loss)
# print(sess.run(cross_loss))
# softmax损失函数
label=tf.constant([3,4,5],dtype=tf.float32)
logit=tf.constant([0.3,0.05,0.55])
softmax_loss=tf.nn.softmax_cross_entropy_with_logits_v2(labels=label,logits=logit)
print(sess.run(softmax_loss))