全连接卷积

对于单通道卷积的运算,相信大家已经见过不少了

那么在卷积神经网络中,图像的通道数是怎样实现“从 3 到 8” 这样的跳变呢?

接下来以尺寸 5 × 5 的卷积核做一下实验:

import torchc1, c2, k = 3, 8, 5
# 实例化二维卷积, 不使用 padding
conv = torch.nn.Conv2d(in_channels=c1, out_channels=c2,kernel_size=k, bias=False)
# 二维卷积的 weight: [c2, c1, k, k]
weight = conv.weight.data
print('Weight shape:', weight.shape)

使用 Torch 的 Conv2d 可以发现,weight 参数的 shape 是 [8, 3, 5, 5]

[3, 5, 5] 的图像(记为 img)经过该卷积运算后得到 [8, 1, 1],以此为例,提出猜想:

  • img[..., r, c] 的 shape 为 [3, ],即代表该像素点 3 个通道的值
  • weight[..., r, c] 的 shape 为 [8, 3],代表该卷积核的感受野中,第 r 行第 c 列的参数
  • 使用矩阵乘法运算 weight[..., r, c] × img[..., r, c],结果是 shape 为 [8, ] 的张量,代表该像素点 8 个通道的值;如果将所有像素点 8 个通道的值相加,即可得到此次卷积结果

写出验证的函数如下:

# 测试使用的图像, 卷积后: [c1, k, k] -> [c2, 1, 1]
img = torch.rand([1, c1, k, k])def torch_conv():return conv(img).view(-1)def guess_for_FCconv():''' 全连接卷积 (标准卷积)'''result = torch.zeros(c2)# 对各个像素点进行运算for r in range(k):for c in range(k):# 对应像素点的各通道值: [c1, ]pixel = img[..., r, c].view(-1)# 卷积核中对应像素点的参数: [c2, c1]linear = weight[..., r, c]# 该像素点对各个通道的贡献: [c2, c1] × [c1, ] -> [c2, ]result += linear @ pixelreturn resultprint('Torch:', torch_conv())
print('Guess:', guess_for_FCconv())

可以看到,Torch 的运算结果和我的运算结果是一样的,猜想成立

Weight shape: torch.Size([8, 3, 5, 5])
Torch: tensor([-0.2874, -0.4310,  0.1660, -0.0021,  0.6042, -0.0716,  0.0821,  0.0322],
       grad_fn=<ViewBackward>)
Guess: tensor([-0.2874, -0.4310,  0.1660, -0.0021,  0.6042, -0.0716,  0.0821,  0.0322])

提出这个运算方式,是为了帮助大家更好地理解卷积

在实际的部署中,是不是使用这样的方式运算我就不清楚了

分组卷积

当输入通道数为 4,输出通道数为 8 时,设置卷积核组数为 2

则 weight 参数的 shape 为 [8, 2, 5, 5],亦可表示成 [8, 4/2, 5, 5]

import torchc1, c2, k, g = 4, 8, 5, 2
# 实例化二维卷积, 不使用 padding
conv = torch.nn.Conv2d(in_channels=c1, out_channels=c2,kernel_size=k, groups=g, bias=False)
# 二维卷积的 weight: [c2, c1/g, k, k]
weight = conv.weight.data
print('Weight shape:', weight.shape)# 测试使用的图像, 卷积后: [c1, k, k] -> [c2, 1, 1]
img = torch.rand([1, c1, k, k])

输入通道数被进行了分组,那么图像在运算时,在通道上必被分离

而输出通道数没有进行分组,图像在运算中是否被分离呢?

[4, 5, 5] 的图像(记为 img)经过该卷积运算后得到 [8, 1, 1],以此为例,提出猜想:

  • 对图像的通道数进行分组:img 可表示成 [2, 2, 5, 5],即 2 张 [2, 5, 5] 的图像
  • 对 weight 的输出通道数进行分组:weight 可表示成 [2, 4, 2, 5, 5],即 2 个 weight 为 [4, 2, 5, 5] 的全连接卷积
  • 分别使用 [4, 2, 5, 5] 的全连接卷积可得到 2 张 [4, 1, 1],拼接在一起后得到 [8, 1, 1]

写出验证的函数如下:

# 测试使用的图像, 卷积后: [c1, k, k] -> [c2, 1, 1]
img = torch.rand([1, c1, k, k])def torch_conv():return conv(img).view(-1)def guess_for_GConv():''' 分组卷积'''# 将 c2 个通道表示成 g × c2/gresult = torch.zeros([g, c2 // g])# 对图像的通道进行分组: [1, c1, k, k] -> [g, c1/g, k, k]img_ = img.view(g, -1, k, k)# 分组取出卷积核权值: [c2, c1/g, k, k] -> [g, c2/g, c1/g, k, k]for i, w in enumerate(weight.view(g, -1, c1//g, k, k)):# 对各个像素点进行运算for r in range(k):for c in range(k):# 对应像素点的各通道值: [c1/g, ]pixel = img_[i, :, r, c].view(-1)# 卷积核中对应像素点的参数: [c2/g, c1/g]linear = w[..., r, c]# 该像素点对各个通道的贡献: [c2/g, c1/g] × [c1/g, ] -> [c2/g, ]result[i] += linear @ pixelreturn result.view(-1)print('Torch:', torch_conv())
print('Guess:', guess_for_GConv())

