【Deep Learning 7】深度可分离卷积

🌞欢迎来到Pytorch的世界 
🌈博客主页:卿云阁

💌欢迎关注🎉点赞👍收藏⭐️留言📝

🌟本文由卿云阁原创!

📆首发时间:🌹2024年2月21日🌹

✉️希望可以和大家一起完成进阶之路!

🙏作者水平很有限,如果发现错误,请留言轰炸哦!万分感谢!


目录

普通卷积

黑白图像中的卷积

填充

步长为3

计算公式

多维卷积

多个卷积核

卷积的三种模式

Pytorch卷积层原理和示例

nn.conv1d

nn.conv2d

深度可分离卷积


普通卷积

黑白图像中的卷积
填充

步长为3

计算公式

多维卷积

多个卷积核

卷积的三种模式

        深度学习框架中通常会实现三种不同的卷积模式,分别是 SAME、VALID、FULL。这三种模式的核心区别在于卷积核进行卷积操作的移动区域不同,进而导致输出的尺寸不同。我们以一个例子来看这三种模式的区别,输入图片的尺寸是 5×5 ,卷积核尺寸是 3×3 ,stride 取 1。

  • FULL 模式

FULL 模式下卷积核从与输入有一个点的相交的地方就开始卷积。如下图所示,蓝框的位置就是卷积核第一个卷积的地方,灰色部分是为了卷积能够正常进行的 padding(一般填 0)。因此 FULL 模式下卷积核移动区域最大,卷积后输出的尺寸也最大。

  • VALID 模式

VALID 模式与 FULL 模式相反,在整个卷积核与输入重叠的地方才开始卷积操作,因此不需要 padding,输出的尺寸也最小。

  • SAME 模式

SAME 模式是最常用的一种模式,SAME 的意思是卷积后输出的尺寸与输入尺寸保持一致(假定 stride 为 1)。通过将卷积核的中心与输入的第一个点进行对齐确定卷积核起始位置,然后补齐对应 padding 即可。如下图所示,可以看到卷积输出的尺寸与出入保持一致。

SAME 模式下当卷积核边长为偶数时,可以通过在其中一边增加多一行(列)padding,即不对称的 padding 实现输出尺寸与输入尺寸保持一致,如下图所示(卷积核尺寸为 2×2 )

以上三种模式区别在于卷积核进行卷积操作的移动区域不同,其实是确定了所需的 padding。各种模式 padding 计算如下:

def get_padding(inputs, ks, mode="SAME"):"""Return padding list in different modes.params: inputs (input array)params: ks (kernel size) [p, q]return: padding list [n,m,j,k]"""pad = Noneif mode == "FULL":pad = [ks[0] - 1, ks[1] - 1, ks[0] - 1, ks[1] - 1]elif mode == "VALID":pad = [0, 0, 0, 0]elif mode == "SAME":pad = [(ks[0] - 1) // 2, (ks[1] - 1) // 2,(ks[0] - 1) // 2, (ks[1] - 1) // 2]if ks[0] % 2 == 0:pad[2] += 1if ks[1] % 2 == 0:pad[3] += 1else:print("Invalid mode")return pad

     确定了输入尺寸、卷积核尺寸、padding 以及 stride,输出的尺寸就被确定下来,可以由以下公式计算。

Pytorch卷积层原理和示例
nn.conv1d

conv1d是一维卷积,它和conv2d的区别在于只对宽度进行卷积,对高度不卷积。

函数定义:

torch.nn.functional.conv1d(input, weight, bias=None, stride=1, padding=0, dilation=1, groups=1)

参数说明:

  • input:输入的Tensor数据,格式为(batch,channels,W),三维数组,第一维度是样本数量,第二维度是通道数或者记录数。三维度是宽度。
  • weight:卷积核权重,也就是卷积核本身。是一个三维数组,(out_channels, in_channels/groups, kW)。out_channels是卷积核输出层的神经元个数,也就是这层有多少个卷积核;in_channels是输入通道数;kW是卷积核的宽度。
  • bias:位移参数,可选项,一般也不用管。
  • stride:滑动窗口,默认为1,指每次卷积对原数据滑动1个单元格。
  • padding:是否对输入数据填充0。Padding可以将输入数据的区域改造成是卷积核大小的整数倍,这样对不满足卷积核大小的部分数据就不会忽略了。通过padding参数指定填充区域的高度和宽度,默认0(就是填充区域为0,不填充的意思)
  • dilation:卷积核之间的空格,默认1。
  • groups:将输入数据分组,通常不用管这个参数,没有太大意义。

代码:

import torch
from torch.autograd import Variable
import torch.nn as nn
import torch.nn.functional as Fa=range(16)
x = Variable(torch.Tensor(a))
'''
a: range(0, 16)
x: tensor([ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10., 11., 12., 13.,14., 15.])
'''x=x.view(1,1,16)
'''
x variable: tensor([[[ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10., 11., 12., 13., 14., 15.]]])
'''b=torch.ones(3)
b[0]=0.1
b[1]=0.2
b[2]=0.3
weights = Variable(b)
weights=weights.view(1,1,3)
'''
weights: tensor([[[0.1000, 0.2000, 0.3000]]])
'''y=F.conv1d(x, weights, padding=0)
'''
y: tensor([[[0.8000, 1.4000, 2.0000, 2.6000, 3.2000, 3.8000, 4.4000, 5.0000, 5.6000, 6.2000, 6.8000, 7.4000, 8.0000, 8.6000]]])
'''
nn.conv2d

函数定义

nn.Conv2d(self, in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True))

