深度学习基础(TensorFlow)

如何理解机器学习、深度学习和神经网络

        机器学习是人工智能的子研究领域,核心思想是通过经验提升性能,有监督学习非监督学习和强化学习范式;深度学习是机器学习的子研究领域,是现在非常流行的研究方法,性能非常强大,在语音图像文本上都取得了革命性进展,它可以指深度神经网络的训练过程,深度学习侧重于神经网络的搭建,训练和优化;神经网络是一个很抽象的概念,一个神经网络层的计算包括线性和非线性激活。它们之间的关系是机器学习包含深度学习包含神经网络。

你将学到什么

1)什么是神经网络以及如何训练它

2)如何使用TensorFlow构建基本的单层神经网络

3)如何添加多个层

4) 训练技巧和窍门:过度拟合,丢弃,学习率下降......

5)如何解解决使用神经网络中遇到的问题

6)如何构建卷积网络

准备

1)Python 2或3(推荐使用Python 3)

2)TensorFlow

3)Matplotlib(Python可视化库)

4)MNIST数据集

5)代码下载

下载代码,使用python3 mnist_1.0_softmax.py可以可视化训练的过程,如下图所示:

深度学习基础(TensorFlow)_第1张图片

深度学习基础(TensorFlow)_第2张图片

深度学习基础(TensorFlow)_第3张图片

深度学习基础(TensorFlow)_第4张图片

深度学习基础(TensorFlow)_第5张图片

深度学习基础(TensorFlow)_第6张图片

训练神经网络

我们的神经网络的输入是手写数字并对它们进行分类,即表明网络是否将它们识别为0,1,2等等,直到9为止。这是基于内部变量(“权重”和“偏置”)决定的,当这些变量是正确的时候,才能得到正确的分类结果。这种“正确的值”是通过训练过程学习的,后面也会详细解释。你现在需要知道的是训练循环如下所示:

训练数字=>权重和偏置的更新=>更好的识别(循环)

让我们逐个浏览可视化的六个面板,看看训练神经网络需要什么。

深度学习基础(TensorFlow)_第7张图片

从上图,您可以看到训练数字被送入训练循环,每次100个。您还可以看到神经网络在其当前的训练状态下是否已识别出它们(白色背景)或对它们进行了错误分类(红色背景,在在每个数字的左侧的小字体是有正确的标签,右侧是错误的计算标签) )。

此数据集中有50,000个训练数字。我们在每次迭代时将100个它们馈送到训练循环中,这样系统将在500次迭代后看到所有训练数字。我们称之为“epoch”。

深度学习基础(TensorFlow)_第8张图片

为了在真实条件下测试识别的质量,我们必须使用系统在训练期间没有看过的数字。否则,网络可能可以记住所有的训练数字,但却无法识别我新写的“8”。 MNIST数据集包含10,000个测试数字。在上图,您可以看到大约1000个,其中所有误识别的都排在顶部(红色背景)。左侧的百分率数字让您大致了解分类器的准确性(正确识别的测试数字的百分比) 

深度学习基础(TensorFlow)_第9张图片

 为了推动训练,我们将定义一个损失函数,即表示系统识别数字的错误程度并尝试将其值最小化。损失函数的选择(这里用“交叉熵”)将在后面解释。你在这里看到的是随着训练的进行,训练和测试数据的损失都会下降:这样很好。这意味着神经网络正在学习。 X轴表示学习循环的迭代。

深度学习基础(TensorFlow)_第10张图片

准确度只是正确识别数字的百分比。这是在训练和测试集上计算的。如果训练顺利,你会看到准确度上升。

深度学习基础(TensorFlow)_第11张图片

最后两个图表示内部变量所采用的所有的值,即训练过程中的权重和偏置。在这里,您可以看到偏置最初从0开始,最终取值大致均匀地分布在-1.5和1.5之间。如果系统收敛不好,查看这些图表可能对你很有用。如果你看到权重和偏置变成100或1000,你可能会遇到问题。

单层神经网络

MNIST数据集中的手写数字是28x28像素的灰度图像。对它们进行分类的最简单方法是把图像平铺成一维向量,使用28x28 = 784像素作为单层神经网络的输入。

深度学习基础(TensorFlow)_第12张图片

神经网络中的每个“神经元”都会对其所有输入进行加权求和,并添加一个称为“偏置(bias)”的常量,然后通过非线性激活函数,最后输出结果。

因为我们想将数字分为10个类(0到9),因此我们设计一个具有10个输出神经元的单层神经网络。

对于分类问题,适用的激活函数是softmax。对向量应用softmax是通过取向量的每个元素的指数然后归一化(可以使用任何范数,例如向量的欧几里得距离)来完成的。

 深度学习基础(TensorFlow)_第13张图片​​​​​​

