各位同学好,今天和大家介绍一下TensorFlow2.0中的梯度下降、激活函数及其梯度、损失函数及其梯度。

(1) 梯度计算:GradientTape(),tape.watch(),tape.gradient()

(2) 损失函数及其梯度:MSE:tf.reduce_mean(tf.losses.MSE()),交叉熵:tf.losses.categorical_crossentropy()


1. 梯度下降

1.1 自动求导函数:

GradientTape(persistent=False, watch_accessed_variables=True)

persistent: 布尔值,用来指定新创建的gradient tape是否是可持续性的。默认是False,意味着只能够调用一次GradientTape()函数。

watch_accessed_variables: 布尔值,表明GradientTape()函数是否会自动追踪任何能被训练的变量。默认是True。要是为False的话,意味着你需要手动去指定你想追踪的那些变量。

1.2 监视非Variable变量

tape.watch(tensor)

tape.watch()用于跟踪指定的tensor变量。由于GradientTape()默认只对tf.Variable类型的变量进行监控。如果需要监控的变量是tensor类型,则需要tape.watch()来监控,若是没有watch函数则梯度计算结果会是None。  如果指定跟踪的是tf.Variable类型,这一句就不用写了。

1.3 梯度计算

tape.gradient(target, sources, unconnected_gradients)

根据指定监视的变量来计算梯度

target: 求导的因变量

sources: 求导的自变量

unconnected_gradients: 无法求导时,返回的值,有两个可选值[none, zero],默认none。


import tensorflow as tf
w = tf.constant(1.) # 创建全连接层
x = tf.constant(2.) # 创建输入特征
# 自动求导
with tf.GradientTape() as tape:tape.watch([w]) # 监视wy = x*w
# 计算梯度,因变量y,自变量w
grad1 = tape.gradient(y,[w])
# 结果为: [<tf.Tensor: shape=(), dtype=float32, numpy=2.0>]

创建的权重w是tensor类型,需要tape.watch()函数,如果改成w = tf.Variable(tf.constant(1.)),将w变成Variable类型,就不需要tape.watch()函数来监视w。y=x*w,y对w求导结果为x,即为2.0。


3. 损失函数及其梯度

3.1 均方误差MSE

计算公式: 

y代表训练集的真实值,pred代表训练输出的预测结果,N通常指的是batch_size,也有时候是指特征属性个数。

MSE函数表示:

(1) tf.reduce_mean(tf.square(y - pred))

(2) tf.reduce_mean(tf.losses.MSE(y, pred))

一般而言,均方误差损失函数比较适用于回归问题中,对于分类问题,特别是目标输出为One-hot向量的分类任务中,交叉熵损失函数要合适的多。


import tensorflow as tf
# 设有一组训练集的目标值
y = tf.constant([1,2,3,0,2])
y = tf.one_hot(y, depth=4) # 目标为四种分类
y = tf.cast(y,dtype=tf.float32)
# 设有一组模型输出的预测结果数据
out = tf.random.normal([5,4])
# 三种方法计算,预测结果out和真实值y之间的损失MSE
loss1 = tf.reduce_mean(tf.square(y-out))  # 1.2804947
loss2 = tf.square(tf.norm(y-out))/(5*4) # 1.2804947  #二范数方法
loss3 = tf.reduce_mean(tf.losses.MSE(y,out)) # 1.2804947
# 返回shape为[b]的tensor

3.2 MSE的梯度

使用tf.reduce_mean(tf.losses.MSE())计算真实值和预测结果的均方差,需要对真实值y进行one-hot编码tf.one_hot(),对应索引位置的值为1,分成三个类别depth=3。prob输出的也是图片属于三种分类的概率。使用tape.gradient()函数对跟踪的变量求梯度,grads[0]因变量为loss,自变量为w。

import tensorflow as tf
#(1)均方差MSE
x = tf.random.normal([2,4]) # 创建输入层,2张图片,各有4个特征
w = tf.random.normal([4,3]) #一层全连接层,输出每张图片属于3个分类的结果
b = tf.zeros([3]) # 三个偏置
y = tf.constant([2,0]) # 真实值,第一个样本属于2类别,第2个样本属于0类别
#梯度计算
with tf.GradientTape() as tape:tape.watch([w,b]) # 指定观测w和b,如果w和b时variable类型,就不需要watch了prob = tf.nn.softmax(x@w+b, axis=1) #将实数转为概率,得到属于3个节点的概率# 计算两个样本损失函数的均方差loss = tf.reduce_mean(tf.losses.MSE(tf.one_hot(y,depth=3),prob))
# 求梯度
grads = tape.gradient(loss,[w,b])
grads[0] # loss对w的梯度
grads[1] # loss对b的梯度

3.3 交叉熵

