20/76-卷积,填充,步幅,多通道输入输出

19/76

卷积层总结
1、卷积层将输入矩阵和核矩阵进行交叉相关,加上偏移所得到输出。
2、核矩阵和偏移是可学习的参数。
3、核矩阵的大小是超参数。

import torch
from torch import nndef corr2d(X, K):  # 本函数已保存在d2lzh_pytorch包中方便以后使用,x是输入,k是核矩阵h, w = K.shapeY = torch.zeros((X.shape[0] - h + 1, X.shape[1] - w + 1))for i in range(Y.shape[0]):for j in range(Y.shape[1]):Y[i, j] = (X[i: i + h, j: j + w] * K).sum()return Y'''
X = torch.tensor([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
K = torch.tensor([[0, 1], [2, 3]])
print(corr2d(X, K))
'''#二维卷积层
class Conv2D(nn.Module):def __init__(self, kernel_size):super(Conv2D, self).__init__()self.weight = nn.Parameter(torch.randn(kernel_size))self.bias = nn.Parameter(torch.randn(1))def forward(self, x):return corr2d(x, self.weight) + self.bias#物体边缘检测,-1代表黑到白色的转变X1 = torch.ones(6, 8)
X1[:, 2:6] = 0
K1 = torch.tensor([[1, -1]])
Y1 = corr2d(X1, K1)
print(Y1)
#Y = corr2d(X.t(), K)检测不出来,x转置之后#不知道k,从x到y中学习
# 4. 学习卷积核
# 当有了更复杂数值的卷积核,或者连续的卷积层时,我们不可能手动设计滤波器。那么我们是否可以学习由X生成Y的卷积核
# 构造一个二维卷积层,它具有1个输出通道和形状为(1,2)的卷积核
conv2d = nn.Conv2d(1,1, kernel_size=(1, 2), bias=False)# 这个二维卷积层使用四维输入和输出格式(批量大小、通道、高度、宽度),
# 其中批量大小和通道数都为1
X = X1.reshape((1, 1, 6, 8))
Y = Y1.reshape((1, 1, 6, 7))
lr = 3e-2  # 学习率for i in range(30):Y_hat = conv2d(X)l = (Y_hat - Y) ** 2conv2d.zero_grad()l.sum().backward()# 迭代卷积核conv2d.weight.data[:] -= lr * conv2d.weight.gradif (i + 1) % 2 == 0:print(f'epoch {i+1}, loss {l.sum():.3f}')# 我们所学的卷积核的权重张量
print(conv2d.weight.data.reshape((1, 2)))

填充:在输入周围添加额外的行或列
一圈0.
通常填充的是核的长-1

填充和步幅都是卷积层的超参数。
填充在输入周围添加额外的行或列,来控制输出形状的减少量。
步幅是每次滑动核窗口时的行或列,成倍减少形状。

import osimport torch
from torch import nn
os.environ["KMP_DUPLICATE_LIB_OK"] = "TRUE"# 为了方便起见,我们定义了一个计算卷积层的函数。
# 此函数初始化卷积层权重,并对输入和输出提高和缩减相应的维数
def comp_conv2d(conv2d, X):# 这里的(1,1)表示批量大小和通道数都是1X = X.reshape((1, 1) + X.shape)Y = conv2d(X)# 省略前两个维度:批量大小和通道return Y.reshape(Y.shape[2:])# 请注意,这里每边都填充了1行或1列,因此总共添加了2行或2列
conv2d = nn.Conv2d(1, 1, kernel_size=3, padding=1)
X = torch.rand(size=(8, 8))
print(comp_conv2d(conv2d, X).shape)# 如下示例中,我们使用高度为5,宽度为3的卷积核,高度和宽度两边的填充分别为2和1
conv2d = nn.Conv2d(1, 1, kernel_size=(5, 3), padding=(2, 1))
print(comp_conv2d(conv2d, X).shape)# 我们将高度和宽度的步幅设置为2,从而将输入的高度和宽度减半
# 在输入图像的边界填充元素称为填充(padding) 每次滑动元素的数量称为步幅(stride)
conv2d = nn.Conv2d(1, 1, kernel_size=3, padding=1, stride=2)
print(comp_conv2d(conv2d, X).shape)conv2d = nn.Conv2d(1, 1, kernel_size=(3, 5), padding=(0, 1), stride=(3, 4))
print(comp_conv2d(conv2d, X).shape)# 在实践中,我们很少使用不一致的步幅或填充

多通道输入输出:
输出通道是卷积层的超参数。
每个输入通道有独立的二维卷积核,所有通道结果相加得到一个输出通道结果。
每个输出通道有独立的三维卷积核。

import osimport torch
from torch import nn
from d2l import torch as d2l
os.environ["KMP_DUPLICATE_LIB_OK"] = "TRUE"# 1. 多输入通道(互相关)
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]]])
print(corr2d_multi_in(X, K))
#56,72,104 120
# 2. 多输出通道
def corr2d_multi_in_out(X, K):# 迭代“K”的第0个维度,每次都对输入“X”执行互相关运算。# 最后将所有结果都叠加在一起#print(torch.stack([corr2d_multi_in(X, k) for k in K], 0))return torch.stack([corr2d_multi_in(X, k) for k in K], 0)
K = torch.stack((K, K + 1, K + 2), 0)#核多了k+1和k+2
print(K)
print(K.shape)
print(corr2d_multi_in_out(X, K))# 3. 1X1卷积层 等价于一个全连接
def corr2d_multi_in_out_1x1(X, K):c_i, h, w = X.shapeprint('c_i: ', c_i)  # 输入的通道数print('h: ', h)  # 输入的高print('w: ', w)  # 输入的宽c_o = K.shape[0]  # 卷积核的通道数X = X.view(c_i, h * w)  # 3 * 9K = K.view(c_o, c_i)  # 2 * 3Y = torch.mm(K, X)  # 全连接层的矩阵乘法return Y.view(c_o, h, w)X = torch.normal(0, 1, (3, 3, 3))
K = torch.normal(0, 1, (2, 3, 1, 1))Y1 = corr2d_multi_in_out_1x1(X, K)
Y2 = corr2d_multi_in_out(X, K)
assert float(torch.abs(Y1 - Y2).sum()) < 1e-6#print(float(torch.abs(Y1 - Y2).sum()))# (Y1 - Y2).norm().item() < 1e-6 为真,不会报错

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

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

相关文章

难道说 IT行业的下一个风口是鸿蒙开发吗?

按往年的习俗&#xff0c;在年底之季有很多HC都会缩减&#xff0c;尤其当下各种裁员的情况下&#xff0c;不管你是在哪个传统开发行业&#xff0c; 如&#xff1a;C/C、Java、前端、后端……等多少都会一股互联网寒流的影响。而今年却出现了一个怪现象&#xff0c;有个岗位在这…

微信小程序打包上线流程

微信公众平台 https://mp.weixin.qq.com/注册一个小程序账号&#xff08;小程序和公众号&#xff0c;服务号等&#xff0c;不互通&#xff09;按流程注册开发&#xff0c;开发设置&#xff0c;小程序ID 发布流程 4.微信开发者工具点击上传 5. 上传代码 6. 提交审核 7. 发布 在…

Ubuntu1804下如何切换python版本

Ubuntu1804下如何切换python版本 目录 1 如何查看当前python版本 2 如何配置默认python版本 2.1 配置python2为默认版本 2.2 配置python3为默认版本 3 小结 1 如何查看当前python版本 可以用过以下命令&#xff0c;查看当前python默认版本&#xff1a; python --version2 …

【欢迎您的到来】这里是开源库get_local_info作者的付费专栏

您好&#xff0c; 我是带剑书生&#xff0c;开源库get_local_info的作者&#xff0c;欢迎您的到来&#xff0c;这里是我的付费专栏&#xff0c;会用更简洁的语言&#xff0c;更通俗的话语&#xff0c;来帮助您更好的学习rust&#xff0c;这里不仅仅讲解Rust在某些应用功能实现上…

Java可视化物联网智慧工地综合云平台源码 私有化部署

智慧工地平台围绕建筑施工人、物、事的安全管理为核心&#xff0c;对应研发了劳务实名制、视频监控、扬尘监测、起重机械安全监测、安全帽监测等功能一体化管理的解决方案。 智慧工地是聚焦工程施工现场&#xff0c;紧紧围绕人、机、料、法、环等关键要素&#xff0c;综合运用…

智慧矿山知识点总结

目录 1.第一章数字矿山的定义、基本特征和功能数字矿山的框架结合专业&#xff0c;如何发挥专业优势参与数字矿山建设&#xff08;GPT&#xff09; 2.第二章矿区地质构造和生态环境信息都包括哪些内容地球探测信息技术分类矿山品味与储量矿量估算 3.第三章矿山空间信息获取的仪…

Linux grep命令教程:强大的文本搜索工具(附案例详解和注意事项)

Linux grep命令介绍 grep (Global Regular Expression Print)命令用来在文件中查找包含或者不包含某个字符串的行&#xff0c;它是强大的文本搜索工具&#xff0c;并可以使用正则表达式进行搜索。当你需要在文件或者多个文件中搜寻特定信息时&#xff0c;grep就显得无比重要啦…

RT-Thread Studio学习(十四)ADC

RT-Thread Studio学习&#xff08;十四&#xff09;ADC 一、简介二、新建RT-Thread项目并使用外部时钟三、启用ADC四、测试 一、简介 本文将基于STM32F407VET芯片介绍如何在RT-Thread Studio开发环境下使用ADC设备。硬件及开发环境如下&#xff1a; OS WIN10STM32F407VET6STM…

基于Springboot的摄影分享网站系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的摄影分享网站系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

Python文件自动化处理

os模块 Python标准库和操作系统有关的操作创建、移动、复制文件和文件夹文件路径和名称处理 路径的操作 获取当前Python程序运行路径不同操作系统之间路径的表示方式 windows中采用反斜杠(\)作为文件夹之间的分隔符 Mac和Linux中采用斜杠(/)作为文件夹之间的分隔符 把文件…

算法专题:差分数组

文章目录 前置知识构建一个差分数组操作一个连续区间 练习习题1094. 拼车1109. 航班预订统计1450. 在既定时间做作业的学生人数2406. 将区间分为最小组数2381. 字母移位II2772. 使数组中的所有元素都等于零 前置知识 构建一个差分数组 void func(int * lb1,int len) {int * l…

详解React与Vue的性能对比

React 和 Vue 是当前最流行的前端开发框架之一。它们都具有高度的灵活性和可扩展性&#xff0c;但在某些方面有所不同。在本篇文章中&#xff0c;我将详细介绍 React 和 Vue 这两个技术&#xff0c;并比较它们的优点和缺点。 目录 1. React&#xff1a; 1.1 优点&#xff1a; …

Qt之QxOrm

QxORM介绍 QxORM库是一种为了C/Qt开发者服务的关系对象映射型数据库的类库&#xff0c;每个类都有简单的C设置函数&#xff0c;你可以接触到如下特性&#xff1a; 持久性&#xff1a;支持最常见的数据库&#xff0c;如 SQLite、MySQL、PostgreSQL、Oracle、MS SQL Server、Mon…

2023年第十四届蓝桥杯软件赛省赛总评

报名明年4月蓝桥杯软件赛的同学们&#xff0c;如果你是大一零基础&#xff0c;目前懵懂中&#xff0c;不知该怎么办&#xff0c;可以看看本博客系列&#xff1a;备赛20周合集 20周的完整安排请点击&#xff1a;20周计划 每周发1个博客&#xff0c;共20周。 在QQ群上交流答疑&am…

VCG 网格清洗之移除小组件

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 基于之前连通性的思路,我们可以很容易获取到许多连通的面片集合,这里我们根据指定的数量阈值来剔除较小的面片集合,以此达到网格清洗的目的。 二、实现代码 //VCG #include <vcg/complex/algorithms/create/…

[AI争霸] 普通人看ChatGPT和文心一言那个更好

文章目录 引言便利性准确性总结 引言 从2022/2/24号openAI正式发布chatgpt第一个版本以来&#xff0c;到2023年中旬openAI宣布chatgpt成为用户增长量最快的软件&#xff0c;随后掀起的大模型热。随后国内的各大厂商纷纷推出自己的大模型&#xff0c;首当其冲的就是百度的文心一…

Springboot整合Canal -- Canal 多客户端

文章目录 前言一、批量注册bean定义&#xff1a;1.1 定义Canal注解&#xff1a;1.2 canal bean定义注册&#xff1a;1.3 canal bean 生成&#xff1a; 二、canal客户端获取mysql数据变动2.1 canal客户端2.2 消息处理 总结参考 前言 在项目中如果想要多个Canal 客户端通过tcp直…

Redis 消息队列和发布订阅

文章目录 基本模式生产者消费者原理&模型redis实现java实现 发布者订阅者原理&模型redis实现java实现 stream模式原理&模型工作原理redis实现Java实现 选型外传 基本模式 采用redis 三种方案&#xff1a; ● 生产者消费者&#xff1a;一个消息只能有一个消费者 ●…

Smart Tomcat

Smart Tomcat插件可以让idea图形化界面让代码部署到tomcat上达成一键打包部署的过程 下面是idea安装使用Smart Tomcat的过程 我们直接在plugins(插件)里搜索Tomcat 然后下载第一个 然后点击Apply(应用) 在一个项目中 第一次使用时要进行配置Smart Tomcat Name 可以不配置…

vscode安装和基本设置

目录 vscode安装和基本设置1.HTML标签2.标签属性3.HTML基本结构4.安装vscode5.安装Live Server插件6.HTML注释7.文档说明8.HTML字符编码9.HTML设置语言10.HTML标准结构 vscode安装和基本设置 1.HTML标签 标签 又称 元素&#xff0c;是HTML的基本组成单位。标签分为&#xff1…