Tensorflow入门_Udacity

Cha1: Hello World

基本术语

  • 人工智能:一种计算机科学分支,旨在让计算机达到人类的智慧。实现这一目标有很多方式,包括机器学习和深度学习。
  • 机器学习:一系列相关技术,用于训练计算机执行特定的任务。
  • 神经网络:一种机器学习结构,灵感来自人类大脑的神经元网络。神经网络是深度学习的基本概念。
  • 深度学习:机器学习的一个分支,利用多层神经网络实现目标。通常“机器学习”和“深度学习”可以相互指代。

基本术语的逻辑关系

机器学习算法应用

  • 游戏: AlphaGo- Google DeepMind团队
  • 医疗: 采用机器学习算法检测皮肤癌等,精度与人类专家相当
  • 自动驾驶:

Tensorflow

  • Tensorflow Lite: 可以在Android和iOS设备上创建移动应用
  • Tensorflow.js: 可以在网络浏览器中运行相应的应用
  • Tensorflow实现语言: Python, JavaScript, Swift, R, Julia等。但目前,Python和JavaScript是最完整的实现语言。
  • Tensorflow开发环境: 本课程采用python和Google的开发环境Colab(类似于Jupyter Notebook,Colab采用交互式Notebook进行Python开发,程序在Google Cloud上托管,因此不需要配置软件环境,仅需在网络浏览器上使用)

练习:Python和Colab初级知识

Cha2: 机器学习简介

Sebastian访谈

大佬告诉我们机器学习比计算机编程要简单,所以我们要相信大佬,大胆的去做吧,奥利给!

传统算法和机器学习算法区别

传统算法和机器学习算法区别

机器学习术语

  • 特征:模型的输入
  • 样本:用于训练流程的输入/输出对
  • 标签:模型的输出
  • 层级:神经网络中相互连接的节点集合。
  • 模型:神经网络的表示法
  • **密集全连接层 (FC)**:一个层级中的每个节点都与上个层级中的每个节点相连。
  • 权重和偏差:模型的内部变量
  • 损失:期望输出和真实输出之间的差值
  • MSE:均方误差,一种损失函数,它会将一小部分很大的差值视作比大量很小的差值更糟糕。
  • 梯度下降法:每次小幅调整内部变量,从而逐渐降低损失函数的算法。
  • 优化器:梯度下降法的一种具体实现方法。(有很多算法。在这门课程中,我们将仅使用“Adam”优化器,它是 ADAptive with Momentum 的简称,并且被视为最佳优化器。)
  • 学习速率:梯度下降过程中的损失改进“步长”。
  • 批次:在训练神经网络的过程中使用的一组样本。
  • 周期:完全经过整个训练数据集一轮
  • 前向传播:根据输入计算输出值
  • 反向传播:根据优化器算法计算内部变量的调整幅度,从输出层级开始,并往回计算每个层级,直到抵达输入层。

练习:摄氏度转化为华氏温度

密集层 (Dense Layer)

密集层也叫全连接层,即一个层级的每一个节点都与上一个层级的所有节点相连。

全连接层

上图的全连接层在Tensorflow中可以用以下代码实现:

1
2
3
hidden = keras.layers.Dense(units=2, input_shape=[3])
output = keras.layers.Dense(units=1)
model = tf.keras.Sequential([hidden, output])

训练的流程是指讲权重和偏差调整为最佳值,使模型能够将输入和输出相匹配。但训练过程只改变w和b,并不改变模型,即下图中的数学公式。(w: 权重 b: 偏差)
密集层中的数学运算

Cha3: 首个模型 - Fashion MNIST

Sebastian访谈

问: 未来十年内,哪些前沿性科技和挑战对深度学习的影响最大?未来最重要的挑战是什么?
答: 其一通用人工智能,其二贴合市场

Fashion MNIST

Fashion MNIST是一个数据集,该数据集由28*28像素的灰度服饰图像组成,共70000张图像,下图是其所包含的所有服饰标签的完整列表:
Fashion MNIST dataset

神经网络

相关术语:

  • 扁平化:将二维图像转换为一维向量的过程
  • ReLU:一种激活函数,使模型能够解决非线性问题
  • Softmax:一种函数,能够为每个潜在输出类别生成概率
  • 分类:一种机器学习模型,用于区分两个或多个输出类别

** ReLU函数(修正线性单元)**
ReLU 是一种激活函数。激活函数有好几种,例如 ReLU、Sigmoid、双曲正切、ELU,但是 ReLU 是最常用的激活函数,通常默认都设为 ReLU。该函数如下图所示,其特性为:如果输入是附属或0,则函数输出为0, 如果输入是正数, 那么输出将等于输入。ReLU使网络能够解决非线性问题,在实际问题中,其大多都为非线性问题。在这种情况下,向密集层添加ReLU有助于解决问题。扩展阅读

ReLU函数

本章节的神经网络模型如下图所示:
该章节神经网络模型

