很多真实数据的维度经常更高。例如,彩色图像在高和宽2个维度外还有RGB(红、绿、蓝)3个颜色通道。假设彩色图像的高和宽分别是hhh和www(像素),那么它可以表示为一个3×h×w3\times h\times w3×h×w的多维数组。我们将大小为3的这一维称为通道(channel)维。本节我们将介绍含多个输入通道或多个输出通道的卷积核。

1. 多输入通道

当输入数据含多个通道时,我们需要构造一个输入通道数与输入数据的通道数相同的卷积核,从而能够与含多通道的输入数据做互相关运算。假设输入数据的通道数为cic_ici​,那么卷积核的输入通道数同样为cic_ici​。设卷积核窗口形状为kh×kwk_h\times k_wkh​×kw​。当ci=1c_i=1ci​=1时,我们知道卷积核只包含一个形状为kh×kwk_h\times k_wkh​×kw​的二维数组。当ci>1c_i > 1ci​>1时,我们将会为每个输入通道各分配一个形状为kh×kwk_h\times k_wkh​×kw​的核数组。把这cic_ici​个数组在输入通道维上连结,即得到一个形状为ci×kh×kwc_i\times k_h\times k_wci​×kh​×kw​的卷积核。由于输入和卷积核各有cic_ici​个通道,我们可以在各个通道上对输入的二维数组和卷积核的二维核数组做互相关运算,再将这cic_ici​个互相关运算的二维输出按通道相加,得到一个二维数组。这就是含多个通道的输入数据与多输入通道的卷积核做二维互相关运算的输出。

图5.4展示了含2个输入通道的二维互相关计算的例子。在每个通道上,二维输入数组与二维核数组做互相关运算,再按通道相加即得到输出。图5.4中阴影部分为第一个输出元素及其计算所使用的输入和核数组元素:(1×1+2×2+4×3+5×4)+(0×0+1×1+3×2+4×3)=56(1\times1+2\times2+4\times3+5\times4)+(0\times0+1\times1+3\times2+4\times3)=56(1×1+2×2+4×3+5×4)+(0×0+1×1+3×2+4×3)=56。

接下来我们实现含多个输入通道的互相关运算。我们只需要对每个通道做互相关运算,然后通过add_n函数来进行累加。

import torch
from torch import nn
import sys
sys.path.append("..")
import d2lzh_pytorch as d2ldef corr2d_multi_in(X, K):# 沿着X和K的第0维(通道维)分别计算再相加res = d2l.corr2d(X[0, :, :], K[0, :, :])for i in range(1, X.shape[0]):res += d2l.corr2d(X[i, :, :], K[i, :, :])return res

我们可以构造图5.4中的输入数组X、核数组K来验证互相关运算的输出。

X = torch.tensor([[[0, 1, 2], [3, 4, 5], [6, 7, 8]],[[1, 2, 3], [4, 5, 6], [7, 8, 9]]])
K = torch.tensor([[[0, 1], [2, 3]], [[1, 2], [3, 4]]])corr2d_multi_in(X, K)

输出:

tensor([[ 56.,  72.],[104., 120.]])

2. 多输出通道

当输入通道有多个时,因为我们对各个通道的结果做了累加,所以不论输入通道数是多少,输出通道数总是为1。设卷积核输入通道数和输出通道数分别为cic_ici​和coc_oco​,高和宽分别为khk_hkh​和kwk_wkw​。如果希望得到含多个通道的输出,我们可以为每个输出通道分别创建形状为ci×kh×kwc_i\times k_h\times k_wci​×kh​×kw​的核数组。将它们在输出通道维上连结,卷积核的形状即co×ci×kh×kwc_o\times c_i\times k_h\times k_wco​×ci​×kh​×kw​。在做互相关运算时,每个输出通道上的结果由卷积核在该输出通道上的核数组与整个输入数组计算而来。

下面我们实现一个互相关运算函数来计算多个通道的输出。