交叉熵(Cross Entropy)主要用于度量两个概率分布间的差异性信息,交叉熵越小,两者之间差异越小,当交叉熵等于0时达到最佳状态,也即是预测值与真实值完全吻合。

公式为: 

式中,p(x)是真实分布的概率,q(x)是模型输出的预测概率。log的底数为2。

(1) 多分类问题交叉熵

tf.losses.categorical_crossentropy(y_true, y_pred, from_logits=False)

y_true: 真实值,需要one-hot编码

y_pred: 预测值,模型输出结果

from_logits: 为True时,会使用softmax函数将y_pred从实数转化为概率值,通常情况下用True结果更稳定

# 多分类
# 真实值和预测概率,预测结果均匀,交叉熵1.38很大
tf.losses.categorical_crossentropy([0,1,0,0],[0.25,0.25,0.25,0.25])
# 预测错了,交叉熵2.3
tf.losses.categorical_crossentropy([0,1,0,0],[0.1,0.1,0.7,0.1])
# 预测对了,交叉熵为0.35
tf.losses.categorical_crossentropy([0,1,0,0],[0.1,0.7,0.1,0.1])

(2) 二分类问题交叉熵

tf.losses.binary_crossentropy()

参数见:TF2.0—tf.keras.losses.BinaryCrossentropy_哎呦-_-不错的博客-CSDN博客

# 二分类
# 预测对了,0.1
tf.losses.binary_crossentropy([1,0],[0.9,0.1])
# 预测错了,2.3
tf.losses.categorical_crossentropy([1,0],[0.1,0.9])

(3) logits层直接计算交叉熵

模型的输出结果可能不是概率形式,通过softmax函数转换为概率形式,然后计算交叉熵,但有时候会出现数据不稳定的情况,即输出结果是NAN或者inf。

这种情况下可以通过logits层直接计算交叉熵,不过要给categorical_crossentropy()方法传递一个from_logits=True参数。

# 计算网络损失时,一定要加数值稳定处理参数from_logits=True,防止softmax和crossentropy之间的数值不稳定
import tensorflow as tf
x = tf.random.normal([1,784]) # 1张图片784个特征
w = tf.random.normal([784,2]) # 全连接层,分为2类
b = tf.zeros([2]) # 2个偏置logits = x@w + b # 计算logits层# 不推荐使用下面这种,会出现数值不稳定
# 输出结果映射到0-1,且概率和为1,(这一步由from_logits=True代替)
# prob = tf.math.softmax(logits,axis=1)
# tf.losses.categorical_crossentropy([[0,1]],prob)# 计算交叉熵,一定要对y_true进行onehot编码
tf.losses.categorical_crossentropy([[0,1]],logits,from_logits=True)

3.4 交叉熵的梯度

损失函数为计算交叉熵的平均值,一定要对训练集真实值y_true进行one-hot编码,分三类,tf.one_hot(y,depth=3),跟踪权重w和偏置b,grads[0]为以loss为因变量,w为自变量计算梯度。grads[1]为以loss为因变量,b为自变量计算梯度

#(2)交叉熵cross entropy
# softmax,使logits数值最大的所在的所有作为预测结果的label
x = tf.random.normal([2,4]) # 输入层,2张图片,4个特征
w = tf.random.normal([4,3]) # 一层全连接层,输出三个分类
b = tf.zeros([3]) # 三个偏置
y = tf.constant([2,0]) # 第一个样本属于2类别,第2个样本属于0类别
# 梯度计算
with tf.GradientTape() as tape:tape.watch([w,b]) # 跟踪w和b的梯度logits = x @ w + b # 计算logits层# 计算损失,不要先softmax再使用交叉熵,会导致数据不稳定,categorical_crossentropy会自动执行softmax操作再计算损失loss = tf.reduce_mean(tf.losses.categorical_crossentropy(tf.one_hot(y,depth=3),logits,from_logits=True))
# 计算损失函数梯度
grads = tape.gradient(loss,[w,b])
grads[0] #shape为[4,3]
grads[1] #shape为[3]# 结果为grads[0]:
array([[ 0.05101332,  0.08121025, -0.13222364],[ 0.1871956 , -0.02524163, -0.16195397],[-1.6817021 ,  0.17055441,  1.5111479 ],[-0.08085182,  0.06344394,  0.01740783]], dtype=float32)>
# grads[1]:
<tf.Tensor: shape=(3,), dtype=float32, numpy=array([-0.12239906,  0.08427953,  0.03811949], dtype=float32)>