**Input image:**上面提到,Fashion MNIST数据集中的图像大小均为28 * 28 = 784像素,并且神经网络的输入必须是向量,因此需要将图像转化为以为数组,该过程即为扁平化,其实现代码为: tf.keras.layers.Flatten(input_shape=(28,28,1))
密集层:输入将和密集层完全连接,该密集层共128个单元,在这里需要激活函数,其实现代码为:
输出层:输出层共有10个单元,因为该数据集总共有10个类别,在这里每张图片的预测结果应为图像在每个类别中的概率大小,其和为1。(对于任何一个分类神经网络,最后都会添加一个密集层,其包含的单元数量和类别数量一样,并且始终会添加softmax语句)

训练和测试

数据集通常会划分为不同的子集,如训练集测试集,用于训练神经网络和测试神经网络的最终效果。通过测试数据集,我们可以使用网络从未见过的数据测试网络。这样我们便能检测模型的泛化程度,即泛化到训练期间未见过的数据的效果,而不是仅仅记住训练样本。同样,我们通常会使用验证数据集。此类数据集不用于训练,而是在训练期间用于测试模型。我们在一定的训练步数之后使用验证集,判断训练进展如何。例如,如果在训练过程中损失降低了,但是验证集的准确率下降了,则表明模型在记住测试集。训练完毕时,也会使用验证集衡量模型的最终准确率。 扩展阅读:Google 机器学习速成课程的训练和测试集部分
当有一个很大的数据集合,一部分用于训练一部分用于测试,测试集的选择需要注意随机化处理,一般训练集越大,训练出的模型越精确,测试集越大,对评估指标的信心越充足,置信区间就越窄。 如果数据集规模比较大,则取其10% ~ 15%就可以得到良好的验证效果,如果数据集比较小,则验证阶段就需要交叉验证等复杂操作。典型陷阱:不要将用于测试的集合同时用于训练,这样会得出非常优秀的结果(如测试准确率100%)。

Code总结

  • epochs: epochs的参数对模型的精度有直接的影响,周期数过小,模型欠拟合,精度不够。周期数过大,模型过拟合,在训练集精度很高,在测试集上训练精度很低.
  • 密集层神经元数量: 神经元过少会明显减小检测的精度,总体上来说,神经元增加会增加会提升精度(根据源码中的练习得出的不完全实验结论)
  • 增加网络层数
  • 玄学: 官方教程的源码和我的源码的结果差别很大,其一在于同样的参数我的模型最终精度会比课程给的源码的精度低一些。关键我还是按照官方给的代码手打的,而且课程给的参考源码有明显错误,比如模型的输出层没有使用softmax。

个人练习: https://colab.research.google.com/drive/1ItgEKIIG55Mc11dpgTQFLMJ-cvMmSnNX#scrollTo=z4Ji8sEmR4YH
课程源码: https://colab.research.google.com/drive/1RV1-alG87M8JWnMU0NaytOGHsieRq9-I#scrollTo=9ODch-OFCaW4

本章总结

机器学习的需要解决的问题主要由两个类别:递归问题和分类问题

  • Regression: 输出一个值的模型。例如,估算房屋价值。
  • Classfication: 一种模型,能够输出多个类别的概率分布。例如在 Fashion MNIST 模型中,输出是 10 个概率,每种服饰对应一个概率。我们在最后的密集层中使用 Softmax 激活函数创建了这个概率分布。

回归和分类的比较#

Cha4: CNN

Sebastian访谈

问:CNN特点
答:具有不变性,结构重复性,CNN的流行不是由于算法的变革,而是大数据
问:未来应用领域
答:图像,语言领域

CNN简介

卷积神经网络两个最重要的概念就是卷积(Convolutions)和最大池化(MaxPooling)
卷积: 卷积的运算如下图所示,简单来说就是窗口中的每个pixel的值与卷积核中相应位置的核素相乘,最后将所有的值相加放在居中位置。在这里涉及到边缘像素处理问题,有两种处理方式,其一是将边缘的像素舍弃,但这会造成信息丢失问题;其二是将原图像边缘补0,然后再进行卷积运算。
卷积运算示例
边缘像素处理
最大池化: 最大池化是指通过总结区域减小输入图像大小的流程,如下图所示,最大池化设计两个主要参数:网格(pool size)步长(stride). 最大池化的过程是找出网格中的pixel最大值并放在新的图像中的相应位置,步长代表窗口的滑动距离,下图中的步长为2。 MaxPooling的过程也叫做下采样。
最大池化示例

小结: 卷积是指向图像应用滤波器(核)的过程。最大池化是指通过下采样降低图像大小的过程。在 Keras 中使用 Conv2D 层级类型向神经网络模型中添加卷积层。此层级与密集层类似,并且需要将权重和偏差调整为合适的值。Conv2D 层级也有核(滤波器),我们也需要调整这些滤波器的值。在 Conv2D 层级中,我们将调整滤波器矩阵中的值,从而生成正确的输出。