def corr2d_multi_in_out(X, K):# 对K的第0维遍历,每次同输入X做互相关计算。所有结果使用stack函数合并在一起return torch.stack([corr2d_multi_in(X, k) for k in K])

我们将核数组KK+1K中每个元素加一)和K+2连结在一起来构造一个输出通道数为3的卷积核。

K = torch.stack([K, K + 1, K + 2])
K.shape # torch.Size([3, 2, 2, 2])

下面我们对输入数组X与核数组K做互相关运算。此时的输出含有3个通道。其中第一个通道的结果与之前输入数组X与多输入通道、单输出通道核的计算结果一致。

corr2d_multi_in_out(X, K)

输出:

tensor([[[ 56.,  72.],[104., 120.]],[[ 76., 100.],[148., 172.]],[[ 96., 128.],[192., 224.]]])

5.3.3 1×11\times 11×1卷积层

最后我们讨论卷积窗口形状为1×11\times 11×1(kh=kw=1k_h=k_w=1kh​=kw​=1)的多通道卷积层。我们通常称之为1×11\times 11×1卷积层,并将其中的卷积运算称为1×11\times 11×1卷积。因为使用了最小窗口,1×11\times 11×1卷积失去了卷积层可以识别高和宽维度上相邻元素构成的模式的功能。实际上,1×11\times 11×1卷积的主要计算发生在通道维上。图5.5展示了使用输入通道数为3、输出通道数为2的1×11\times 11×1卷积核的互相关计算。值得注意的是,输入和输出具有相同的高和宽。输出中的每个元素来自输入中在高和宽上相同位置的元素在不同通道之间的按权重累加。假设我们将通道维当作特征维,将高和宽维度上的元素当成数据样本,那么1×11\times 11×1卷积层的作用与全连接层等价

下面我们使用全连接层中的矩阵乘法来实现1×11\times 11×1卷积。这里需要在矩阵乘法运算前后对数据形状做一些调整。

def corr2d_multi_in_out_1x1(X, K):c_i, h, w = X.shapec_o = K.shape[0]X = X.view(c_i, h * w)K = K.view(c_o, c_i)Y = torch.mm(K, X)  # 全连接层的矩阵乘法return Y.view(c_o, h, w)

经验证,做1×11\times 11×1卷积时,以上函数与之前实现的互相关运算函数corr2d_multi_in_out等价。

X = torch.rand(3, 3, 3)
K = torch.rand(2, 3, 1, 1)Y1 = corr2d_multi_in_out_1x1(X, K)
Y2 = corr2d_multi_in_out(X, K)(Y1 - Y2).norm().item() < 1e-6

输出:

True

在之后的模型里我们将会看到1×11\times 11×1卷积层被当作保持高和宽维度形状不变的全连接层使用。于是,我们可以通过调整网络层之间的通道数来控制模型复杂度。

小结

  • 使用多通道可以拓展卷积层的模型参数。
  • 假设将通道维当作特征维,将高和宽维度上的元素当成数据样本,那么1×11\times 11×1卷积层的作用与全连接层等价。
  • 1×11\times 11×1卷积层通常用来调整网络层之间的通道数,并控制模型复杂度。

