提交 f41bf53b 编写于 作者: W wizardforcel

2020-08-05 22:15:52

上级 46ccc0d6
......@@ -221,7 +221,7 @@ import tensorflow.contrib.learn as learn
from tensorflow.contrib.learn.python.learn.estimators import estimator
```
我们还希望导入一些用于基本操作的库-抓取 NumPy,math 和 Matplotlib(可选)。 这里值得注意的是`sklearn`,这是一个通用的机器学习库,它试图简化模型的创建,训练和使用。 我们主要将其用于方便的指标,但是您会发现它具有与 Learn 类似的主接口:
我们还希望导入一些用于基本操作的库 -- 抓取 NumPy,`math`和 Matplotlib(可选)。 这里值得注意的是`sklearn`,这是一个通用的机器学习库,它试图简化模型的创建,训练和使用。 我们主要将其用于方便的指标,但是您会发现它具有与 Learn 类似的主接口:
```py
# Some basics
......@@ -376,7 +376,7 @@ import tensorflow.contrib.layers as layers
def conv_learn(X, y, mode):
```
由于这是卷积模型,因此我们需要确保数据格式正确。 特别是,这意味着将输入重塑为不仅具有正确的二维形状(36x36),而且具有 1 个颜色通道(最后一个尺寸)。 这是 TensorFlow 计算图的一部分,因此我们使用`tf.reshape`而不是`np.reshape`。 同样,由于这是通用图,因此我们希望将输出进行一次热编码,`tf.one_hot`提供了该功能。 请注意,我们必须描述有多少类(`5`),应设置的值(`1`)和未设置的值(`0`):
由于这是卷积模型,因此我们需要确保数据格式正确。 特别是,这意味着将输入重塑为不仅具有正确的二维形状(`36x36`),而且具有 1 个颜色通道(最后一个尺寸)。 这是 TensorFlow 计算图的一部分,因此我们使用`tf.reshape`而不是`np.reshape`。 同样,由于这是通用图,因此我们希望将输出进行一次热编码,`tf.one_hot`提供了该功能。 请注意,我们必须描述有多少类(`5`),应设置的值(`1`)和未设置的值(`0`):
```py
# Ensure our images are 2d
......@@ -385,7 +385,7 @@ def conv_learn(X, y, mode):
y = tf.one_hot(tf.cast(y, tf.int32), 5, 1, 0)
```
现在,真正的乐趣开始了。 为了指定卷积层,让我们初始化一个新的作用域`conv_layer`。 这只会确保我们不会破坏任何变量。 `layers.convolutional`提供了基本的机制。 它接受我们的输入(一个 TensorFlow 张量),多个输出(实际上是内核或过滤器的数量)以及内核的大小,这里是 5x5 的窗口。 对于激活函数,让我们使用整流线性,可以从主 TensorFlow 模块调用它。 这给了我们基本的卷积输出`h1`
现在,真正的乐趣开始了。 为了指定卷积层,让我们初始化一个新的作用域`conv_layer`。 这只会确保我们不会破坏任何变量。 `layers.convolutional`提供了基本的机制。 它接受我们的输入(一个 TensorFlow 张量),多个输出(实际上是内核或过滤器的数量)以及内核的大小,这里是`5x5`的窗口。 对于激活函数,让我们使用整流线性,可以从主 TensorFlow 模块调用它。 这给了我们基本的卷积输出`h1`
实际上,最大池化的发生与常规 TensorFlow 中的发生完全相同,既不容易也不难。 具有通常的内核大小和步幅的`tf.nn.max_pool`函数可以正常工作。 保存到`p1`中:
......
......@@ -26,7 +26,7 @@ for font in range(5):
train[9*(font*62 + letter)]
```
Matplotlib 需要处理很多子图。 因此,我们将创建一个新数组,高 5 幅图像,5 种字体乘以 36 像素,宽 62 幅图像,62 个字母或数字乘以 36 像素。 分配零数组后,我们可以将训练图像堆叠到其中。 字体和字母充当索引,并且我们在大型数组中一次设置 36x36 的值。 注意,这里我们在`train`数组中有`9`,因为我们每个字母只采取一种抖动类型。
Matplotlib 需要处理很多子图。 因此,我们将创建一个新数组,高 5 幅图像,5 种字体乘以 36 像素,宽 62 幅图像,62 个字母或数字乘以 36 像素。 分配零数组后,我们可以将训练图像堆叠到其中。 字体和字母充当索引,并且我们在大型数组中一次设置`36x36`的值。 注意,这里我们在`train`数组中有`9`,因为我们每个字母只采取一种抖动类型。
让我们来看一下`pcolormesh`的快速调用:
......@@ -53,7 +53,7 @@ plt.pcolormesh(all_letters,
![The logistic regression model](img/00068.jpg)
它具有 36x36 像素外加 1 倍乘以 5 类总权重,即我们需要训练的 6,485 个参数。 经过 1,000 次训练后,此模型的验证准确率达到了 40%。 您的结果可能会有所不同。 这相对较差,但是该模型具有一些优势。
它具有`36x36`像素外加 1 倍乘以 5 类总权重,即我们需要训练的 6,485 个参数。 经过 1,000 次训练后,此模型的验证准确率达到了 40%。 您的结果可能会有所不同。 这相对较差,但是该模型具有一些优势。
让我们回头看一下代码:
......@@ -83,7 +83,7 @@ y = tf.nn.softmax(tf.matmul(x,W) + b)
![The single hidden layer neural network model](img/00069.jpg)
该模型具有 36x36 像素,外加 1 个偏移乘以 128 个节点,再加上 128 个隐藏节点加上 1 个偏移乘以 5 个类的总权重,即 166,661 个参数。 隐藏层使用`sigmoid`激活函数来实现非线性。 在经过 5,000 个周期后,参数的纠缠达到了约 60% 的验证准确率,这是一个很大的改进。 但是,此改进的代价是大量增加了计算复杂性中的参数数量,您可以从代码中大致了解一下:
该模型具有`36x36`像素,外加 1 个偏移乘以 128 个节点,再加上 128 个隐藏节点加上 1 个偏移乘以 5 个类的总权重,即 166,661 个参数。 隐藏层使用`sigmoid`激活函数来实现非线性。 在经过 5,000 个周期后,参数的纠缠达到了约 60% 的验证准确率,这是一个很大的改进。 但是,此改进的代价是大量增加了计算复杂性中的参数数量,您可以从代码中大致了解一下:
```py
# These will be inputs
......@@ -162,7 +162,7 @@ y = tf.nn.softmax(tf.matmul(h2,W3) + b3)
![Convolutional neural network](img/00071.jpg)
重复出现的局部特征应该是您模型的重要线索。 我们使用卷积神经网络捕获了其中一些局部特征。 我们从一个卷积层开始,一个 5x5 窗口,使用整流线性单元,通过四个额外的偏项计算四个特征,并提取了有趣的局部参数。 接下来,我们将 2x2 的最大池化层应用于每个特征,从而将中间值的数量减少到 18x18x4 加上 1 个偏差。 将其平整为 1,297 个数字,并放入一个密集的神经网络的 32 个节点,然后进行 Softmax 激活,从而完成了具有 41,773 个参数的模型。
重复出现的局部特征应该是您模型的重要线索。 我们使用卷积神经网络捕获了其中一些局部特征。 我们从一个卷积层开始,一个`5x5`窗口,使用整流线性单元,通过四个额外的偏项计算四个特征,并提取了有趣的局部参数。 接下来,我们将`2x2`的最大池化层应用于每个特征,从而将中间值的数量减少到`18x18x4`加上 1 个偏差。 将其平整为 1,297 个数字,并放入一个密集的神经网络的 32 个节点,然后进行 Softmax 激活,从而完成了具有 41,773 个参数的模型。
尽管实现和代码比以前要花更多的精力,但是这可以很好地缩减模型的整体大小:
......@@ -217,7 +217,7 @@ h2_drop = tf.nn.dropout(h2, keep_prob)
![Deep convolutional neural network](img/00072.jpg)
尽管我们使用了较小的 3x3 窗口,但我们在第一个卷积层上计算了 16 个滤镜。 在进行最大 2x2 的池化之后,我们再次使用另一个 3x3 窗口和 4 个过滤器对池化值进行了处理。 另一个合并层再次馈入 32 个紧密连接的神经元和 Softmax 输出。 因为在馈入密集神经网络之前我们在池中有更多的卷积,所以在此模型中实际上我们具有较少的参数(准确地说是 10,765 个),几乎与逻辑回归模型一样少。 但是,该模型以 6,000 个周期的速度达到了 80% 的验证准确率,证明了您的新深度学习和 TensorFlow 技能。
尽管我们使用了较小的`3x3`窗口,但我们在第一个卷积层上计算了 16 个滤镜。 在进行最大`2x2`的池化之后,我们再次使用另一个`3x3`窗口和 4 个过滤器对池化值进行了处理。 另一个合并层再次馈入 32 个紧密连接的神经元和 Softmax 输出。 因为在馈入密集神经网络之前我们在池中有更多的卷积,所以在此模型中实际上我们具有较少的参数(准确地说是 10,765 个),几乎与逻辑回归模型一样少。 但是,该模型以 6,000 个周期的速度达到了 80% 的验证准确率,证明了您的新深度学习和 TensorFlow 技能。
```py
# Conv layer 1
......@@ -298,7 +298,7 @@ TensorFlow 不断更新。 尽管它不是 Google 的正式产品,但它还是
![Some more TensorFlow projects](img/00075.jpg)
深度神经网络确实是 TensorFlow 能够很好处理的一小部分数据建模。 但是,正如您在第 1 章入门中的“简单计算”部分所看到的那样,在简单计算中,可以为图规定的任何操作都可以在 TensorFlow 中进行。 一个实际的例子是在 TensorFlow 中实现 k 均值聚类。
深度神经网络确实是 TensorFlow 能够很好处理的一小部分数据建模。 但是,正如您在第 1 章入门中的“简单计算”部分所看到的那样,在简单计算中,可以为图规定的任何操作都可以在 TensorFlow 中进行。 一个实际的例子是在 TensorFlow 中实现 K 均值聚类。
更一般而言,可以很好地向量化并且需要某种训练的操作可能会受益于 TensorFlow 的使用。 这一切都说明您是 TensorFlow 的未来!
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册