术语:

  • CNN: 卷积神经网络。即至少有一个卷积层的网络。典型的 CNN 还包括其他类型的层级,例如池化层和密集层。
  • 卷积: 向图像应用核(滤波器)的过程
  • 核/滤波器: 小于输入的矩阵,用于将输入变成多个小区域
  • 填充: 在输入图像周围添加像素,像素值通常为 0
  • 池化: 通过下采样降低图像大小的过程。池化层有多种类型。例如,平均池化通过求平均值将多个值变成一个值。但是最大池化是最常见的池化类型。
  • 最大池化: 一种池化过程,通过获取多个值中的最大值,将多个值变成一个值。
  • 步长: 在图像上滑动核(滤波器)的间隔像素数量。
  • 下采样: 降低图像大小的操作

扩展阅读:卷积神经网络综合指南

cha5 CNN深度学习

Sebastian访谈

过拟合是由偏差方差权值(bias-variance trade-off)导致的,相对于数据来说,参数越多,越有可能选择完全随机的解,而不是一个好的解。有两种方法可以解决过拟合问题,第一种方法是拆分数据集,如90%的数据作为训练集,10%的数据作为测试集,然后执行交叉验证(cross validation),即使训练时没用到测试集检查模型性能,如果损失上升,则停止训练。第二种方法是约束网络。例如可以使权重加上偏差,假设使所有权重尽可能接近零,对这些权重的约束越强,越不可能过拟合。此外还可以设置测试集,训练集和验证集,这里还有一个问题,如果在测试集上测试了很多次,最终结果将过拟合测试集。

猫狗分类

CNN网络不仅可以处理灰度图像,还可以处理彩色图像。 在这里将采用CNN结构训练一个可以识别猫狗的模型,所采用的数据集是微软Asirra猫狗数据集。数据集中的图片有两种标签:0代表cat, 1代表dog。该数据集中的图片尺寸各不相同,因但神经网路要求的输入尺寸是固定的,此需要进行预处理。tf.keras.layers.Flatten(input_shape=(28, 28, 1))函数在图像尺寸大小不同时,扁平化生成的以为数组的大小也不同,因此需要先将尺寸统一,再进行扁平化操作。
彩色图像处理
计算机会将彩色图像解析为三维数组,如下图所示:
彩色图像表达
对RGB图像执行卷积运算即分别对R, G, B, 三个通道进行卷积操作,在计算出每个通道的结果后将其相加,再加上一个偏差值1,放入卷积输出中去。
彩色图像卷积输出
在实际使用CNN的时候,通常会采用多个三维过滤器,最后得出多个卷积输出结果。卷积输出的深度由卷积核的数量来决定。注意,在训练CNN时,我们将更新三维核中的值从而最小化损失函数。
多个卷积核

最大池化
在三维卷积输出的结果上执行最大池化运算的方法和灰度图像的运算方式相同。
彩色图像最大池化

colab键盘快捷键

  • ⌘/Ctrl+m,b:在当前选择的单元格下方创建一个空白代码单元格

  • ⌘/Ctrl+m,i:中断单元格的运行

  • ⌘/Ctrl+m,h:显示所有键盘快捷键列表

  • ⌘/Shift+Enter:执行当前单元格并自动新建下一个的单元格

  • 要查看关于任何 TensorFlow API 方法的文档,请将光标放置在其左括号的正后方,然后按 Tab 键:

    TensorFlow tf.constant 方法的弹出式文档

Softmax 与 S 型函数
在上个 Colab 中,我们使用了以下 CNN 结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(32, (3,3), activation='relu', input_shape=(150, 150, 3)),
tf.keras.layers.MaxPooling2D(2, 2),

tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),

tf.keras.layers.Conv2D(128, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),

tf.keras.layers.Conv2D(128, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),

tf.keras.layers.Flatten(),
tf.keras.layers.Dense(512, activation='relu'),
tf.keras.layers.Dense(2, activation='softmax')
])

注意,最后一个层级(分类器)由一个 Dense 层(具有 2 个输出单元)和一个 softmax 激活函数组成,如下所示:
tf.keras.layers.Dense(2, activation='softmax')
在处理二元分类问题时,另一个常见方法是:分类器由一个 Dense 层(具有 1 个输出单元)和一个 sigmoid 激活函数组成,如下所示:
tf.keras.layers.Dense(1, activation='sigmoid')
这两种方法都适合二元分类问题,但是请注意,如果决定在分类器中使用 sigmoid 激活函数,需要将 model.compile() 方法中的 loss 参数从 ‘sparse_categorical_crossentropy’ 更改为’binary_crossentropy’,如下所示:

1
2
3
model.compile(optimizer='adam', 
loss='binary_crossentropy',
metrics=['accuracy'])

General machine learning workflow

  1. Examine and understand data
  2. Build an input pipeline
  3. Build our model
  4. Train our model
  5. Test our model
  6. Improve our model/Repeat the process