一、课件
二、课后习题
三、答案
1
import tensorflow as tf
if __name__ == "__main__":
image = tf.fill([1, 3, 3, 3], 100.0)
img_filter = tf.Variable(tf.random.normal([2, 3, 3, 2], 0.0, 1.0))
same = tf.nn.conv2d(image, img_filter, strides=[1, 1, 1, 1], padding='SAME')
print(same)
valid = tf.nn.conv2d(image, img_filter, strides=[1, 1, 1, 1], padding='VALID')
print(valid)
2
import tensorflow as tf
def to_relu(a):
b = tf.nn.relu(a)
return b
if __name__ == "__main__":
a = tf.constant([[0, 10, -10], [-1, 2, -3]])
res = to_relu(a)
print(res)
3
import tensorflow as tf
if __name__ == "__main__":
value = tf.random.normal([3, 3, 3, 2])
print(value)
poolMax = tf.nn.max_pool(value, [1, 2, 2, 1], [1, 1, 1, 1], padding="SAME")
poolAvg = tf.nn.avg_pool(value, [1, 2, 2, 1], [1, 1, 1, 1], padding="SAME")
print(poolMax)
print(poolAvg)
四、卷积、池化、激活函数详解
知乎参考:https://zhuanlan.zhihu.com/p/28173972
以下图片来自谷歌,需要梯子才能查看图片
卷积神经网络 (CNN) 可用于逐步提取越来越高级别的图像内容表示结果,这一发现标志着图像分类模型的构建取得了重大突破。CNN 不会通过预处理数据得出纹理和形状等特征,而是仅将图像的原始像素数据用作输入,然后“学习”如何提取这些特征,最终推断出这些特征构成的对象。
首先,CNN 会接收一个输入特征图:三维矩阵,其中前两个维度的大小分别与图像的长度和宽度(以像素为单位)对应。第三个维度的大小为 3(对应于彩色图像的 3 个通道:红色、绿色和蓝色)。CNN 包括多个模块,每个模块执行三个操作。
1. 卷积
卷积会提取输入特征图的图块,并向这些图块应用过滤器以计算新特征,生成输出特征图(也称为“卷积特征”,大小和深度可能与输入特征图的不同)。卷积由以下两个参数定义:
- 所提取图块的大小(通常为 3x3 或 5x5 像素)。
- 输出特征图的深度,对应于应用的过滤器数量。
在进行卷积期间,过滤器(大小与图块大小相同的矩阵)会有效地在输入特征图的网格上沿水平和垂直方向滑动,一次移动一个像素,从而提取每个对应的图块(参见图 3)。
图 3. 在 5x5 输入特征图(深度为 1)上执行 3x3 卷积(深度也为 1)。在 5x5 特征图中,可以提取图块的 3x3 位置有 9 个,因此该卷积会生成一个 3x3 输出特征图。在图 3 中,输出特征图 (3x3) 比输入特征图 (5x5) 小。如果您希望输出特征图的大小与输入特征图相同,则可以向输入特征图的每一侧添加内边距(全部采用零值的空白行/列),生成一个具有 5x5 个可能的位置来提取 3x3 图块的 7x7 矩阵。
对于每个过滤器-图块对,CNN 会对过滤器矩阵和图块矩阵执行元素级乘法运算,然后对所得矩阵的所有元素求和,得出一个值。每个过滤器-图块对的每个结果值都会输出到卷积特征矩阵中(参见图 4a 和 4b)。
图 4a. 左图:5x5 输入特征图(深度为 1)。右图:3x3 卷积(深度为 1)。
图 4b. 左图:在 5x5 输入特征图上执行 3x3 卷积。右图:生成的卷积特征。点击输出特征图中的值即可查看其计算方式。
在训练期间,CNN 会“学习”过滤器矩阵的最优值,以便能够从输入特征图中提取有意义的特征(纹理、边缘、形状)。随着应用于输入特征图的过滤器数量(输出特征图的深度)不断增加,CNN 可以提取的特征数量也会增加。但需要做出权衡的地方是,过滤器构成了 CNN 要使用的大部分资源,因此,添加的过滤器越多,训练时间越长。此外,添加到网络的每个过滤器带来的增量价值都比上一个过滤器少,因此,工程师希望构建这样一种网络:尽量使用最少的过滤器提取出正确分类图像所需的必要特征。
2. ReLU
每次执行卷积运算后,CNN 都会向卷积特征应用修正线性单元 (ReLU) 转换,以便将非线性规律引入模型中。ReLU 函数 F(x)=max(0,x) 会针对 x > 0 的所有值返回 x,针对 x ≤ 0 的所有值返回 0。ReLU 在各种神经网络中用作激活函数;有关更多背景信息,请参阅机器学习速成课程中的神经网络简介部分。
3. 池化
ReLU 之后是池化步骤,即 CNN 会降低卷积特征的采样率(以节省处理时间),从而减少特征图的维数,同时仍保留最关键的特征信息。此过程常用的算法称为最大池化。
最大池化采用的运算方式与卷积的运算方式类似。我们在特征图上滑动并提取指定大小的图块。对于每个图块,最大值会输出到新的特征图,所有其他值都被舍弃。最大池化运算采用以下两个参数:
- 最大池化过滤器的大小(通常为 2x2 像素)
- 步长:各提取图块间隔的距离(以像素为单位)。最大池化与卷积不同:在执行卷积期间,过滤器在特征图上逐个像素滑动,而在最大池化过程中,步长会确定每个图块的提取位置。对于 2x2 过滤器,距离为 2 的步长表示最大池化运算将从特征图中提取所有非重叠 2x2 图块(参见图 5)。

图 5. 左图:使用 2x2 过滤器和步长 2 在 4x4 特征图上执行最大池化运算。右图:最大池化运算的输出。请注意,此时生成的特征图为 2x2,仅保留了每个图块的最大值。
全连接层
卷积神经网络的末端是一个或多个全连接层(当两个层“完全连接”时,第一层中的每个节点都与第二层中的每个节点相连)。全连接层的作用是根据卷积提取的特征进行分类。通常,最后的全连接层会包含一个 softmax 激活函数,该函数会针对模型尝试预测的每个分类标签输出一个概率值(范围为:0-1)。要详细了解 softmax 和多类别分类,请参阅机器学习速成课程中的多类别神经网络部分。
图 6 展示了卷积神经网络的端到端结构。
图 6. 上图中显示的 CNN 包含两个用于提取特征的卷积模块(卷积 + ReLU + 池化)和两个用于分类的全连接层。其他 CNN 可能包含更多或更少的卷积模块和全连接层。工程师会经常进行试验,以便为模型找出可产生最佳结果的配置。
Comments | NOTHING