参数:

  • in_channel: 输入数据的通道数,例RGB图片通道数为3;
  • out_channel: 输出数据的通道数,这个根据模型调整;
  • kennel_size: 卷积核大小,可以是int,或tuple;kennel_size=2,意味着卷积大小(2,2),                              kennel_size=(2,3),意味着卷积大小(2,3)即非正方形卷积
  • stride:步长,默认为1,与kennel_size类似,stride=2,意味着步长上下左右扫描皆为2,                         stride=(2,3),左右扫描步长为2,上下为3;
  •  padding: 零填充

代码

import torch
import torch.nn as nn
from torch.autograd import Variabler = torch.randn(5, 8, 10, 5) # batch, channel , height , width
print(r.shape)r2 = nn.Conv2d(8, 14, (3, 2), (2,1))  # in_channel, out_channel ,kennel_size,stride
print(r2)r3 = r2(r)
print(r3.shape)
torch.Size([5, 8, 10, 5])
Conv2d(8, 14, kernel_size=(3, 2), stride=(2, 1))
torch.Size([5, 14, 4, 4])

深度可分离卷积

论文:《Xception: Deep Learning with Depthwise Separable Convolutions》
代码:API

逐深度卷积

不同于原始卷积,深度卷积是一个卷积核负责一个通道,独立地在每个通道上进行空间卷积。因此,深度卷积的输出特征图数量等于输入特征图数量,无法进行有效的维度扩展。

逐点卷积

由于一个特征图仅被一个滤波器卷积,无法有效的利用不同通道在相同空间位置上的特征信息,由此加入了逐点卷积。点卷积主要是要1×1卷积构成,负责将深度卷积的输出按通道投影到一个新的特征图上。

 重复多次1x1的卷积操作(如下图为128次),则最后便会得到一个深度的卷积结果。

代码实现:

class DeepWise_PointWise_Conv(nn.Module):def __init__(self, in_ch, out_ch):super(DeepWise_PointWise_Conv, self).__init__()# 深度卷积层(Depthwise Convolution)self.depth_conv = nn.Conv2d(in_channels=in_ch,          # 输入通道数out_channels=in_ch,         # 输出通道数,每个输入通道对应一个输出通道kernel_size=3,               # 卷积核大小,这里是3x3的深度卷积核stride=1,                    # 步长padding=1,                   # 填充groups=in_ch                 # 输入通道数等于组数,每个输入通道分配一个卷积核)# 点卷积层(Pointwise Convolution)self.point_conv = nn.Conv2d(in_channels=in_ch,          # 输入通道数,这里等于深度卷积层的输出通道数out_channels=out_ch,        # 输出通道数,决定了最终的特征图数量kernel_size=1,               # 卷积核大小为1x1,即点卷积stride=1,                    # 步长padding=0,                   # 无填充groups=1                     # 输入通道数等于组数,每个输入通道独享一个卷积核)def forward(self, input):# 深度卷积out = self.depth_conv(input)# 点卷积out = self.point_conv(out)return out