pytorch学习笔记(二十一):Channels相关推荐

  1. PyTorch学习笔记(二)——回归

    PyTorch学习笔记(二)--回归 本文主要是用PyTorch来实现一个简单的回归任务. 编辑器:spyder 1.引入相应的包及生成伪数据 import torch import torch.nn ...

  2. python3.4学习笔记(二十一) python实现指定字符串补全空格、前面填充0的方法

    python3.4学习笔记(二十一) python实现指定字符串补全空格.前面填充0的方法 Python zfill()方法返回指定长度的字符串,原字符串右对齐,前面填充0. zfill()方法语法: ...

  3. Mr.J-- jQuery学习笔记(二十一)--模拟微博页面

    先看之前的节点操作方法:Mr.J-- jQuery学习笔记(二十)--节点操作方法 Mr.J-- jQuery学习笔记(五)--属性及属性节点 Mr.J-- jQuery学习笔记(十一)--事件委托  ...

  4. kvm虚拟化学习笔记(二十一)之KVM性能优化学习笔记

    本学习笔记系列都是采用CentOS6.x操作系统,KVM虚拟机的管理也是采用virsh方式,网上的很多的文章都基于ubuntu高版本内核下,KVM的一些新的特性支持更好,本文只是记录了CentOS6. ...

  5. PyTorch 学习笔记(十一):循环神经网络(RNN)

    对于人类而言,以前见过的事物会在脑海中留下记忆,虽然随后记忆会慢慢消失,但是每当经过提醒,人们往往可以重拾记忆.在神经网络中也是一样,之前介绍的CNN模型都是与时间序列无关的模型,它有明显的局限性,就 ...

  6. pytorch学习笔记(十一):pytorch实现多层感知机

    下面我们使用PyTorch来实现上一节中的多层感知机.首先导入所需的包或模块. import torch from torch import nn from torch.nn import init ...

  7. linux驱动开发学习笔记二十一:异步通知

    一.异步通知简介 我们首先来回顾一下"中断",中断是处理器提供的一种异步机制,我们配置好中断以后就可以让处理器去处理其他的事情了,当中断发生以后会触发我们事先设置好的中断服务函数, ...

  8. opencv学习笔记二十一:使用HSV颜色空间实现颜色识别

    一.颜色空间介绍        RGB 颜色空间是大家最熟悉的颜色空间,即三基色空间,任何一种颜色都可以由该三种 颜色混合而成.然而一般对颜色空间的图像进行有效处理都是在 HSV 空间进行的,HSV( ...

  9. IOS学习笔记二十一(NSDictionary、NSMutableDictionary)

    1.NSDictionary.NSMutableDictionary 可以理解为java里面的map,一个key对应一个value,key不可以重复 NSDictionary不可变,NSMutable ...

  10. java自定义一个timeout,Timeout操作符 RxJava 学习笔记二十一

    timeout用于检测在给定时间内observables没有及时响应.如果指定的时间量没有发出任何项目,则超时会使observables失败并出现TimeoutException. 我们将从debou ...

最新文章

  1. android 绑定端口号,android 获取IP端口号等地址
  2. 【BZOJ】1692: [Usaco2007 Dec]队列变换
  3. TestNG+ReportNG+Maven优化测试报告
  4. 青岛三网融合试点:三屏合一切入
  5. c语言指针详解(概念示例)
  6. Fusion组件库是如何支持多语言能力的
  7. linux-命令模式-光标定位-编辑中20.22
  8. 不要在循环,条件或嵌套函数中调用 Hook
  9. 开培训会没人来,是正常的
  10. 计算机论文物业管理系统,小区物业管理系统的设计与实现(计算机毕业设计)...
  11. Golang 流媒体音视频网络传输开源项目-LAL
  12. 企业微信网页应用开发 - 异步请求
  13. Python-Pandas-Excel/CSV 数据处理大全整理 (二)
  14. vue项目总使用高德API的轨迹展示巡航
  15. Photoshop抠图大决战
  16. 矩阵的转置与矩阵的逆
  17. Flex在线文档阅读器::pdf、doc、docx、xls、xlsx、ppt、pptx、htm、txt、rtf、epub、csv、xdoc等
  18. Elasticsearch重建索引
  19. 美国凯斯西储大学计算机硕士专业怎么样,体现优势 收获凯斯西储大学计算机专业offer...
  20. SpringBoot实现分页查询

热门文章

  1. 绕过路由系统 (Bypassing the Routing System)| 高级路由特性
  2. 丰富的else语句及简洁的with语句 - 零基础入门学习Python034
  3. 调整Linux磁盘分区大小
  4. 代码测试:简单用户注册信息验证
  5. 追加easyui元素,完成后调用$.parser.parse()方法渲染
  6. Count on a tree SPOJ - COT
  7. 自定义xadmin后台首页
  8. CSS定位属性(position)
  9. SublimeText3 插件的使用和本身的配置
  10. ASP.NET路由系统实现原理:HttpHandler的动态映射