成都哪家公司做网站比较好,免费网站可以做淘宝客吗,建设网站要注册公司吗,企业邮箱格式模板【深度学习】— 多输入多输出通道、多通道输入的卷积、多输出通道、11 卷积层、汇聚层、多通道汇聚层 多输入多输出通道多通道输入的卷积示例#xff1a;多通道的二维互相关运算 多输出通道实现多通道输出的互相关运算 11 卷积层11 卷积的作用 使用全连接层实现 11 卷积小结 … 【深度学习】— 多输入多输出通道、多通道输入的卷积、多输出通道、1×1 卷积层、汇聚层、多通道汇聚层 多输入多输出通道多通道输入的卷积示例多通道的二维互相关运算 多输出通道实现多通道输出的互相关运算 1×1 卷积层1×1 卷积的作用 使用全连接层实现 1×1 卷积小结 汇聚层汇聚层的作用最大汇聚层和平均汇聚层 汇聚层的实现实现汇聚层示例验证二维最大汇聚和平均汇聚 填充和步幅在汇聚层中的应用默认步幅与汇聚窗口大小相同自定义填充和步幅不同的矩形汇聚窗口与不同的填充和步幅 多通道汇聚层示例多通道汇聚操作小结 多输入多输出通道
在之前的示例中我们仅展示了单个输入和单个输出通道的卷积操作这使得我们可以将输入、卷积核和输出视为二维张量。然而在实际应用中输入数据和卷积层常常包含多个通道。例如彩色图像通常具有 RGB 通道分别表示红、绿和蓝三种颜色。
当我们引入多个通道时输入和隐藏表示都变成了三维张量。例如每个 RGB 输入图像的形状通常为 ( channels × height × width ) ( 3 , h , w ) (\text{channels} \times \text{height} \times \text{width}) (3, h, w) (channels×height×width)(3,h,w)其中第一个轴表示通道channel维度。
多通道输入的卷积
当输入数据包含多个通道时卷积核也需要相应地包含与输入通道数相同的通道数以便对各通道进行互相关运算。假设输入数据的通道数为 c i c_i ci则卷积核的输入通道数也应为 c i c_i ci。
假设卷积核的窗口形状为 ( k h , k w ) (k_h, k_w) (kh,kw)则
当 c i 1 c_i 1 ci1 时卷积核是一个形状为 ( k h , k w ) (k_h, k_w) (kh,kw) 的二维张量。当 c i 1 c_i 1 ci1 时每个输入通道都需要一个 ( k h , k w ) (k_h, k_w) (kh,kw) 形状的二维卷积核。因此卷积核的整体形状为 ( c i , k h , k w ) (c_i, k_h, k_w) (ci,kh,kw)。
在多通道输入的卷积运算中对每个输入通道的二维张量与卷积核对应通道的二维张量分别进行互相关运算。然后将各通道的运算结果相加得到最终的二维输出张量。
示例多通道的二维互相关运算
如下图所示图 6.4.1我们演示了一个具有两个输入通道的二维互相关运算。阴影部分表示第一个输出元素及其计算所涉及的输入和卷积核张量的元素。
输入通道假设输入数据有两个通道每个通道为一个二维张量。卷积核通道卷积核同样具有两个通道每个通道包含一个 ( k h , k w ) (k_h, k_w) (kh,kw) 的二维滤波器。输出计算对于每个输出元素将输入的每个通道与对应的卷积核通道进行互相关操作并将结果求和。
这种方式允许卷积层在多个输入通道上进行特征学习从而提取出更丰富的特征。 为了加深对多输入通道卷积的理解我们可以实现一个简单的多输入通道互相关运算。基本思想是对每个输入通道执行互相关操作并将各通道的结果相加得到最终的输出。
import torch# 定义多输入通道的互相关运算函数
def corr2d_multi_in(X, K):# 对每个通道执行互相关运算然后将结果相加return sum(d2l.corr2d(x, k) for x, k in zip(X, K))我们可以使用对应于图 6.4.1 的输入张量 X 和卷积核张量 K 来验证这个多输入通道互相关运算的输出。
# 构造输入张量 X 和卷积核张量 K
X torch.tensor([[[0.0, 1.0, 2.0], [3.0, 4.0, 5.0], [6.0, 7.0, 8.0]], [[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]]])K torch.tensor([[[0.0, 1.0], [2.0, 3.0]], [[1.0, 2.0], [3.0, 4.0]]])# 计算多通道互相关的结果
output corr2d_multi_in(X, K)
print(output)输出
tensor([[ 56., 72.],[104., 120.]])通过这个示例我们可以看到对于多输入通道的互相关运算每个通道的互相关结果相加后得到的输出符合预期。这一方法有效地组合了多输入通道的信息有助于提取更丰富的特征。
多输出通道
到目前为止无论输入通道有多少我们在卷积层中都只有一个输出通道。然而在实际的神经网络中每一层通常包含多个输出通道这对于深度学习模型来说至关重要。随着神经网络层数的加深输出通道的数量常常增加而空间分辨率则逐步降低以换取更大的通道深度。
每个输出通道可以视为对不同特征的响应但这些通道并非独立学习的而是通过优化以共同使用。因此多输出通道不仅仅是多个单通道检测器的简单组合。
假设输入通道数为 c i c_i ci输出通道数为 c o c_o co卷积核的高度和宽度分别为 k h k_h kh 和 k w k_w kw。为了获得多个通道的输出我们为每个输出通道创建一个形状为 ( c i , k h , k w ) (c_i, k_h, k_w) (ci,kh,kw) 的卷积核张量这样卷积核的形状为 ( c o , c i , k h , k w ) (c_o, c_i, k_h, k_w) (co,ci,kh,kw)。在互相关运算中每个输出通道使用对应的卷积核与所有输入通道进行运算然后汇总结果。
实现多通道输出的互相关运算
我们可以实现一个函数来计算多个输出通道的卷积操作
import torch# 定义多输入多输出通道的互相关运算函数
def corr2d_multi_in_out(X, K):# 迭代卷积核 K 的第0个维度每次对输入 X 进行互相关运算# 最后将结果堆叠成一个输出张量return torch.stack([corr2d_multi_in(X, k) for k in K], 0)接下来通过将核张量 K 与 K1每个元素加1和 K2 连接起来构造一个具有 3 个输出通道的卷积核。
# 构造一个具有 3 个输出通道的卷积核张量
K torch.stack((K, K 1, K 2), 0)
print(K.shape)输出
torch.Size([3, 2, 2, 2])这表示我们有 3 个输出通道每个输出通道的卷积核有 2 个输入通道且每个输入通道的卷积核大小为 2x2。
现在我们对输入张量 X 和卷积核张量 K 执行互相关运算输出包含 3 个通道。第一个通道的结果应与之前多输入单输出通道的结果一致
# 计算多输入多输出通道的卷积结果
output corr2d_multi_in_out(X, K)
print(output)输出
tensor([[[ 56., 72.],[104., 120.]],[[ 76., 100.],[148., 172.]],[[ 96., 128.],[192., 224.]]])1×1 卷积层
1×1 卷积层即卷积核大小为 ( 1 , 1 ) (1, 1) (1,1) 的卷积层表面上看起来似乎没有多大意义。卷积的本质通常在于提取相邻像素间的相关特征而 1×1 卷积显然无法做到这一点。然而1×1 卷积在许多深层网络的设计中十分流行并有着独特的作用。
由于采用了最小的窗口1×1 卷积失去了在高度和宽度维度上捕捉相邻元素相互作用的能力。事实上1×1 卷积的唯一计算发生在通道维度上。图 6.4.2 展示了使用 1×1 卷积核的多输入多输出通道的互相关计算其中输入和输出具有相同的高度和宽度。输出中的每个元素都是从输入图像中同一位置的多个通道元素的线性组合。 在这种情况下可以将 1×1 卷积视为一个在每个像素位置应用的全连接层即将输入的多个通道值映射为输出的多个通道值。由于 1×1 卷积仍然是一个卷积层跨像素位置的权重是一致的。这种卷积层需要的权重维度为 ( c o , c i , 1 , 1 ) (c_o, c_i, 1, 1) (co,ci,1,1)外加一个偏置项。
1×1 卷积的作用
1×1 卷积主要用于以下几种情况
增加或减少通道维度通过调整输出通道数1×1 卷积可以增加或减少通道数帮助控制模型复杂度。跨通道特征融合在不改变空间分辨率的前提下通过线性组合各通道的信息使得不同通道的特征得以融合。非线性特征映射配合非线性激活函数1×1 卷积能够在网络中实现跨通道的非线性映射。
因此尽管 1×1 卷积不会改变输入的空间维度它在深层网络中起到了连接通道特征、调控模型复杂度的关键作用。
使用全连接层实现 1×1 卷积
在 1×1 卷积中每个输出像素仅与输入中相同位置的像素相关。因此我们可以通过将 1×1 卷积转化为全连接层来实现这需要对输入和输出的数据形状进行调整。
import torch# 使用全连接层实现 1×1 卷积
def corr2d_multi_in_out_1x1(X, K):c_i, h, w X.shape # 输入的通道数和空间维度c_o K.shape[0] # 输出通道数X X.reshape((c_i, h * w)) # 调整输入的形状K K.reshape((c_o, c_i)) # 调整卷积核的形状# 全连接层中的矩阵乘法Y torch.matmul(K, X)return Y.reshape((c_o, h, w)) # 调整输出的形状当执行 1×1 卷积时该函数等效于我们之前实现的多输入多输出通道的互相关函数 corr2d_multi_in_out。以下示例验证了两者的结果一致性
# 生成样本数据进行验证
X torch.normal(0, 1, (3, 3, 3)) # 输入数据 (3 个通道3x3 大小)
K torch.normal(0, 1, (2, 3, 1, 1)) # 卷积核 (2 个输出通道3 个输入通道1x1 大小)# 使用两种方法计算卷积
Y1 corr2d_multi_in_out_1x1(X, K)
Y2 corr2d_multi_in_out(X, K)# 验证两者输出一致
assert float(torch.abs(Y1 - Y2).sum()) 1e-6以上代码验证了使用全连接层实现的 1×1 卷积与直接使用互相关运算的结果相同。
小结
多输入多输出通道扩展了卷积层的建模能力。当在每个像素位置独立应用时卷积层等效于全连接层。卷积层通常用于调整网络层的通道数量从而控制模型的复杂性。
汇聚层
在图像处理任务中我们希望逐渐降低隐藏表示的空间分辨率并聚集信息。随着神经网络层数的增加网络的感受野会扩大每个神经元对输入的敏感区域增大。对于全局图像分类问题例如“图像是否包含一只猫”网络的最后一层需要能够感知整个输入。因此通过逐步聚合信息网络可以生成更加粗糙、全局化的特征表示。
此外在检测较低层次的特征例如边缘时我们通常希望这些特征具有某种平移不变性。现实中物体几乎不可能始终出现在同一像素位置上即使相机稳定地拍摄物体细微的抖动也可能导致图像中元素左右移动一两个像素。因此保持平移不变性对提高模型的鲁棒性尤为重要。
汇聚层的作用
汇聚层Pooling Layer的作用包括
降低卷积层对位置的敏感性降低对空间降采样表示的敏感性。
最大汇聚层和平均汇聚层
汇聚层类似于卷积层由一个固定形状的窗口组成。该窗口根据步幅大小在输入的各个区域上滑动并在每个位置计算一个输出值。与卷积层不同汇聚层没有需要学习的参数它的计算是确定性的通常是计算汇聚窗口中元素的最大值或平均值。
最大汇聚层Max Pooling输出汇聚窗口中元素的最大值。平均汇聚层Average Pooling输出汇聚窗口中元素的平均值。
汇聚窗口从输入张量的左上角开始按从左到右、从上到下的顺序在输入张量内滑动。在汇聚窗口到达的每个位置它计算该窗口中输入子张量的最大值或平均值这取决于我们选择了最大汇聚层还是平均汇聚层。
这种汇聚操作能够有效地降低特征的空间分辨率同时保留重要的统计信息有助于网络对特征的平移不变性和降采样表示的适应性。
汇聚层的实现
汇聚层使用固定大小的窗口在输入数据上滑动并在每个位置计算窗口内元素的最大值或平均值。这些操作分别称为最大汇聚和平均汇聚。汇聚层的窗口形状为 ( p h , p w ) (p_h, p_w) (ph,pw)且步幅一般与窗口大小相同。
在对象边缘检测的示例中最大汇聚层可以帮助保持卷积层对某些模式的识别能力即使输入在高度或宽度方向上移动了一个像素卷积层仍能识别出模式。这种特性使得汇聚层能够有效地增强卷积神经网络的平移不变性。
实现汇聚层
下面的 pool2d 函数实现了汇聚层的前向传播类似于 6.2 节中的 corr2d 函数。与卷积层不同汇聚层没有卷积核输出仅为输入中每个区域的最大值或平均值。
import torch# 定义汇聚层的实现函数
def pool2d(X, pool_size, modemax):p_h, p_w pool_sizeY torch.zeros((X.shape[0] - p_h 1, X.shape[1] - p_w 1))for i in range(Y.shape[0]):for j in range(Y.shape[1]):if mode max:Y[i, j] X[i: i p_h, j: j p_w].max() # 最大汇聚elif mode avg:Y[i, j] X[i: i p_h, j: j p_w].mean() # 平均汇聚return Y示例验证二维最大汇聚和平均汇聚
我们可以使用输入张量 X 来验证二维最大汇聚和平均汇聚的输出
# 构建示例输入张量
X torch.tensor([[0.0, 1.0, 2.0], [3.0, 4.0, 5.0], [6.0, 7.0, 8.0]])# 验证二维最大汇聚层
print(pool2d(X, (2, 2)))输出
tensor([[4., 5.],[7., 8.]])对于平均汇聚层
# 验证二维平均汇聚层
print(pool2d(X, (2, 2), avg))输出
tensor([[2., 3.],[5., 6.]])在此示例中最大汇聚输出了每个汇聚窗口内的最大值而平均汇聚输出了每个汇聚窗口内的平均值。这种汇聚操作可以有效地降低卷积层对位置的敏感性同时帮助进行空间降采样。
填充和步幅在汇聚层中的应用
与卷积层类似汇聚层也可以通过设置填充和步幅来改变输出的形状。在深度学习框架中我们可以通过内置的二维最大汇聚层来演示填充和步幅的效果。
首先构造一个输入张量 X其形状为 (1, 1, 4, 4)即一个样本数和通道数均为 1 的 4x4 矩阵。
import torch
from torch import nn# 构造输入张量 X
X torch.arange(16, dtypetorch.float32).reshape((1, 1, 4, 4))
print(X)输出
tensor([[[[ 0., 1., 2., 3.],[ 4., 5., 6., 7.],[ 8., 9., 10., 11.],[12., 13., 14., 15.]]]])默认步幅与汇聚窗口大小相同
默认情况下深度学习框架中的步幅与汇聚窗口的大小相同。例如如果我们使用一个形状为 (3, 3) 的汇聚窗口默认步幅为 (3, 3)
# 使用 (3, 3) 汇聚窗口步幅默认为 (3, 3)
pool2d nn.MaxPool2d(3)
print(pool2d(X))输出
tensor([[[[10.]]]])自定义填充和步幅
我们也可以手动设置填充和步幅。例如使用汇聚窗口 (3, 3)填充为 1步幅为 2
# 设置 (3, 3) 汇聚窗口填充为 1步幅为 2
pool2d nn.MaxPool2d(3, padding1, stride2)
print(pool2d(X))输出
tensor([[[[ 5., 7.],[13., 15.]]]])不同的矩形汇聚窗口与不同的填充和步幅
我们还可以使用矩形汇聚窗口并分别设置填充和步幅的高度和宽度。例如使用汇聚窗口大小 (2, 3)步幅为 (2, 3)填充为 (0, 1)
# 使用 (2, 3) 的矩形汇聚窗口步幅为 (2, 3)填充为 (0, 1)
pool2d nn.MaxPool2d((2, 3), stride(2, 3), padding(0, 1))
print(pool2d(X))输出
tensor([[[[ 5., 7.],[13., 15.]]]])通过设定汇聚窗口、填充和步幅的大小我们可以灵活地控制汇聚层的输出形状。汇聚层通过降低特征图的空间分辨率帮助模型逐步聚合特征并增强平移不变性。
多通道汇聚层
在处理多通道输入数据时汇聚层会在每个输入通道上独立进行操作而不像卷积层那样对通道维度进行汇总。这意味着汇聚层的输出通道数与输入通道数一致。
示例多通道汇聚操作
我们先在通道维度上将张量 X 和 X 1 连接起来以构造一个具有 2 个通道的输入
import torch
from torch import nn# 创建一个 4x4 的输入张量 X
X torch.arange(16, dtypetorch.float32).reshape((1, 1, 4, 4))# 将 X 和 X1 在通道维度上拼接形成一个具有 2 个通道的输入张量
X torch.cat((X, X 1), 1)
print(X)输出
tensor([[[[ 0., 1., 2., 3.],[ 4., 5., 6., 7.],[ 8., 9., 10., 11.],[12., 13., 14., 15.]],[[ 1., 2., 3., 4.],[ 5., 6., 7., 8.],[ 9., 10., 11., 12.],[13., 14., 15., 16.]]]])使用 3x3 的最大汇聚窗口填充为 1步幅为 2。在每个通道上汇聚层将独立进行操作
# 使用 3x3 的最大汇聚层填充为 1步幅为 2
pool2d nn.MaxPool2d(3, padding1, stride2)
print(pool2d(X))输出
tensor([[[[ 5., 7.],[13., 15.]],[[ 6., 8.],[14., 16.]]]])可以看到输出仍然包含 2 个通道每个通道的汇聚结果对应于输入张量的每个通道的汇聚操作。
小结
最大汇聚层输出该窗口内的最大值而平均汇聚层输出窗口内的平均值。汇聚层的主要优势之一是减轻卷积层对位置的敏感性。可以在汇聚层中指定填充和步幅以控制输出形状。使用最大汇聚层及大于 1 的步幅可减少空间维度如高度和宽度。汇聚层的输出通道数与输入通道数相同。