#将普通卷积替换成深度可分离卷积
nn.Conv2d(32,128,kernal_size=3,stride=1,padding=1)DepthWiseConv(32,128)


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/694068.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CTFshow web(sql注入171-175)

web171 还得先爆表名 -1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema database()-- 注意这里已经提示你了,只要知道是ctfshow_user,就可以拿到flag -1 union select 1,2,password from ctfshow_user…

Python第十九章(模块)

系统的模块库一般处于外部库中的Lib里面 一。导入模块的方式: 1.方式一: 导入:import 模块名1,模块名2 调用:模块名 . 功能名() 2.方式二: 导入:from 模块名 import 功能1,功能…

(每日持续更新)jdk api之ObjectOutput基础、应用、实战

博主18年的互联网软件开发经验,从一名程序员小白逐步成为了一名架构师,我想通过平台将经验分享给大家,因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验,晚上进行用心精简、整理、总结、定稿&…

2024.2.21

1、用多线程进行文件拷贝 #include<myhead.h>//参数结构体创建 typedef struct INFO {const char *srcfile;const char *destfile;int length; }Info;//定义获取文件长度的函数 int get_file_len(const char *srcfile,const char *destfile){int srcfd,destfd;//只读形式…

基于vue的个性化推荐餐饮系统Springboot

项目&#xff1a;基于vue的个性化推荐餐饮系统Springboot 摘要 现代信息化社会下的数据管理对活动的重要性越来越为明显&#xff0c;人们出门可以通过网络进行交流、信息咨询、查询等操作。网络化生活对人们通过网上购物也有了非常大的考验&#xff0c;通过网上进行点餐的人也…

ctfshow web入门 web141-145

1.web141 ^\w$表示在开头和末尾匹配字母数字_&#xff0c;传入的v3值不能有字母数字_&#xff0c;即无字母的命令执行 php中1-phpinfo()是可以执行的&#xff0c;加减乘除都可以实现 这里或&#xff0c;异或&#xff0c;取反等运算都可以 这里采用羽师傅的异或脚本生成paylo…

用十篇论文聊聊关于使用LLM做query Rewrite的问题

一、什么是query改写&#xff1f; query改写其实理解起来很简单&#xff0c;就是把原始的query经历一系列的操作&#xff0c;然后变成另外一个query&#xff0c;从而达到提升召回率和准确率的效果。 query改写的过程中&#xff0c;这一系列的操作&#xff0c;其实是围绕两个方面…

网络原理 - HTTP/HTTPS(4)

HTTP响应详解 认识"状态码"(status code) 状态码表示访问一个页面的结果.(是访问成功,还是失败,还是其它的一些情况...).(响应结果如何) 学习状态码 -> 为了调试问题. 写服务器时,按照状态码的含义正确使用. 200 OK 这是最常见的状态码,表示访问成功. 抓包抓…

面试经典150题——单词规律

"Dont wait. The time will never be just right." - Napoleon Hill 1. 题目描述 2. 题目分析与解析 首先还是得把题目先读懂&#xff0c;我们直接来看看示例&#xff1a; 根据上面的示例&#xff0c;我们可以看出pattern其实就是表示单词出现的规律&#xff0c;每…

Linux中alarm/setitimer函数(信号函数)

alarm函数 函数原型&#xff1a; unsigned int alarm(unsigned int seconds); 函数描述&#xff1a;设置定时器&#xff08;闹钟&#xff09;。在指定seconds后&#xff0c;内核会给当前进程发送 14&#xff09;SIGALRM信号。进程收到该信号&#xff0c;默认动作终止。每个进程…