【深度学习】(4) 梯度下降、损失函数相关推荐

  1. 【深度学习】——梯度下降优化算法(批量梯度下降、随机梯度下降、小批量梯度下降、Momentum、Adam)

    目录 梯度 梯度下降 常用的梯度下降算法(BGD,SGD,MBGD) 梯度下降的详细算法 算法过程 批量梯度下降法(Batch Gradient Descent) 随机梯度下降法(Stochastic ...

  2. 深度学习-各类梯度下降优化算法回顾

    本文是根据 链接 进行的翻译,回顾了深度学习的各种梯度下降优化算法.*已获得原作者的翻译许可. 文章目录 一.概述 二.引言 三.Gradient Descent Variants(梯度下降法变体) ...

  3. 深度学习 Optimizer 梯度下降优化算法总结

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 来源:https://zhuanlan.zhihu.com/p/3 ...

  4. 【深度学习】梯度下降和反向传播

    声明:本博客只是小白博主自己的记录博客,仅供参考. 导数到底是什么? 引用知乎上的一个回答 那么导数的本质是什么?就是变化率呗,例如小王今年卖了100头猪,去年90头,前年80头,,,也就是说每年增加 ...

  5. [深度学习概念]·梯度下降原理讲解

    目录 梯度下降的场景假设 梯度下降 微分 梯度 梯度下降算法的数学解释 梯度下降算法的实例 单变量函数的梯度下降 多变量函数的梯度下降 梯度下降算法的实现 coding time 小结 Further ...

  6. 深度学习中梯度消失和梯度爆炸的根本原因及其缓解方法

    深度学习中梯度消失和梯度爆炸的根本原因及其缓解方法 一.梯度消失和爆炸的根本原因 1. 深层网络角度 2. 激活函数角度 二.梯度消失.爆炸的解决方案 1. 梯度剪切.正则 2. 采用其他的激活函数 ...

  7. 深度学习之梯度下降法

    深度学习之梯度下降法 代价函数 在一开始,我们会完全随机地初始化所有的权重和偏置值.可想而知,这个网络对于给定的训练示例,会表现得非常糟糕.例如输入一个3的图像,理想状态应该是输出层3这个点最亮. 可 ...

  8. yolo-mask的损失函数l包含三部分_【AI初识境】深度学习中常用的损失函数有哪些?...

    这是专栏<AI初识境>的第11篇文章.所谓初识,就是对相关技术有基本了解,掌握了基本的使用方法. 今天来说说深度学习中常见的损失函数(loss),覆盖分类,回归任务以及生成对抗网络,有了目 ...

  9. 「AI初识境」深度学习中常用的损失函数有哪些?

    https://www.toutiao.com/a6695152940425937411/ 这是专栏<AI初识境>的第11篇文章.所谓初识,就是对相关技术有基本了解,掌握了基本的使用方法. ...

  10. 【深度学习】梯度和方向导数概念解析(代码基于Pytorch实现)

    [深度学习]梯度和方向导数概念解析(代码基于Pytorch实现) 文章目录 1 方向导数 2 梯度 3 自动求导实现 4 梯度下降4.1 概述4.2 小批量梯度下降 5 总结 1 方向导数 方向导数的 ...

最新文章

  1. 给gridview添加上下移动功能
  2. php 爬虫_Scrapy 爬虫完整案例-基础篇
  3. (转)python中的*args和**kw到底是个啥。看下面的例子就会懂了
  4. 空调调节 java_空调调节方式
  5. IntelliJ IDEA 2019.1 windows找不到文件‘chrome’
  6. 在Linux下安装和使用MySQL(转)
  7. Web前端基础---JQuery的页面加载+选择器+电子时钟案例
  8. 手动实现apply、call、bind
  9. There has been an error processing your request[magento1.6]
  10. 南阳oj-----Binary String Matching(string)
  11. 2021-2027全球与中国DJ设备市场现状及未来发展趋势
  12. UnitedPlugins发布终极Bass效果器:QuickBass
  13. maxscript文件常规命令
  14. 生物医学工程实用在线工具
  15. 2021高考北京大峪中学成绩查询,2014年北京市各区高考成绩汇总
  16. faster-RCNN tensorflow-gpu环境配置及安装出现的问题
  17. 传统数据库辉煌不再,云数据库迎来黄金时代
  18. 服务器什么系统好用点,服务器用什么系统好
  19. [Windows] 微软错误代码
  20. 镁客网每周硬科技领域投融资汇总(12.24-12.30),未来医疗占比猛增,阿里两项亿级投资...

热门文章

  1. Value xxx of type org.json.JSONObject cannot be converted to JSONArray
  2. django-debug-toolbar使用指南
  3. LeetCode-198. 打家劫舍
  4. pyhton re模块
  5. PyTorch 笔记(09)— Tensor 线性代数计算(torch.trace、torch.diag、torch.mm、torch.dot、torch.inverse逆矩阵、转置)
  6. Spring Boot 集成Swagger2生成RESTful API文档
  7. 汇编寄存器(内存访问)基础知识之三---mov指令
  8. JSON http://www.cnblogs.com/haippy/archive/2012/05/20/2509329.html
  9. eclipse假死解决办法
  10. ccf 最优灌溉(prime模板)