# 使用多个层
现在我们已经介绍了多个操作,我们将介绍如何连接具有通过它们传播的数据的各个层。
## 做好准备
在本文中,我们将介绍如何最好地连接各种层,包括自定义层。我们将生成和使用的数据将代表小型随机图像。最好通过一个简单的例子来理解这种类型的操作,看看我们如何使用一些内置层来执行计算。我们将探索的第一层称为移动窗口。我们将在 2D 图像上执行小的移动窗口平均值,然后第二层将是自定义操作层。
在本节中,我们将看到计算图可能变得庞大且难以查看。为了解决这个问题,我们还将介绍命名操作和创建层范围的方法。首先,加载`numpy`和`tensorflow`,然后使用以下命令创建图:
```py
import tensorflow as tf
import numpy as np
sess = tf.Session()
```
## 操作步骤
我们按如下方式处理秘籍:
1. 首先,我们使用 NumPy 创建示例 2D 图像。该图像将是`4` x `4`像素图像。我们将在四个方面创建它;第一个和最后一个维度的大小为 1.请注意,某些 TensorFlow 图像函数将在四维图像上运行。这四个维度是图像编号,高度,宽度和通道,为了使其成为一个具有一个通道的图像,我们将两个维度设置为`1`,如下所示:
```py
x_shape = [1, 4, 4, 1]
x_val = np.random.uniform(size=x_shape)
```
1. 现在,我们必须在图中创建占位符,我们可以在其中提供示例图像,如下所示:
```py
x_data = tf.placeholder(tf.float32, shape=x_shape)
```
1. 为了在我们的`4` x `4`图像上创建一个移动窗口平均值,我们将使用一个内置函数,它将在形状窗口`2` x `2`上收敛一个常量。我们将使用的函数是`conv2d()`;此函数在图像处理和 TensorFlow 中非常常用。此函数采用窗口的分段产品和我们指定的过滤器。我们还必须在两个方向上指定移动窗口的步幅。在这里,我们将计算四个移动窗口平均值:左上角,右上角,左下角和右下角四个像素。我们通过创建`2` x `2`窗口并在每个方向上具有长度`2`的步幅来实现这一点。为取平均值,我们将`2` x `2`窗口用`0.25`的常数卷积,如下:
```py
my_filter = tf.constant(0.25, shape=[2, 2, 1, 1])
my_strides = [1, 2, 2, 1]
mov_avg_layer= tf.nn.conv2d(x_data, my_filter, my_strides,
padding='SAME', name='Moving_Avg_Window')
```
> 请注意,我们还使用函数的`name`参数命名此层`Moving_Avg_Window`。 为了计算卷积层的输出大小,我们可以使用下面的公式`: Output = (W - F + 2P) / S + 1`,其中`W`是输入大小,`F`是过滤器大小,`P`是零填充,并且`S`是步幅。
1. 现在,我们定义一个自定义层,它将在移动窗口平均值的`2` x `2`输出上运行。自定义函数将首先将输入乘以另一个`2` x `2`矩阵张量,然后为每个条目添加 1。在此之后,我们取每个元素的 sigmoid 并返回`2` x `2`矩阵。由于矩阵乘法仅对二维矩阵进行操作,因此我们需要删除大小为`1`的图像的额外维度。 TensorFlow 可以使用内置的`squeeze()`函数执行此操作。在这里,我们定义新层:
```py
def custom_layer(input_matrix):
input_matrix_sqeezed = tf.squeeze(input_matrix)
A = tf.constant([[1., 2.], [-1., 3.]])
b = tf.constant(1., shape=[2, 2])
temp1 = tf.matmul(A, input_matrix_sqeezed)
temp = tf.add(temp1, b) # Ax + b
return tf.sigmoid(temp)
```
1. 现在,我们必须将新层放在图上。我们将使用命名范围执行此操作,以便它在计算图上可识别和可折叠/可扩展,如下所示:
```py
with tf.name_scope('Custom_Layer') as scope:
custom_layer1 = custom_layer(mov_avg_layer)
```
1. 现在,我们只需输入`4` x `4`图像来替换占位符并告诉 TensorFlow 运行图,如下所示:
```py
print(sess.run(custom_layer1, feed_dict={x_data: x_val}))
[[ 0.91914582 0.96025133]
[ 0.87262219 0.9469803 ]]
```
## 工作原理
通过命名操作和层范围,可视化绘图看起来更好。我们可以折叠和展开自定义层,因为我们在命名范围内创建了它。在下图中,请参阅左侧的折叠版本和右侧的展开版本:
![](https://img.kancloud.cn/a6/d9/a6d97aeb90ee0a51e517e8bd5a88098d_702x811.png)
图 3:具有两层的计算图
第一层名为 Moving_Avg_Window。第二个是名为 Custom_Layer 的操作集合。它在左侧折叠并在右侧展开。
- TensorFlow 入门
- 介绍
- TensorFlow 如何工作
- 声明变量和张量
- 使用占位符和变量
- 使用矩阵
- 声明操作符
- 实现激活函数
- 使用数据源
- 其他资源
- TensorFlow 的方式
- 介绍
- 计算图中的操作
- 对嵌套操作分层
- 使用多个层
- 实现损失函数
- 实现反向传播
- 使用批量和随机训练
- 把所有东西结合在一起
- 评估模型
- 线性回归
- 介绍
- 使用矩阵逆方法
- 实现分解方法
- 学习 TensorFlow 线性回归方法
- 理解线性回归中的损失函数
- 实现 deming 回归
- 实现套索和岭回归
- 实现弹性网络回归
- 实现逻辑回归
- 支持向量机
- 介绍
- 使用线性 SVM
- 简化为线性回归
- 在 TensorFlow 中使用内核
- 实现非线性 SVM
- 实现多类 SVM
- 最近邻方法
- 介绍
- 使用最近邻
- 使用基于文本的距离
- 使用混合距离函数的计算
- 使用地址匹配的示例
- 使用最近邻进行图像识别
- 神经网络
- 介绍
- 实现操作门
- 使用门和激活函数
- 实现单层神经网络
- 实现不同的层
- 使用多层神经网络
- 改进线性模型的预测
- 学习玩井字棋
- 自然语言处理
- 介绍
- 使用词袋嵌入
- 实现 TF-IDF
- 使用 Skip-Gram 嵌入
- 使用 CBOW 嵌入
- 使用 word2vec 进行预测
- 使用 doc2vec 进行情绪分析
- 卷积神经网络
- 介绍
- 实现简单的 CNN
- 实现先进的 CNN
- 重新训练现有的 CNN 模型
- 应用 StyleNet 和 NeuralStyle 项目
- 实现 DeepDream
- 循环神经网络
- 介绍
- 为垃圾邮件预测实现 RNN
- 实现 LSTM 模型
- 堆叠多个 LSTM 层
- 创建序列到序列模型
- 训练 Siamese RNN 相似性度量
- 将 TensorFlow 投入生产
- 介绍
- 实现单元测试
- 使用多个执行程序
- 并行化 TensorFlow
- 将 TensorFlow 投入生产
- 生产环境 TensorFlow 的一个例子
- 使用 TensorFlow 服务
- 更多 TensorFlow
- 介绍
- 可视化 TensorBoard 中的图
- 使用遗传算法
- 使用 k 均值聚类
- 求解常微分方程组
- 使用随机森林
- 使用 TensorFlow 和 Keras