吴恩达机器学习课程笔记_Course2_Week2_1

本文介绍了吴恩达机器学习课程的第二周内容,涵盖在TensorFlow中训练神经网络、各种激活函数(如sigmoid、ReLU和线性)的应用,多类分类(包括softmax、分类交叉熵损失函数)以及Adam优化器的使用。重点讨论了神经网络训练步骤和不同激活函数的选择原则。
摘要由CSDN通过智能技术生成

仅做个人学习使用

课程内容

内容简介

本周您将学习如何在 TensorFlow 中训练模型,还将了解其他重要的激活函数(除 sigmoid 函数外),以及在神经网络中使用每种激活函数的位置。您还将学习如何从二元分类转向多类分类(3 个或更多类别)。多分类将向你介绍新的激活函数和新的损失函数。您还可以选择学习多分类和多标签分类之间的区别。您还将了解 Adam 优化器,以及为什么它是对普通梯度下降神经网络训练的一种改进。最后,您还将简要了解到目前为止所见过的层类型之外的其他层类型。

学习目标

  1. 使用 TensorFlow 在数据上训练神经网络
  2. 了解各种激活函数(sigmoid、ReLU 和线性)之间的区别
  3. 了解哪种激活函数适用于哪种类型的层
  4. 了解为什么需要非线性激活函数
  5. 了解多类分类计算实现多类分类的 softmax 激活
  6. 使用分类交叉熵损失函数进行多类分类
  7. 使用推荐的方法在代码中实现多类分类
  8. (可选): 解释多标签分类和多类分类的区别

神经网络训练

神经网络训练分为三个步骤
1.定义模型
2.定义损失函数
3.训练模型
图片来源于Coursera课程截图 侵权删

激活函数

