提交 eb6875fb 编写于 作者: W wizardforcel

2020-09-11 18:20:40

上级 21b290d5
......@@ -69,7 +69,7 @@ TensorFlow 是一个开源软件库,用于实现机器学习和深度学习系
```
**新术语****重要词**以粗体显示。 您在屏幕上看到的字词,例如在菜单或对话框中的字样如下所示:“本书中的快捷方式基于`Mac OS X 10.5+`方案。”
**新术语****重要词**以粗体显示。 您在屏幕上看到的字词,例如在菜单或对话框中的字样如下所示:“本书中的快捷方式基于`Mac OSX 10.5+`方案。”
### 注意
......
......@@ -71,11 +71,11 @@
TensorFlow 主页
TensorFlow 可以使用 Python 和 C ++支持,并且我们将使用 Python 2.7 进行学习,因为 Python API 确实受到更好的支持并且更容易学习。 Python 的安装取决于您的系统。 [下载页面](https://www.python.org/downloads/)包含安装页面所需的所有信息。 在下一节中,我们将通过一些编程示例非常简要地解释 Python 语言的主要功能。
TensorFlow 可以使用 Python 和 C++ 支持,并且我们将使用 Python 2.7 进行学习,因为 Python API 确实受到更好的支持并且更容易学习。 Python 的安装取决于您的系统。 [下载页面](https://www.python.org/downloads/)包含安装页面所需的所有信息。 在下一节中,我们将通过一些编程示例非常简要地解释 Python 语言的主要功能。
# Python 基础
Python 是一种强类型的动态语言(数据类型是必需的,但不必显式声明它们),区分大小写(var 和 VAR 是两个不同的变量)和面向对象(Python 中的所有对象都是对象)。
Python 是一种强类型的动态语言(数据类型是必需的,但不必显式声明它们),区分大小写(`var``VAR`是两个不同的变量)和面向对象(Python 中的所有对象都是对象)。
## 句法
......@@ -328,7 +328,7 @@ randomint = random.randint(1, 100)
# 安装 TensorFlow
TensorFlow Python API 支持 Python 2.7 和 Python 3.3+。 GPU 版本(仅 Linux)需要 Cuda Toolkit> = 7.0 和 cuDNN> = v2。
TensorFlow Python API 支持 Python 2.7 和 Python 3.3+。 GPU 版本(仅 Linux)需要 Cuda Toolkit >= 7.0 和 cuDNN >= v2。
在 Python 环境中工作时,建议您使用`virtualenv`。 它将隔离您的 Python 配置用于不同的项目; 使用`virtualenv`不会覆盖 TensorFlow 所需的 Python 软件包的现有版本。
......@@ -338,14 +338,14 @@ TensorFlow Python API 支持 Python 2.7 和 Python 3.3+。 GPU 版本(仅 Linu
1. 如果尚未安装 PIP 和 Virtualenv(可选),请首先安装它们:
对于 Ubuntu / Linux 64 位:
对于 Ubuntu/Linux 64 位:
```py
$ sudo apt-get install python-pip python-dev python-virtualenv
```
对于 Mac OS X:
对于 Mac OSX:
```py
$ sudo easy_install pip
......@@ -353,14 +353,14 @@ TensorFlow Python API 支持 Python 2.7 和 Python 3.3+。 GPU 版本(仅 Linu
```
2. 然后,您可以创建虚拟环境 virtualenv。 以下命令在`~ / tensorflow`目录中创建虚拟环境 virtualenv:
2. 然后,您可以创建虚拟环境 Virtualenv。 以下命令在`~ / tensorflow`目录中创建虚拟环境 virtualenv:
```py
$ virtualenv --system-site-packages ~/tensorflow
```
3. 下一步是如下激活 virtualenv:
3. 下一步是如下激活 Virtualenv:
```py
$ source ~/tensorflow/bin/activate.csh
......@@ -368,16 +368,16 @@ TensorFlow Python API 支持 Python 2.7 和 Python 3.3+。 GPU 版本(仅 Linu
```
4. 此后,我们正在使用的环境的名称在命令行之前。 一旦激活,Pip 将用于在其中安装 TensorFlow。
4. 此后,我们正在使用的环境的名称在命令行之前。 一旦激活,PIP 将用于在其中安装 TensorFlow。
对于 Ubuntu / Linux 64 位 CPU:
对于 Ubuntu/Linux 64 位 CPU:
```py
(tensorflow)$ pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.5.0-cp27-none-linux_x86_64.whl
```
对于 Mac OS X,CPU:
对于 Mac OSX,CPU:
```py
(tensorflow)$ pip install --upgrade https://storage.googleapis.com/tensorflow/mac/tensorflow-0.5.0-py2-none-any.whl
......@@ -407,11 +407,11 @@ TensorFlow Python API 支持 Python 2.7 和 Python 3.3+。 GPU 版本(仅 Linu
### 注意
安装 VirtualBox 后,您可以安装 Ubuntu( [www.ubuntu.com](http://www.ubuntu.com),然后按照 Linux 机器的安装步骤来安装 TensorFlow。
安装 VirtualBox 后,您可以安装 [Ubuntu](http://www.ubuntu.com),然后按照 Linux 机器的安装步骤来安装 TensorFlow。
## 从源安装
但是,Pip 安装可能会引起问题,[尤其是在使用可视化工具 TensorBoard 时](https://github.com/tensorflow/tensorflow/issues/530)。 要解决此问题,建议您通过以下步骤构建并安装 TensorFlow,以启动表单源文件:
但是,PIP 安装可能会引起问题,[尤其是在使用可视化工具 TensorBoard 时](https://github.com/tensorflow/tensorflow/issues/530)。 要解决此问题,建议您通过以下步骤构建并安装 TensorFlow,以启动表单源文件:
1. 克隆 TensorFlow 存储库:
......@@ -444,7 +444,7 @@ TensorFlow Python API 支持 Python 2.7 和 Python 3.3+。 GPU 版本(仅 Linu
```
6. 使用`bazel`创建自己的 TensorFlow Pip 包:
6. 使用`bazel`创建自己的 TensorFlow PIP 包:
```py
bazel build -c opt //tensorflow/tools/pip_package:build_pip_package
......@@ -554,7 +554,7 @@ print(y)
```
那么我们如何解释不同的结果呢? 区别在于变量定义。 实际上,变量`y`并不代表`x + 9`的当前值,而是表示:*在计算变量`y`时,取常数`x`的值并将其加 9* 。 这就是从未执行`y`值的原因。 在下一节中,我将尝试修复它。
那么我们如何解释不同的结果呢? 区别在于变量定义。 实际上,变量`y`并不代表`x + 9`的当前值,而是表示:*在计算变量`y`时,取常数`x`的值并将其加 9*。 这就是从未执行`y`值的原因。 在下一节中,我将尝试修复它。
因此,我们打开 Python IDE 并输入以下行:
......@@ -600,7 +600,7 @@ TensorFlow 支持这些构造和这些运算符。 让我们详细看看 TensorF
让我们更详细地探讨数据流图中的一些功能:
* **操作**:这表示一种抽象计算,例如对矩阵进行相加或相乘。 一个操作管理张量。 它可以是多态的:同一操作可以操纵不同的张量元素类型。 例如,添加两个 int32 张量,添加两个浮点张量,依此类推。
* **操作**:这表示一种抽象计算,例如对矩阵进行相加或相乘。 一个操作管理张量。 它可以是多态的:同一操作可以操纵不同的张量元素类型。 例如,添加两个`int32`张量,添加两个浮点张量,依此类推。
* **内核**:这表示该操作的具体实现。 内核定义特定设备上操作的实现。 例如,加矩阵运算可以具有 CPU 实现和 GPU 实现。 在以下部分中,我们介绍了在 TensorFlow 中创建`del`执行图的会话概念。 让我们解释一下这个主题:
* **会话**:当客户端程序必须与 TensorFlow 运行时系统建立通信时,必须创建一个会话。 为客户端创建会话后,便会创建一个初始图,该图为空。 它有两种基本方法:
* `session.extend`:在计算中,用户可以扩展执行图,请求添加更多操作(节点)和边(数据)。
......
......@@ -32,7 +32,7 @@
## 一维张量
要构建一维张量,我们使用 Numpy array(s)命令,其中`s`是 Python 列表:
要构建一维张量,我们使用 Numpy 数组命令,其中`s`是 Python 列表:
```py
>>> import numpy as np
......@@ -154,7 +154,7 @@ array([[1, 2],
```
在这种情况下,我们提取了一个 2×2 子矩阵,其中包含`tensor_2d`的行 0 和 1,以及列 0 和 1。 TensorFlow 有自己的切片运算符。 在下一个小节中,我们将看到如何使用它。
在这种情况下,我们提取了一个`2×2`子矩阵,其中包含`tensor_2d`的行 0 和 1,以及列 0 和 1。 TensorFlow 有自己的切片运算符。 在下一个小节中,我们将看到如何使用它。
### 张量处理
......@@ -285,7 +285,7 @@ TensorFlow 在张量上提供了许多数学运算。 下表总结了它们:
```
创建的三维张量是 2x2x2 矩阵:
创建的三维张量是`2x2x2`矩阵:
```py
>>> tensor_3d.shape
......@@ -326,7 +326,7 @@ TensorFlow 旨在处理各种大小的张量和可用于操纵它们的运算符
![Handling tensors with TensorFlow](img/image_02_004.jpg) The RGB tensor
我想向您展示的第一件事是如何使用 TensorFlow slice 运算符上传图像,然后从原始图像中提取子图像。
我想向您展示的第一件事是如何使用 TensorFlow 切片运算符上传图像,然后从原始图像中提取子图像。
### 准备输入数据
......@@ -360,7 +360,7 @@ plt.show()
![Prepare the input data](img/image_02_005.jpg) The starting image
在此示例中,slice 是起始图像的二维段,其中每个像素都具有 RGB 分量,因此我们需要一个占位符来存储切片的所有值:
在此示例中,切片是起始图像的二维段,其中每个像素都具有 RGB 分量,因此我们需要一个占位符来存储切片的所有值:
```py
import TensorFlow as tf
......@@ -471,7 +471,7 @@ plt.show()
```
现在我们来看我们的问题,即如何使用 TensorFlow 显示分形。 Mandelbrot 布景是最著名的分形之一。 分形是一种几何对象,其结构以不同的比例重复出现。 分形在自然界中很常见,例如大不列颠海岸。
现在我们来看我们的问题,即如何使用 TensorFlow 显示分形。 Mandelbrot 图案是最著名的分形之一。 分形是一种几何对象,其结构以不同的比例重复出现。 分形在自然界中很常见,例如大不列颠海岸。
为复数`c`定义了 Mandelbrot 集,对于该复数来说,以下连续是有界的:
......@@ -927,7 +927,7 @@ import matplotlib.pyplot as plt
## 初始条件
首先,我们必须定义问题的范围。 假设我们的池塘是 500x500 正方形:
首先,我们必须定义问题的范围。 假设我们的池塘是`500x500`正方形:
```py
N = 500
......
......@@ -7,7 +7,7 @@
* 分类器
* 最近邻算法
* 数据聚类
* k-均值算法
* K 均值算法
# 线性回归算法
......@@ -211,7 +211,7 @@ with tf.Session() as session:
![Testing the model](img/B05474_03_03.jpg)
线性回归:开始计算(步长= 0
线性回归:开始计算(步长`= 0`
仅需五个步骤,我们就可以看到(在下图中)该生产线的贴合性有了实质性的改进:
......@@ -272,7 +272,7 @@ with tf.Session() as session:
[MNIST 数据集](http://yann.lecun.com/exdb/mnist/)在机器学习领域中广泛用于培训和测试,我们将在这本书的示例中使用它。 它包含从 0 到 9 的手写数字的黑白图像。
数据集分为两个组:60,000 个用于训练模型,另外 10,000 个用于测试模型。 将黑白的原始图像规格化以适合大小为 28×28 像素的盒子,并通过计算像素的质心来居中。 下图表示如何在 MNIST 数据集中表示数字:
数据集分为两个组:60,000 个用于训练模型,另外 10,000 个用于测试模型。 将黑白的原始图像规格化以适合大小为`28×28`像素的盒子,并通过计算像素的质心来居中。 下图表示如何在 MNIST 数据集中表示数字:
![The MNIST dataset](img/B05474_03_06.jpg)
......@@ -515,7 +515,7 @@ Result = 0.9
```
结果不是 100准确; 原因是在于对测试编号的错误评估。 8 代替 5,分类器的评分为 6。
结果不是 100% 准确; 原因是在于对测试编号的错误评估。 8 代替 5,分类器的评分为 6。
最后,我们报告用于 KNN 分类的完整代码:
......@@ -572,9 +572,9 @@ with tf.Session() as sess:
聚类算法属于*无监督方法*,因为我们不假设有关聚类结构和特征的任何先验信息。
## k-均值算法
## K 均值算法
k-means 是最常见和最简单的*聚类算法*之一,它可以根据对象的属性将对象组细分为 k 个分区。 每个簇由*点**质心平均值*标识。
K 均值是最常见和最简单的*聚类算法*之一,它可以根据对象的属性将对象组细分为 k 个分区。 每个簇由*点**质心平均值*标识。
该算法遵循一个迭代过程:
......@@ -584,11 +584,11 @@ k-means 是最常见和最简单的*聚类算法*之一,它可以根据对象
4. 重新计算每个群集的质心。
5. 直到质心不变。
k 均值的流行来自其*收敛速度*和其*易于实现*。 就解决方案的质量而言,该算法不能保证实现全局最优。 最终解决方案的质量在很大程度上取决于集群的*初始集*,并且在实践中可能会获得更差的全局最优解。 由于该算法非常快,因此您可以多次应用它,并提供解决方案,您可以从中选择最满意的一种。 该算法的另一个缺点是,它要求您选择要查找的簇数(`k`)。
K 均值的流行来自其*收敛速度*和其*易于实现*。 就解决方案的质量而言,该算法不能保证实现全局最优。 最终解决方案的质量在很大程度上取决于集群的*初始集*,并且在实践中可能会获得更差的全局最优解。 由于该算法非常快,因此您可以多次应用它,并提供解决方案,您可以从中选择最满意的一种。 该算法的另一个缺点是,它要求您选择要查找的簇数(`k`)。
如果数据不是自然分区的,您将最终得到奇怪的结果。 此外,该算法仅在数据中存在可识别的球形簇时才有效。
现在让我们看看如何通过 TensorFlow 库实现 k-means
现在让我们看看如何通过 TensorFlow 库实现 K 均值
## 建立训练集
......@@ -625,7 +625,7 @@ num_clusters = 4
```
我们设置 k-means 算法的计算步骤数:
我们设置 K 均值算法的计算步骤数:
```py
num_steps = 100
......@@ -679,7 +679,7 @@ plt.show()
![Building the training set](img/B05474_03_10-1024x758.jpg)
k 均值训练集
K 均值训练集
在随机构建训练集之后,我们必须生成(`k = 4`)重心,然后使用`tf.random_shuffle`确定索引:
......@@ -827,7 +827,7 @@ ax.scatter(df['x'], df['y'], c=df['color'])
k-means 算法的最终结果
这是 k-means 算法的完整代码:
这是 K 均值算法的完整代码:
```py
import matplotlib.pyplot as plt
......@@ -900,7 +900,7 @@ plt.show()
# 摘要
在本章中,我们开始探索 TensorFlow 在机器学习中一些典型问题的潜力。 使用*线性回归*算法,解释了*成本函数*和使用*梯度下降*进行优化的重要概念。 然后,我们描述了手写数字的数据集 MNIST。 我们还使用*最近邻*算法实现了多类分类器,该分类器属于机器学习*监督学习*类别。 然后,本章以实现数据聚类问题的 k-means 算法为例,以*无监督学习*为例。
在本章中,我们开始探索 TensorFlow 在机器学习中一些典型问题的潜力。 使用*线性回归*算法,解释了*成本函数*和使用*梯度下降*进行优化的重要概念。 然后,我们描述了手写数字的数据集 MNIST。 我们还使用*最近邻*算法实现了多类分类器,该分类器属于机器学习*监督学习*类别。 然后,本章以实现数据聚类问题的 K 均值算法为例,以*无监督学习*为例。
在下一章中,我们将介绍神经网络。 这些是代表定义为*人工神经元*的元素之间相互联系的数学模型,即模仿活神经元特性的数学构造。
......
......@@ -50,7 +50,7 @@ Rosemblatt 的感知机架构
# 逻辑回归
该算法与我们在第 3 章“机器学习入门”开始看到的规范线性回归无关,但是它是允许我们解决监督分类问题的算法。 实际上,为了估计因变量,现在我们利用所谓的逻辑函数或 S。 正是由于这个功能,我们将此算法称为逻辑回归。 乙状结肠功能具有以下模式:
该算法与我们在第 3 章“机器学习入门”开始看到的规范线性回归无关,但是它是允许我们解决监督分类问题的算法。 实际上,为了估计因变量,现在我们利用所谓的逻辑函数或 Sigmoid。 正是由于这个功能,我们将此算法称为逻辑回归。 乙状结肠功能具有以下模式:
![The logistic regression](img/B05474_04_03.jpg)
......@@ -561,7 +561,7 @@ layer_1 = tf.nn.sigmoid(tf.add(tf.matmul(x,h),bias_layer_1))
```
它通过`activation`函数将其输出发送到下一层的神经元。 必须说,每个神经元的功能可能不同,但是在实践中,我们对所有神经元(通常为 S)采用一个共同的特征。 有时输出神经元具有线性激活功能。 有趣的是,隐藏层中神经元的激活函数不能是线性的,因为在这种情况下,MLP 网络将等效于具有两层的网络,因此不再是 MLP 类型。 第二层必须执行与第一相同的步骤。
它通过`activation`函数将其输出发送到下一层的神经元。 必须说,每个神经元的功能可能不同,但是在实践中,我们对所有神经元(通常为 Sigmoid)采用一个共同的特征。 有时输出神经元具有线性激活功能。 有趣的是,隐藏层中神经元的激活函数不能是线性的,因为在这种情况下,MLP 网络将等效于具有两层的网络,因此不再是 MLP 类型。 第二层必须执行与第一相同的步骤。
第二中间层由权重张量`[256 × 256]`的形状表示:
......
......@@ -14,7 +14,7 @@
深度学习技术是机器学习研究人员近几十年来所迈出的关键一步,已提供了许多应用(如图像识别和语音识别)中前所未有的成功成果。
有多种原因导致开发深度学习并将其置于机器学习范围内的关注焦点。 这些原因之一是硬件的进步,以及新处理器的可用性,例如图形处理单元(**GPU**),它们大大减少了训练网络所需的时间,降低了 10/20 的时间。 次。
有多种原因导致开发深度学习并将其置于机器学习范围内的关注焦点。 这些原因之一是硬件的进步,以及新处理器的可用性,例如图形处理单元(**GPU**),它们大大减少了训练网络所需的时间,降低了 10/20 的时间。
另一个原因肯定是*越来越容易找到*,要在其上训练系统的*数据集*越多,这些数据集就需要训练一定深度和输入数据的高维结构。 深度学习包含一组方法,这些方法使系统可以在多个级别上获取数据的*分层表示*。 这是通过组合简单的单元(不是线性的)来实现的,每个简单的单元从输入级别开始将其自身级别的表示形式转换为更高级别的表示形式*更抽象*。 通过足够数量的这些转换,可以学习相当复杂的输入输出功能。
......@@ -64,7 +64,7 @@ CNN 使用三个基本概念:*局部感受野*,*卷积*和*合并*。
输入神经元
CNN 背后的概念之一是*本地连接*。 实际上,CNN 利用输入数据中可能存在的空间相关性。 第一后续层的每个神经元仅连接*某些输入神经元。 该区域称为**局部感受野**。 在下图中,用*会聚*到隐藏的神经元的黑色 5x5 正方形表示:
CNN 背后的概念之一是*本地连接*。 实际上,CNN 利用输入数据中可能存在的空间相关性。 第一后续层的每个神经元仅连接*某些输入神经元。 该区域称为**局部感受野**。 在下图中,用*会聚*到隐藏的神经元的黑色`5x5`正方形表示:
![CNN architecture](img/B05474_05_03.jpg)
......@@ -76,13 +76,13 @@ CNN 背后的概念之一是*本地连接*。 实际上,CNN 利用输入数据
本地连接的原因在于以下事实:在数组形式的数据(例如图像)中,值通常高度相关,从而形成了易于识别的不同数据组。
每个连接都学习一个权重(因此它将得到 5x5 = 25),而不是隐藏的神经元及其关联的连接会学习一个总偏差,然后我们将通过不时执行移位来将区域连接到单个神经元,例如在以下图中:
每个连接都学习一个权重(因此它将得到`5x5 = 25`),而不是隐藏的神经元及其关联的连接会学习一个总偏差,然后我们将通过不时执行移位来将区域连接到单个神经元,例如在以下图中:
![CNN architecture](img/B05474_05_04.jpg)
卷积运算
该操作称为**卷积**。这样,如果我们有一个 28x28 输入和 5x5 区域的图像,我们将在隐藏层中获得 24x24 神经元。 我们说过,每个神经元都有一个偏差和与该区域相关的 5x5 权重:我们将对所有 24x24 神经元使用这些权重和偏差。 这意味着第一隐藏层中的所有神经元将识别相同的特征,只是在输入图像中放置的位置不同。 因此,从输入层到隐藏特征图的连接图称为*共享权重*,偏置称为*共享偏置*,因为它们事实上是共享的。
该操作称为**卷积**。这样,如果我们有一个`28x28`输入和`5x5`区域的图像,我们将在隐藏层中获得`24x24`神经元。 我们说过,每个神经元都有一个偏差和与该区域相关的`5x5`权重:我们将对所有`24x24`神经元使用这些权重和偏差。 这意味着第一隐藏层中的所有神经元将识别相同的特征,只是在输入图像中放置的位置不同。 因此,从输入层到隐藏特征图的连接图称为*共享权重*,偏置称为*共享偏置*,因为它们事实上是共享的。
显然,我们需要识别的不仅仅是一个特征图,因此,一个完整的卷积层是由*多个特征图*组成的。
......@@ -90,9 +90,9 @@ CNN 背后的概念之一是*本地连接*。 实际上,CNN 利用输入数据
多个功能图
在上图中,我们看到了三个特征图。 当然,实际上它的数量会增加,甚至可以使用具有 20 或 40 个特征图的卷积层。 权重和偏差共享的一个巨大优势是卷积网络中涉及的参数的*显着降低*。 考虑我们的示例,对于每个特征图,我们需要 25 个权重(5x5)和一个偏差(共享)。 总共有 26 个参数。 假设我们有 20 个特征图,我们将定义 520 个参数。 在具有 784 个输入神经元和例如 30 个隐藏层神经元的完全连接的网络中,我们需要 30 个以上的 784x30 偏差权重,以达到总共 23.550 个参数。
在上图中,我们看到了三个特征图。 当然,实际上它的数量会增加,甚至可以使用具有 20 或 40 个特征图的卷积层。 权重和偏差共享的一个巨大优势是卷积网络中涉及的参数的*显着降低*。 考虑我们的示例,对于每个特征图,我们需要 25 个权重(`5x5`)和一个偏差(共享)。 总共有 26 个参数。 假设我们有 20 个特征图,我们将定义 520 个参数。 在具有 784 个输入神经元和例如 30 个隐藏层神经元的完全连接的网络中,我们需要 30 个以上的`784x30`偏差权重,以达到总共 23.550 个参数。
差异是显而易见的。 卷积网络还使用*池化层*,它们是紧接在卷积层之后的层。 这些简化了前一层的输出信息(*卷积*)。 它获取从卷积层出来的输入特征图,并准备一个*压缩的*特征图。 例如,我们可以说池化层可以以其所有单位汇总在上一层神经元的 2x2 区域中。
差异是显而易见的。 卷积网络还使用*池化层*,它们是紧接在卷积层之后的层。 这些简化了前一层的输出信息(*卷积*)。 它获取从卷积层出来的输入特征图,并准备一个*压缩的*特征图。 例如,我们可以说池化层可以以其所有单位汇总在上一层神经元的`2x2`区域中。
该技术称为池化,可以用以下方案概括:
......@@ -106,7 +106,7 @@ CNN 背后的概念之一是*本地连接*。 实际上,CNN 利用输入数据
从输入层到第二个隐藏层
因此,我们假设第一个隐藏层具有三个尺寸为 24x24 的特征图,第二个隐藏层的尺寸将为 12x12,因为我们假设每个单元汇总一个 2x2 区域。
因此,我们假设第一个隐藏层具有三个尺寸为`24x24`的特征图,第二个隐藏层的尺寸将为 12x12,因为我们假设每个单元汇总一个`2x2`区域。
结合这三个思想,我们形成了一个完整的卷积网络。 其架构可以显示如下:
......@@ -114,7 +114,7 @@ CNN 背后的概念之一是*本地连接*。 实际上,CNN 利用输入数据
CNN 架构架构
让我们总结一下:有 28x28 个输入神经元,后跟一个*卷积层*,具有局部接收场 5x5 和 3 个特征图。 作为*的结果,我们获得了 3x24x24 神经元的隐藏层*。 然后在特征图的 3 个区域上将最大池应用于 2x2,从而获得 3x12x12 的隐藏层。 最后一层是*完全连接的*:它将最大池化层的所有神经元连接到所有 10 个输出神经元,有助于识别相应的输出。
让我们总结一下:有`28x28`个输入神经元,后跟一个*卷积层*,具有局部接收场`5x5`和 3 个特征图。 作为*的结果,我们获得了`3x24x24`神经元的隐藏层*。 然后在特征图的 3 个区域上将最大池应用于`2x2`,从而获得`3x12x12`的隐藏层。 最后一层是*完全连接的*:它将最大池化层的所有神经元连接到所有 10 个输出神经元,有助于识别相应的输出。
然后将通过梯度下降和反向传播算法训练该网络。
......@@ -143,7 +143,7 @@ CNN 架构架构
```
3. MNIST 数据输入(每个形状为 28x28 阵列像素):
3. MNIST 数据输入(每个形状为`28x28`阵列像素):
```py
n_input = 784
......@@ -180,7 +180,7 @@ _X = tf.reshape(x, shape=[-1, 28, 28, 1])
第二和第三个尺寸对应于图像的宽度和高度,而第二个尺寸是色彩通道的总数(在我们的情况下为 1)。
因此,我们可以将输入图像显示为尺寸为 28x28 的二维张量:
因此,我们可以将输入图像显示为尺寸为`28x28`的二维张量:
![Initialization step](img/B05474_05_09.jpg)
......@@ -195,7 +195,7 @@ y = tf.placeholder(tf.float32, [None, n_classes]).
#### 第一卷积层
隐藏层的每个神经元都连接到尺寸为 5x5 的输入张量的一小部分。 这意味着隐藏层的大小为 24x24。 我们还定义和初始化共享权重和共享偏差的张量:
隐藏层的每个神经元都连接到尺寸为`5x5`的输入张量的一小部分。 这意味着隐藏层的大小为`24x24`。 我们还定义和初始化共享权重和共享偏差的张量:
```py
wc1 = tf.Variable(tf.random_normal([5, 5, 1, 32]))
......@@ -235,7 +235,7 @@ def conv2d(img, w, b):
卷积操作之后,我们强加了*池化*步骤,该步骤简化了先前创建的卷积层的输出信息。
在我们的示例中,让我们采用卷积层的 2x2 区域,然后我们将汇总池层中每个点的信息。
在我们的示例中,让我们采用卷积层的`2x2`区域,然后我们将汇总池层中每个点的信息。
```py
conv1 = max_pool(conv1, k=2)
......@@ -253,7 +253,7 @@ def max_pool(img, k):
```
`tf.nn.max_pool`函数对输入执行最大池化。 当然,我们将最大池化应用于每个卷积层,并且将有很多层池化和卷积。 在合并阶段结束时,我们将具有 12x12x32 *卷积隐藏层*
`tf.nn.max_pool`函数对输入执行最大池化。 当然,我们将最大池化应用于每个卷积层,并且将有很多层池化和卷积。 在合并阶段结束时,我们将具有`12x12x32`*卷积隐藏层*
下图显示了池化和卷积操作后的 CNN 层:
......@@ -279,28 +279,28 @@ bc2 = tf.Variable(tf.random_normal([64]))
```
如您所注意到的,第二个隐藏层将具有 5x5 窗口的 64 个要素,而输入层的数量将从第一个卷积获得的层中给出。 接下来,我们将第二层应用于卷积`conv1`张量,但是这次我们将 64 组 5x5 滤镜分别应用于 32 个`conv1`层:
如您所注意到的,第二个隐藏层将具有`5x5`窗口的 64 个要素,而输入层的数量将从第一个卷积获得的层中给出。 接下来,我们将第二层应用于卷积`conv1`张量,但是这次我们将 64 组`5x5`滤镜分别应用于 32 个`conv1`层:
```py
conv2 = conv2d(conv1,wc2,bc2)
```
它为我们提供了 64 个 14x14 数组,通过最大池化将其减少到 64 个 7x7 数组:
它为我们提供了 64 个`14x14`数组,通过最大池化将其减少到 64 个`7x7`数组:
```py
conv2 = max_pool(conv2, k=2)
```
最后,我们再次使用 dropout 操作:
最后,我们再次使用丢弃操作:
```py
conv2 = tf.nn.dropout(conv2, keep_prob)
```
生成的层是 7x7 x 64 卷积张量,因为我们从输入张量 12x12 和 5x5 的滑动窗口开始,考虑到步幅为 1。
生成的层是`7x7 x 64`卷积张量,因为我们从输入张量`12x12``5x5`的滑动窗口开始,考虑到步幅为 1。
![Second convolutional layer](img/B05474_05_12.jpg)
......@@ -332,7 +332,7 @@ dense1 = tf.nn.relu(tf.add(tf.matmul(dense1, wd1),bd1))
```
我们再次使用 dropout 运算符完成这一层:
我们再次使用丢弃运算符完成这一层:
```py
dense1 = tf.nn.dropout(dense1, keep_prob)
......@@ -489,7 +489,7 @@ Testing Accuracy: 0.921875
```
它提供约 99.2的精度。 显然,它不代表最新技术,因为该示例的目的只是看如何构建 CNN。 该模型可以进一步完善以提供更好的结果。
它提供约 99.2% 的精度。 显然,它不代表最新技术,因为该示例的目的只是看如何构建 CNN。 该模型可以进一步完善以提供更好的结果。
#### 源代码
......@@ -672,7 +672,7 @@ RNN 已被证明在诸如预测文本中的下一个字符或类似地预测句
您可以从[网页](http://www.fit.vutbr.cz/~imikolov/rnnlm/simple-examples.tgz)下载数据,然后提取数据文件夹。 数据集经过预处理,包含 10000 个不同的单词,包括句子结尾标记和稀有单词的特殊符号(`<unk>`)。 我们将`reader.py`中的所有参数都转换为唯一的整数标识符,以使神经网络更易于处理。
要使用 tar 解压缩`.tgz`文件,您需要使用以下命令:
要使用`tar`解压缩`.tgz`文件,您需要使用以下命令:
```py
tar -xvzf /path/to/yourfile.tgz
......
......@@ -235,7 +235,7 @@ bazel test tensorflow_serving/
该代码将由两部分组成:
* 训练和导出模型的 Python 文件(`mnist_export.py`
* 一个 C ++文件(`mnist_inference.cc`),该文件加载导出的模型并运行 gRPC 服务为其提供服务
* 一个 C++ 文件(`mnist_inference.cc`),该文件加载导出的模型并运行 gRPC 服务为其提供服务
在以下各节中,我们报告使用 TensorFlow Serving 的基本步骤。 对于其他参考,您可以查看[这里](https://tensorflow.github.io/serving/serving_basic)
......@@ -341,7 +341,7 @@ checkpoint export-00000-of-00001 export.meta
# 加载和导出 TensorFlow 模型
用于加载导出的 TensorFlow 模型的 C ++代码在`mnist_inference.cc`中的`main()`函数中。 在这里,我们报告摘录; 我们不考虑用于批处理的参数。 如果要调整最大批处理大小,超时阈值或用于批处理推理的后台线程数,可以通过在`BatchingParameters`中设置更多值来进行调整:
用于加载导出的 TensorFlow 模型的 C++ 代码在`mnist_inference.cc`中的`main()`函数中。 在这里,我们报告摘录; 我们不考虑用于批处理的参数。 如果要调整最大批处理大小,超时阈值或用于批处理推理的后台线程数,可以通过在`BatchingParameters`中设置更多值来进行调整:
```py
int main(int argc, char** argv)
......@@ -408,7 +408,7 @@ Inference error rate: 10.5%
```
结果确认服务器成功加载并运行了经过训练的模型。 实际上,对于 1,000 张图像,推理错误率为 10.5%,这为训练后的 Softmax 模型提供了 91%的准确性。
结果确认服务器成功加载并运行了经过训练的模型。 实际上,对于 1,000 张图像,推理错误率为 10.5% ,这为训练后的 Softmax 模型提供了 91% 的准确性。
# 摘要
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册