显而易见,两个函数的运算结果是一样的,猜想成立

Weight shape: torch.Size([8, 2, 5, 5])
Torch: tensor([ 0.1674, -0.1527,  0.4059, -0.3422, -0.2362, -0.4508,  0.3286,  0.3232],
       grad_fn=<ViewBackward>)
Guess: tensor([ 0.1674, -0.1527,  0.4059, -0.3422, -0.2362, -0.4508,  0.3286,  0.3232])

Torch 二维多通道卷积运算方式相关推荐

  1. python二维图颜色函数_Python scipy的二维图像卷积运算与图像模糊处理操作示例

    本文实例讲述了Python scipy的二维图像卷积运算与图像模糊处理操作.分享给大家供大家参考,具体如下: 二维图像卷积运算 一 代码 import numpy as np from scipy i ...

  2. 【CV】图像卷积计算即二维矩阵卷积(Python)

    卷积与数字图像 什么是卷积 一维线性卷积 参数'full' 参数'same' 参数'valid' 二维线性卷积 什么是卷积 一维线性卷积 线性卷积(linear convolution) 在时域描述线 ...

  3. 二维反卷积 matlab,二维反卷积的实现(实际意义不明确)

    前言 一维反卷积(deconv),可以很好的实现一维卷积的反过程!但是二维反卷积就很难恢复了!为什么呢?因为我们知道二维卷积计算的过程就是:卷积核不断滑动,卷积核不断与原始数据中的小矩阵做" ...

  4. python顺序表转置_Python:二维列表下标互换方式(矩阵转置)

    Python:二维列表下标互换方式(矩阵转置) 发布时间:2020-08-20 04:13:38

  5. PHP - 二维数组合并的方式

    1.应用场景 有时需要二维数组(如从数据库查询的结果集)处理,如排序,过滤后才重新合并. 2.学习/实践 1. 文档 TBD 2. 整理输出 思路 都是循环遍历,只不过是选择使用语言自带的函数来实现, ...

  6. 数组: 数组的遍历: 二维数组: 二维数组的遍历方式:

    数组:   变量: 存储单个数据 数组: 存储多个数据数组: 相同数据类型的有序集合一段连续的内存空间特点:1.引用数据类型2.长度一旦确定不可改变3.存储的多个数据要求数据类型一致4.数组是有序的索 ...

  7. 通过具体的例子说明一维和二维的相关运算、卷积运算究竟是怎么做的。

    在图像处理中,大量的算法中用到的运算其实都是相关运算和卷积运算. 所以,我们很有必要知道相关运算.卷积运算究竟是怎么做的. 本篇博文通过具体而简单的例子向大家说明相关运算.卷积运算究竟是怎么做的. 0 ...

  8. 二维图像卷积之后尺寸计算

    二维图像与卷积核相乘之后,尺寸会发生变化, 本文主要介绍卷积之后尺寸的两种计算方式. 以宽度为例,高度计算方式相同:             图像宽度:w,卷积核宽度:fw,滑动步长:step [第一 ...

  9. java 怎么做卷积运算,入门教程之算法系列(二):卷积运算与模糊操作

    卷积在信号处理领域有极其广泛的应用,也有严格的物理和数学定义. OpenCV中对图像进行模糊操作,其背后的原理就是卷积运算,可是究竟卷积运算是什么,模糊的卷积算法又是如何实现的呢?本文将进行讨论.考虑 ...

最新文章

  1. python软件开发-Python
  2. 杂谈:《宫锁心玉》的穿越硬伤
  3. 在灾难发生之时,你在Facebook的社交定位或许能救你一命
  4. OSS.Common获取枚举字典列表标准库支持
  5. [转载] 七龙珠第一部——第063话 悟空大反击
  6. Android :ScaleAnimation
  7. Spring Cloud Config 规范 1
  8. 读取swagger配置文件里的内容
  9. mysql导vertica_vertica系列:数据的导入导出
  10. 字符常量和字符串常量
  11. mzy git学习,分支以及分支合并(四)
  12. DiscuzQ_V3二次开发版本部署文档
  13. 如何理解keras中的shape/input_shape
  14. 金融直播营销,主播必须这样做!
  15. iOS 学习视频 资料集合 (视频 +博客)
  16. python关于excel插入图片
  17. perl/tk_在Perl / Tk中使用高级小部件
  18. 随堂笔记4——文本编辑器Vim
  19. IBM ITS中国区总经理鞠立老师讲女性的职业规划与发展
  20. Gooowild隐私政策

热门文章

  1. 非客观书评(二)——《嵌入式实时操作系统μCOS-Ⅱ》
  2. 债券价格和到期收益率的关系_2017年《证券投资基金》基础知识:当期收益率、到期收益率与债券价格之间的关系...
  3. MC9S12XE 内存分配
  4. php 上传 照片流,怎么样不让你的屏幕截图上传到照片流里面
  5. ff14修改服务器文件,ff14键位设置上传服务器
  6. 如何将浏览器中百度页面的皮肤作为高清图片下载
  7. 3D游戏编程学习笔记(五):与游戏世界交互
  8. 键盘全部变快捷键处理方式
  9. PT857 Winserver 2012 DPK安装报错 api-ms-win-crt-runtime-l1-1-0.dll错误
  10. Spring基础之属性注入总结