在之前课程的模型中,总是在使用逻辑回归来建立模型,激活函数则使用sigmoid,其实还存在其他类型的激活函数,不同类型的激活函数有着不同的使用场景。
本节课程涉及的激活函数主要有三种类型:
9. 线性激活函数(linear function):此类激活函数适用于结果有正有负的情况,不过使用线性激活函数的情况下一般默认为没有使用激活函数。因为线性激活函数用了等于没用:线性函数的线性函数还是线性函数,并不会带来什么改变。使用了线性激活函数的神经网络相当于一个线性回归函数。
10. sigmoid函数(Rectified Linear Unit:此类激活函数适用于二元分类的神经网络。
11. ReLU函数:是中间层最常用的激活函数,因为计算速度快。ReLU方程十分简单,z和0,谁大就输出谁。ReLU成为中间层最常用的激活函数的原因有二:(1)它结构简单,所以计算也简单;(2)它只有左边是平的,所以收敛速度快。
图片来源于Coursera课程截图 侵权删
其实还存在其他类型的激活函数,每隔几年学者就会提出新的十分有趣的激活函数,例如tan h激活函数、LeakyRelu激活函数,但是对于大部分简单应用机器学习的同学来说,使用ReLU激活函数就够用了。
ReLU是一种非线性激活函数,它可以良好的解决非线性问题,感兴趣的同学可以参考知乎的一篇文章。
链接: 谈谈神经网络中的非线性激活函数——ReLu函数

多分类问题

本节课程引入了我之前一直疑惑的一点:我以前用过的街景图象语义分割机器学习模型(实际上是多标签分类问题)用的什么激活函数啊?它们一个物体有多种可能,并不是简单的二元分类问题,那么应该使用什么样的激活函数呢?本节课程给出的答案是:softmax。在正式介绍Softmax之前,需要先搞清楚什么叫二分类、多分类以及多标签分类。

二分类、多分类和多标签分类

  1. 二分类:表示分类任务中有两个类别,比如我们想识别一幅图片是不是猫。也就是说,训练一个分类器,输入一幅图片,用特征向量x表示,输出是不是猫,用y=0或1表示。二类分类是假设每个样本都被设置了一个且仅有一个标签0 或者 1。
  2. 多类分类(Multiclass classification): 表示分类任务中有多个类别, 比如对一堆水果图片分类,它们可能是橘子、苹果、梨等. 多类分类是假设每个样本都被设置了一个且仅有一个标签: 一个水果可以是苹果或者梨, 但是同时不可能是两者。
  3. 多标签分类(Multilabel classification): 给每个样本一系列的目标标签.可以想象成一个数据点的各属性不是相互排斥的(一个水果既是苹果又是梨就是相互排斥的), 比如一个文档相关的话题,一个文本可能被同时认为是宗教、政治、金融或者教育相关话题。
    具体内容可以参考:链接: 二分类、多分类和多标签分类

Softmax

最激动人心的时刻到了,接下来登场的就是softmax函数了,其公式较为简单,但理解起来也需要一定功夫。

Softmax公式

图片来源于Coursera课程截图 侵权删
非常重要的一点是:a(x)的合为1。
这个公式相当的有意思,Softmax的含义就在于不再唯一的确定某一个最大值,而是为每个输出分类的结果都赋予一个概率值,表示属于每个类别的可能性。Softmax函数有一个非常重要的特性,这也决定了它能够在神经网络中胜任:能够将差距大的数值距离拉的更大。通过w,b微小的改变就可以在最终结果上带来较大的差距,因此较为适合神经网络的训练。

Softmax成本函数函数

在这里需要强调损失函数与成本函数之间的区别,损失函数(Loss)是针对单个样本的,成本函数(Cost)则是针对整个样本集的。
图片来源于Coursera课程截图 侵权删
虽然我没有足够的数学水平与耐心看完Softmax损失函数的推导过程,但是用我仅有的高中数学知识也可以看出这个损失函数的精妙之处,aj越大L(a,y)越小,即概率越大,其损失函数值越小,这和损失函数的使用场景是相符合的。
J(w,b)则略显复杂,但你只需要记住,J(w,b)只计算与该样本对应的j值的损失函数值。例如在手写数字识别案例中,第3个样本的的损失函数值只计算-log(a2),0-n的其他函数值则被抛弃。这与模型训练是对应上的,模型只需要正确的结果嘛,错误的值需要被抛弃,这样才能训练出与正确结果对应的模型。
如果对于Softmax有着进一步的兴趣,可以参考:链接: 一文详解Softmax函数

Softmax函数的优化实现

这里也是我惊叹于这群人脑子聪明的地方之一。
由于二进制与十进制转换之间存在误差的问题,e-z这种计算方式会产生大量的小数,而计算机在运算过程中会进行适当的取舍。这也就意味着最终的计算结果本身就存在一定的误差。然而在传统的神经网络实现过程中,输出层使用了一次Softmax函数,存在一次误差,成本函数计算过程中又存在一次误差,这可能导致最终结果存在两次误差。为了削减这种误差,科学家们决定输出层不适用Softmax函数,仅使用线性激活函数,减少一次误差,在将成本函数和Softmax一同计算,减少误差。
以下是原始算法与优化算法在代码上的区别。

import numpy as np
import matplotlib.pyplot as plt
plt.style.use('./deeplearning.mplstyle')
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from IPython.display import display, Markdown, Latex
from sklearn.datasets import make_blobs
%matplotlib widget
from matplotlib.widgets import Slider
from lab_utils_common import dlc
from lab_utils_softmax import plt_softmax
import logging
logging.getLogger("tensorflow").setLevel(logging.ERROR)
tf.autograph.set_verbosity(0)
#原始算法
# make  dataset for example
centers = [[-5, 2], [-2, -2], [1, 2], [5, -2]]
X_train, y_train = make_blobs(n_samples=2000, centers=centers, cluster_std=1.0,random_state=30)

model = Sequential(
    [ 
        Dense(25, activation = 'relu'),
        Dense(15, activation = 'relu'),
        Dense(4, activation = 'softmax')    # < softmax activation here
    ]
)
model.compile(
    loss=tf.keras.losses.SparseCategoricalCrossentropy(),
    optimizer=tf.keras.optimizers.Adam(0.001),
)

model.fit(
    X_train,y_train,
    epochs=10
)
p_nonpreferred = model.predict(X_train)
print(p_nonpreferred [:2])
print("largest value", np.max(p_nonpreferred), "smallest value", np.min(p_nonpreferred))  
   
*******************************************************************************************

#优化算法
preferred_model = Sequential(
    [ 
        Dense(25, activation = 'relu'),
        Dense(15, activation = 'relu'),
        Dense(4, activation = 'linear')   #<-- Note
    ]
)
preferred_model.compile(
    loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),  #<-- Note
    optimizer=tf.keras.optimizers.Adam(0.001),
)

preferred_model.fit(
    X_train,y_train,
    epochs=10
)
p_preferred = preferred_model.predict(X_train)
print(f"two example output vectors:\n {p_preferred[:2]}")
print("largest value", np.max(p_preferred), "smallest value", np.min(p_preferred))

以上就是本次学习的内容,下次再见!

  • 37
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值