- ✨本文收录于【深度学习】:《PyTorch入门到项目实战》专栏,此专栏主要记录如何使用
PyTorch
实现深度学习笔记,尽量坚持每周持续更新,欢迎大家订阅!- 个人主页:JoJo的数据分析历险记
- 个人介绍:小编大四统计在读,目前保研到统计学top3高校继续攻读统计研究生
- 如果文章对你有帮助,欢迎✌
关注
、点赞
、✌收藏
、订阅
专栏- 参考资料:本专栏主要以沐神《动手学深度学习》为学习资料,记录自己的学习笔记,能力有限,如有错误,欢迎大家指正。同时沐神上传了的教学视频和教材,大家可以前往学习。
- 视频:动手学深度学习
- 教材:动手学深度学习
我们之前已经介绍了单通道的卷积是如何进行填充padding、stride的。然而在实际分析中,我们的目标任务往往是多通道的。本文介绍一下如何进行多通道输入和多通道输出。
假如说我们不仅想检测灰度图像的特征,而是想要检测RGB彩色图像的特征。彩色图像如果是
6×6×3
,这里的3指的是三个颜色通道,可以把它想象成三个6×6
图像的堆叠。为了检测图像的边缘或者其他的特征,不是把它跟原来的3×3
的过滤器做卷积,而是跟一个三维的过滤器,它的维度是3×3×3
,这样这个过滤器也有三层,对应红、绿、蓝三个通道。具体如下所示
注意:这个的输出会是一个4×4的图像,而不是不是4×4×3,。我们来分析一下这是如何计算的。首先,会拿这个3×3×3的卷积核先放到最左上角的位置,这个3×3×3的卷积核有27个数字,分别与原始图像对应的27个数字做内积。这样就得到了第一个数字,然后再根据相应的步长向右、向下移动。具体过程如下所示
这样就将一个多输入通道的图像通过三维卷积核转换到了单输出通道图像。这意味着不论有多少输入通道,我们都只有一个输出通道。下面我们来看看如何进行多通道输出
在卷积神经网络中,有多个输出通道是至关重要的。在经典的神经网络架构中(例如LeNet,AlexNet,VGG
等),随着神经网络层数的加深,我们常会增加输出通道的维数,通过减少空间分辨率以获得更大的通道深度。直观地说,我们可以将每个通道看作是对不同特征的反应。如下图所示:
我们让这个6×6×3的图像和两个3×3×3的过滤器卷积。第一个是黄色卷积核,假设是一个垂直边界检测器。第二个卷积核是橘色,假设是一个水平边界检测器。这样就得到4×4×2的输出。根据这个我们可以发现,假设 c 0 c_0 c0表示输入通道数, c 1 c_1 c1表示输出通道数,则有n×n× c 0 c_0 c0和一个 c 1 × f × f × c 0 c_1\times f\times f\times c_0 c1×f×f×c0的卷积核进行处理,得到一个 ( n − f + 1 × c 1 ) × ( n − f + 1 × c 1 ) (n-f+1\times c_1)\times (n-f+1 \times c_1) (n−f+1×c1)×(n−f+1×c1)的输出。
# 导入相关库
import torch
from d2l import torch as d2l
def corr2d_multi_in(X, K):
# 先遍历“X”和“K”的第0个维度(通道维度),再把它们加在一起。
return sum(d2l.corr2d(x, k) for x, k in zip(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]]])
X.shape,K.shape
(torch.Size([2, 3, 3]), torch.Size([2, 2, 2]))
可以看出,输入是一个2通道 3 × 3 3\times3 3×3的数据,卷积核是 2 × 2 × 2 2\times2\times2 2×2×2,得到的结果为 2 × 2 2\times2 2×2。
corr2d_multi_in(X, K)
tensor([[ 56., 72.],
[104., 120.]])
定义多通道输出函数
def corr2d_multi_in_out(X, K):
# 迭代“K”的第0个维度,每次都对输入“X”执行互相关运算。
# 最后将所有结果都叠加在一起,注意,这里我们只对K进行遍历
return torch.stack([corr2d_multi_in(X, k) for k in K], 0)
使用stack将卷积核堆叠
K = torch.stack((K, K + 1, K + 2), 0)
K.shape
torch.Size([3, 2, 2, 2])
可以看出这是一个3个输出通道,2个输入通道的2×2卷积核,因此得到的结果为 3 × 2 × 2 3\times2\times2 3×2×2。
corr2d_multi_in_out(X, K)
tensor([[[ 56., 72.],
[104., 120.]],
[[ 76., 100.],
[148., 172.]],
[[ 96., 128.],
[192., 224.]]])
本章的介绍到此介绍,如果文章对你有帮助,请多多点赞、收藏、评论、关注支持!!