人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新)
tensorflow 2.0 画出model网络模型的拓扑图
tensorflow 2.0 的回调函数callbacks(TensorBoard、ModelCheckpoint)
TensorBoard视觉化网络每层权重分布、视觉化网络层结构
MSE(均方误差)、MAE(平均绝对误差)
from_logits
CE(Cross-Entropy)、BCE(Binary Cross-Entropy 即Sigmoid+CE)、CCE(Categorical Cross-Entropy 即Softmax+CE)
对连续值/离散值进行预处理的两种方式(标准化/one-hot化)、反标准化/逆标准化、字符串预处理
损失函数loss、指标函数metrics
激活函数 Sigmoid、Tanh、ReLU、Softmax
Batch Normalization
反向传播、梯度下降、学习率、优化器optimizers(GD、SGD、Momentum、AdaGrad、Adam)
权重初始化对于激活函数的选择:随机常态分布/随机正态分布初始化(标准差为0.01或1)、Xavier(Glorot)初始化、He初始化
图像增强(IA)、数据预处理
混淆矩阵tf.math.confusion_matrix
使用预训练网络训练的两种方式:Keras Applications、TensorFlow Hub
import tensorflow as tf
help(tf.losses.categorical_crossentropy)
查看categorical_crossentropy函数的默认参数列表和使用方法介绍
其中形参默认为from_logits=False,网络预测值y_pred 表示必须为经过了 Softmax函数的输出值。
当 from_logits 设置为 True 时,网络预测值y_pred 表示必须为还没经过 Softmax 函数的变量 z。
from_logits=True 标志位将softmax激活函数实现在损失函数中,便不需要手动添加softmax损失函数,提升数值计算稳定性。
from_logits 指的就是是否有经过Logistic函数,常见的Logistic函数包括Sigmoid、Softmax函数。
Help on function categorical_crossentropy in module tensorflow.python.keras.losses:
categorical_crossentropy(y_true, y_pred, from_logits=False, label_smoothing=0)
Computes the categorical crossentropy loss.
Args:
y_true: tensor of true targets.
y_pred: tensor of predicted targets.
from_logits: Whether `y_pred` is expected to be a logits tensor. By default,
we assume that `y_pred` encodes a probability distribution.
1.BCE(Binary Cross-Entropy 实际即Sigmoid激活+CE)
1.import tensorflow as tf
help(tf.losses.binary_crossentropy)
打印信息如下 binary_crossentropy(y_true, y_pred, from_logits=False, label_smoothing=0)
2.from tensorflow import keras
help(keras.losses.BinaryCrossentropy())
打印信息如下 class BinaryCrossentropy(LossFunctionWrapper)
BinaryCrossentropy(from_logits=False, label_smoothing=0, reduction='auto', name='binary_crossentropy')
2.CCE(Categorical Cross-Entropy 实际即Softmax激活+CE)
1.import tensorflow as tf
help(tf.losses.categorical_crossentropy)
打印信息如下 categorical_crossentropy(y_true, y_pred, from_logits=False, label_smoothing=0)
2.from tensorflow import keras
help(keras.losses.CategoricalCrossentropy())
打印信息如下 class CategoricalCrossentropy(LossFunctionWrapper)
CategoricalCrossentropy(from_logits=False, label_smoothing=0, reduction='auto', name='categorical_crossentropy')
3.不论是BCE(Binary Cross-Entropy)还是CCE(Categorical Cross-Entropy),其中的from_logits参数都默认为False。
from_logits=False:BCE(Binary Cross-Entropy)损失函数不会内建Sigmoid激活函数运算,CCE(Categorical Cross-Entropy)损失函数不会内建Softmax激活函数运算。
from_logits=True:BCE(Binary Cross-Entropy)损失函数内建了Sigmoid激活函数运算,CCE(Categorical Cross-Entropy)损失函数内建了Softmax激活函数运算。
如果使用默认的from_logits=False,则网络输出层需要加上Sigmoid/Softmax激活函数运算。
如果使用 from_logits=True,则网络输出层无需加上Sigmoid/Softmax激活函数运算,因为要避免输出连续做两次Sigmoid/Softmax激活函数运算。
4.例子:网络输出层没有使用Sigmoid激活函数,便可以设置from_logits=True,在BCE(BinaryCrossentropy)中自动内建Sigmoid激活函数
model.compile(keras.optimizers.Adam(0.001),
loss=keras.losses.BinaryCrossentropy(from_logits=True),
metrics=[keras.metrics.BinaryAccuracy()])
5.例子:网络输出层没有使用Softmax激活函数,便可以设置from_logits=True,在CCE(CategoricalCrossentropy)中自动内建Softmax激活函数
model.compile(keras.optimizers.Adam(0.001),
loss=keras.losses.CategoricalCrossentropy(from_logits=True),
metrics=[keras.metrics.CategoricalAccuracy()])
1.tensorflow中经常看到logits,指的就是Logistic(注意逻辑回归Logistic Regression指的是分类问题,并非是指回归问题,而回归问题是预测一个连续的数值)。
而from_logits指的就是是否有经过Logistic函数,常见的Logistic函数包括Sigmoid、Softmax函数。
2.逻辑回归Logistic Regression指的是分类问题,并非是指回归问题,而回归问题是预测一个连续的数值。
回归问题一般使用MSE作为损失函数,二分类的分类问题一般使用BCE(Binary Cross-Entropy)作为损失函数,
多分类的分类问题一般使用CCE(Categorical Cross-Entropy)作为损失函数,BCE和CCE两者的公式上有些不同,但本质都是一样,都可以使用CE作为统称。
分类问题中的模型预测输出一般都会首先经过Sigmoid或Softmax激活函数。
3.常见的激活函数包括Sigmoid、Tanh、ReLU、Softmax。
ReLU 一般可用在每个隐藏层或输出层的后面作为非线性输出。
Sigmoid和Tanh如果作为神经网络中的隐藏层的激活函数的话,都有可能造成梯度消失的问题,所以隐藏层的激活函数一般推荐使用ReLU,不推荐使用Sigmoid和Tanh。
Sigmoid一般只用在输出层中,而不能用在隐藏层中,因为网络层数太深时使用Sigmoid作为隐藏层的非线性输出的话容易导致梯度消失,使得网络难以更新,
而ReLU 则能有效避免梯度消失问题,Softmax也一般用在输出层中。
比如二分类的逻辑回归模型中的输出层末尾一般都加上Sigmoid,那么输出值将介于0到1之间,分别代表两个不同分类。
比如多分类的逻辑回归模型中的输出层末尾一般都加上Softmax,那么全部输出值的总和将等于1,代表了所有不同分类的概率值的总和等于1。
下面举例在反向传播中经过多个隐藏层的Sigmoid,首先因为Sigmoid的导函数最大值为f(0)=0.25,也就是说当反向传播中每经过一层隐藏层的Sigmoid时,
其梯度值都要乘上0.25,代表每经过一次其梯度值就要被衰减0.25倍,如果反向传播中需要经过五层隐藏层的Sigmoid的话,那么其梯度值一共至少会被衰减0.25的5次方的倍数。
那么将造成神经网络前面的几层的权重将很难被更新,同理Tanh也存在类似的状况,因此大多数的隐藏层的激活函数都使用ReLU,
另外ReLU的计算速度也比Sigmoid和Tanh还要快上许多。
# 损失基本计算方法为稀疏类别交叉熵损失
# from_logits=True代表是否将预测结果预期为非 0/1 的值进行保留
# 理论来讲二分类最终的结果应该只有0/1,函数将自动将其变为0/1,from_logits=True后,值不会被改变
# reduction='none',接下来我们将自定义损失函数,reduction必须设置为None,
# 我们可以将它看作是自定义损失函数的识别属性
loss_object = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True, reduction='none')
"""
tf.keras.losses.SparseCategoricalCrossentropy(
from_logits=False, reduction=losses_utils.ReductionV2.AUTO,
name='sparse_categorical_crossentropy'
)
from_logits:
y_pred是否预期为对数张量。 默认情况下,我们假设y_pred编码概率分布。
注意:使用from_logits = True可能在数值上更稳定。
import tensorflow as tf
help(tf.losses.categorical_crossentropy)
查看categorical_crossentropy函数的默认参数列表和使用方法介绍
其中形参默认为from_logits=False,网络预测值y_pred 表示必须为经过了 Softmax函数的输出值。
当 from_logits 设置为 True 时,网络预测值y_pred 表示必须为还没经过 Softmax 函数的变量 z。
from_logits=True 标志位将softmax激活函数实现在损失函数中,便不需要手动添加softmax损失函数,提升数值计算稳定性。
from_logits 指的就是是否有经过Logistic函数,常见的Logistic函数包括Sigmoid、Softmax函数。
reduction:
(可选的)
tf.keras.losses.reduction的类型,适用于损失。 默认值为自动。 AUTO表示减少选项将由使用情况决定。
在几乎所有情况下,该默认值均为SUM_OVER_BATCH_SIZE。
与tf.distribute.Strategy一起使用时,在诸如tf.keras之类的内置训练循环之外,使用AUTO或SUM_OVER_BATCH_SIZE会引发错误。
1.reduction='none':
默认值为losses_utils.ReductionV2.AUTO,即默认使用SUM_OVER_BATCH_SIZE的方式计算批量样本个数的loss的sum总和返回一个总和值。
设置'none'代表将自定义损失函数,即自定义损失函数的识别属性,代表每个样本的loss均保留返回。
2.reduction='none'
打印loss为 Tensor("sparse_categorical_crossentropy_4/weighted_loss/Mul:0", shape=(64,), dtype=float32)
shape=(64,) 代表每个样本的loss均保留返回。
3.reduction=默认值losses_utils.ReductionV2.AUTO
打印loss为 Tensor("sparse_categorical_crossentropy_7/weighted_loss/value:0", shape=(), dtype=float32)
shape=() 代表默认使用SUM_OVER_BATCH_SIZE的方式计算批量样本个数的loss的sum总和,那么返回的loss只有一个总和值。
"""
SparseCategoricalCrossentropy
1.loss_object = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True, reduction='none')
SparseCategoricalCrossentropy稀疏类别交叉熵损失,自动将其中一方不是one-hot表示的数据转换为one-hot表示。
from_logits=True:softmax激活函数实现在损失函数中,便不需要手动添加softmax损失函数
reduction='none':
默认值为losses_utils.ReductionV2.AUTO,即默认使用SUM_OVER_BATCH_SIZE的方式计算批量样本个数的loss的sum总和返回一个总和值。
设置'none'代表将自定义损失函数,即自定义损失函数的识别属性,代表每个样本的loss均保留返回。
2.reduction='none'
打印loss为 Tensor("sparse_categorical_crossentropy_4/weighted_loss/Mul:0", shape=(64,), dtype=float32)
shape=(64,) 代表每个样本的loss均保留返回。
3.reduction=默认值losses_utils.ReductionV2.AUTO
打印loss为 Tensor("sparse_categorical_crossentropy_7/weighted_loss/value:0", shape=(), dtype=float32)
shape=() 代表默认使用SUM_OVER_BATCH_SIZE的方式计算批量样本个数的loss的sum总和,那么返回的loss只有一个总和值。