git工具

一、命令行工具 二、Git 客户端可视化工具-推荐 1.常用工具 tortoisegit 官网 https://tortoisegit.org/ 推荐 sourcetree 官网https://www.sourcetreeapp.com/ 2.tortoisegit安装 2.1 下载安装包 2.2 下载语言包 2.3 安装 2.4 安装语言包 5.使用 5.1 新建分支 5.2 切换分支…

python基础教程—总结篇

这篇是Python基础教程系列的总结篇&#xff0c;这里这个专栏的地址&#xff1a;《Python教程》 首先必须声明一点&#xff0c;这是基础教程&#xff0c;所以面向的是新人&#xff0c;没有学过Python的同学&#xff0c;所以这套教程并没有涉及到比较难的并发编程模块&#xff0…

数字世界的探索者:计算机相关专业电影精选推荐

目录 推荐计算机专业必看的几部电影 《黑客帝国》 《社交网络》 《乔布斯传》 《心灵捕手》 《源代码》 《盗梦空间》 《头号玩家》 《我是谁&#xff1a;没有绝对安全的系统》 《战争游戏》(WarGames) 《模仿游戏》(The Imitation Game) 《硅谷》(Silicon Valley) …

qt_day3

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//设置账户和密码的登录标签ui->lab1->setPixmap(QPixmap(":/pictrue/wodepeizhenshi.png"));…

51_蓝桥杯_独立按键

一 电路 注意&#xff1a;J5跳帽接到2~3引脚&#xff0c;使按键S4-S5四个按键的另外一端接地&#xff0c;从而成为4个独立按键。 二 独立按键工作原理 三 代码 代码1&#xff1a;按下S7点亮L1指示灯&#xff0c;松开按键&#xff0c;指示灯熄灭&#xff0c;按下S6点亮L2指示灯…

电流回路是分析电路图的基础,看看这个电路你会更明白

任何电器要想开始工作&#xff0c;都离不开供电&#xff0c;而要供电就离不开电源。电源有两个极即:电源正极()、电源负极(-)&#xff0c;电源要实现向负载供电&#xff0c;必须是电源正极()流出电流经负载再流回电源负极(-)&#xff0c;这时可以说这个电路构成了供电电流回路了…

阿里云幻兽帕鲁服务器续费还有优惠吗?老用户续费的价格很贵怎么办?

最近很多人在问&#xff0c;上个月买的阿里云幻兽帕鲁服务器续费是不是没有优惠了&#xff0c;因为他们发现续费的价格比之前贵了很多&#xff0c;之前是不到30元一个月。 其实目前的续费优惠是有的&#xff0c;有但不多&#xff0c;方法就是进入阿里云服务器ECS控制台&#x…

设计模式四:适配器模式

1、适配器模式的理解 适配器模式可以理解为有两个现成的类Adaptee和Target&#xff0c;它们两个是不能动的&#xff0c;要求必须使用B这个类来实现一个功能&#xff0c;但是A的内容是能复用的&#xff0c;这个时候我们需要编写一个转换器 适配器模式 Adaptee&#xff1a;被适…

【C++初阶】类和对象(上)

目录 一.类的引入 1.概念 2.类的定义 (1).语法规范 (2)命名规范 (3)类的访问限定符及封装 ①访问限定符 (4)类的两种定义 ①声明和定义全部放在类体中&#xff0c;需注意&#xff1a;成员函数如果在类中定义&#xff0c;编译器可能会将其当成内联函数处理。 ​编辑…

【IDEA使用安装】如何长期正常使用IDEA,告别弹窗?【2024年亲测】

IDEA最新使用指南 写在前面涉及知识1、官网下载最新版本IDEA2、安装IDEA版本3、正常使用IDEA软件4、作者寄语 写在前面 愉快的假期结束了&#xff0c;当然我们奋斗的步伐不能停止&#xff0c;随即迎来了2024年的全新挑战&#xff0c;学更多的知识&#xff0c;分享更多有用的硬…