TensorFlow-深度学习-09-激活与损失函数

我认为这篇文章写得不错: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))

发布了88 篇原创文章 · 获赞 39 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/Daker_Huang/article/details/88693911