为什么“softmax”被称为softmax?指数是一个急剧增大的函数。它会增加向量元素之间的差异。它也能快速地生成很大的值。然后,当归一化向量时,最大元素将被归一化到接近1的值,而所有其他元素将除以一个大的值并归一化到接近0的值。结果向量清楚地表明哪一个是它的最大值,即“max”,但仍然保留了原来的相对顺序,因此是“soft”的。

现在我们将使用矩阵乘法将这个单层神经元的作用总结为一个简单的公式。使用100个图像的“小批量”作为输入,生成100个预测(具有10个元素的向量作为输出)。

使用权重矩阵W中的第一列权重,计算第一个图像的所有像素的加权和。这个和对应于第一个神经元。使用第二列权重,我们对第二个神经元也用相同的操作,以此类推直到第十个单元。然后,我们对其余99张图像重复相同的操作。假设X为包含100幅图像的矩阵,那么在100幅图像上计算的10个神经元的所有加权和就是X.W(矩阵阵乘)。

现在将每个神经元加上它的偏置(一个常数)。由于我们有10个神经元,因此有10个偏置常数。我们将这个包含10个值的向量为称作b。它被加到先前计算的矩阵的每一行。使用一个叫做“广播(broadcasting)”的技巧,只需一个简单的加号来描述这个操作。

 “broadcasting”是Python和它的科学计算库numpy中使用的标准技巧。它对在具有不同维度的矩阵上的运算进行扩展。 “Broadcasting add”的意思是“因尺寸不一致而不同直接相加的两个矩阵,可以通过复制小的矩阵来使运算操作成立。”

最后,应用softmax激活函数并获得应用于100个图像的单层神经网络的公式:

 深度学习基础(TensorFlow)_第14张图片

 梯度下降

现在神经网络可以从输入图像中产生预测,我们需要度量这样做的优劣程度,即网络的预测和真实标签之间的距离。

可以使用任意的距离来测量,而其中欧几里德距离是个不错的选择,但对于分类问题,使用称为“交叉熵(cross-entropy)”的方法更有效率。

深度学习基础(TensorFlow)_第15张图片

 “one-hot”编码意味着使用具有10个值的向量表示标签“6”,该向量除第6个值为1,其余值全部为零.这里很方便,因为这种格式与神经网络的输出预测非常相似,它也使用10个值的向量。

“训练”神经网络实际上意味着使用训练图像和标签来调整权重和偏置以最小化交叉熵损失函数。现在来讲解它的工作原理。

交叉熵是权重,偏置,训练图像的像素及其已知标签的函数。

通过计算交叉熵相对于所有权重和所有偏置的偏导数,得到“梯度”,它计算给定的图像,标签与权重和偏置的现值。权重和偏置加起来有7850个,因此计算梯度听起来像需要大量工作。幸运的是,TensorFlow可以轻松地完成这个任务。

梯度的数学属性表示它是指向“上”的。由于我们想要去交叉熵低的地方,因此应该走向它相反的方向。我们用一小部分梯度更新权重和偏置,然后再次使用下一批训练图像做同样的事情。希望这样就能让我们到达交叉熵最小的坑底。

深度学习基础(TensorFlow)_第16张图片

 在这幅图中,交叉熵表示为2个权重的函数。实际上的权重数会更多。梯度下降算法沿着最陡的方向的路径下降到局部最小值。训练图像在每次迭代过程中都会发生变化,以便收敛到适用于所有图像的局部最小值。

“学习率”:在每次迭代中,无法通过完整的梯度值更新权重和偏置。这就像是用极大的步伐试图走到达山谷底部一样。你会从山谷的一边跳到另一边。为了达到底部,您需要走更小的步幅,即只使用梯度的一部分,通常是1/1000。我们称这个分数为“学习率”。

训练循环的过程总结:

训练数字和标签=>损失函数=>梯度(偏导数)=>最速下降=>更新权重和偏置=>用下一批最小批次的训练图像和标签

为什么要处理100个图像和标签的“小批量”?
仅仅在一个图像样本上计算出梯度,并立即更新权重和偏置(在科学文献中称为“随机梯度下降”)。在100个样本上执行相同的操作会产生一个梯度,它可以更好地表示不同图像样本施加的约束,因此可能会更快地趋于正确的方案。小批量的大小是一个可调参数。还有另外一个技术原因:使用批处理也意味着使用更大的矩阵,而这些通常更容易在GPU上进行优化。

更多内容请参考:https://codelabs.developers.google.com

最简单易学的深度学习入门教程(TensorFlow)

 

 

 

 

你可能感兴趣的:(深度学习,人工智能)