李沐pytorch学习-卷积网络及其实现

news2025/1/8 5:34:40

一、卷积定义

        卷积计算过程如图1所示,即输入矩阵和核函数对应的位置相乘,然后相加得到输出对应位置的数。

 图1. 卷积计算过程

        该过程可以形象地从图2中展现。

图2. 二维卷积示意图

二、代码实现

2.1 实现互相关运算

import torch
from torch import nn
from d2l import torch as d2l

def corr2d(X, K): #@save
    """计算二维互相关运算"""
    h, w = K.shape
    Y = 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

        h,w为卷积核的行、列数

        Y为输出矩阵,它的行、列数为X.shape[0] - h + 1和 X.shape[1] - w + 1X.shape[0] 为输入矩阵的行数,X.shape[0] - h 为卷积核可以向右移动的步数,因为移动步数为零时也会计算出一个值,所以 X.shape[0] - h + 1 为输出结果的行数,列数同理。

        X[i:i + h, j:j + w] * K 表示从输入矩阵中提取一个子矩阵,索引范围为\left\{\begin{matrix} i\leqslant row< i+h\\ j\leqslant col< j+w \end{matrix}\right.,即包含左边不包含右边,乘法表示对应元素相乘。

2.2 训练卷积网络的简单实现

import torch
from torch import nn
from d2l import torch as d2l

X = torch.ones((6, 8))
X[:, 2:6] = 0

Y = torch.zeros((6, 7))

# 构造一个二维卷积层,它具有1个输出通道和形状为(1,2)的卷积核
conv2d = nn.Conv2d(1,1, kernel_size=(1, 2), bias=False)

# 这个二维卷积层使用四维输入和输出格式(批量大小、通道、高度、宽度),
# 其中批量大小和通道数都为1
X = X.reshape((1, 1, 6, 8))
Y = Y.reshape((1, 1, 6, 7))
lr = 3e-2 # 学习率

for i in range(10):
    Y_hat = conv2d(X)
    l = (Y_hat - Y) ** 2
    conv2d.zero_grad()
    l.sum().backward()
    # 迭代卷积核
    conv2d.weight.data[:] -= lr * conv2d.weight.grad
    if (i + 1) % 2 == 0:
        print(f'epoch {i+1}, loss {l.sum():.3f}')

三、填充与步幅

        填充(padding)指在输入矩阵周围添加行列,使卷积后得到的结果行列数更多。效果如图3所示。

 图3. 卷积填充示意图

import torch
from torch import nn

# 为了方便起见,我们定义了一个计算卷积层的函数。
# 此函数初始化卷积层权重,并对输入和输出提高和缩减相应的维数
    def comp_conv2d(conv2d, X):
    # 这里的(1,1)表示批量大小和通道数都是1
    X = 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))
comp_conv2d(conv2d, X).shape

# 上下各填充2行,左右各填充1列,总计填充4行2列
conv2d = nn.Conv2d(1, 1, kernel_size=(5, 3), padding=(2, 1))
comp_conv2d(conv2d, X).shape

        步幅(stride)指卷积核每次移动距离,增加步幅可以在不增加卷积核尺寸的条件下使得到的结果行列数更少。效果如图4所示。

图4. 卷积步幅示意图

 

import torch
from torch import nn

# 向右移动的步幅与向下移动的步幅均为2
conv2d = nn.Conv2d(1, 1, kernel_size=3, padding=1, stride=2)

X = torch.rand(size=(8, 8))
print(comp_conv2d(conv2d, X).shape) # 输出 torch.Size([4, 4])

X = torch.rand(size=(8, 8))

# padding之后,size=(8,10),输出行数=1+(8-3)/3=2,输出列数=1+(10-5)/4=2
# 行向移动的stride=3,列向移动的stride=4
conv2d = nn.Conv2d(1, 1, kernel_size=(3, 5), padding=(0, 1), stride=(3, 4))
print(comp_conv2d(conv2d, X).shape) # 输出 torch.Size([2, 2])

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

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

相关文章

CANoe软件Tools中无法找到LDF Explorer

关联文章&#xff1a; LDF概述和LDF Explorer工具介绍 问题描述 使用CANoe软件的菜单栏Tools中无法找到LDF Explorer 原因分析/解决方案&#xff1a; ①查看CANoe硬件是否带LIN license&#xff0c;并且license在正常激活时间内。 ②查看CANoe是否配置了LIN通道&#xff0c;…

嵌入式设备应用开发(程序构建)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 编译是嵌入式开发很重要的一个环节。记得早年在上海一家通讯公司上班的时候,单位还专门有一个人维护编译脚本。当时用的是makefile,这位同学的主要工作就是替大家维护好各个项目的…

设备绑定驱动

头文件 驱动程序 应用程序 串口实现LED灯亮灭

postgresql 数据排序

postgresql 常见操作 排序总结 排序 -- 排序的时候null是最大的值(看一下) select employee_id,manager_id from employeesorder by manager_id desc;-- nulls first使null值排在第一位 select employee_id,manager_id from employeesorder by manager_id nulls first;-- null…

无涯教程-TensorFlow - 分布式计算

本章将重点介绍如何开始使用分布式TensorFlow&#xff0c;目的是帮助开发人员了解重复出现的基本分布式TF概念&#xff0c;如TF服务器。无涯教程将使用Jupyter Notebook分布式TensorFlow。 第1步 - 导入分布式计算必需的必要模块- import tensorflow as tf 第2步 - …

【Zorro】点击蒙层关闭模态框modal,用nzMaskClosable

使用 nzMaskClosable 例子&#xff1a; <nz-modalnzTitle"新增流程"[nzMaskClosable]"false"[nzWidth]"1200"[(nzVisible)]"visible"[nzCancelLoading]"saving"[nzOkLoading]"saving"(nzOnCancel)"onMo…

SQL Server Express 自动备份方案

文章目录 SQL Server Express 自动备份方案前言方案原理SQL Server Express 自动备份1.创建存储过程2.设定计划任务3.结果检查sqlcmd 参数说明SQL Server Express 自动备份方案 前言 对于许多小型企业和个人开发者来说,SQL Server Express是一个经济实惠且强大的数据库解决方…

LDF概述和LDF Explorer工具介绍

文章目录 一、LDF是什么?二、LDF实践创建LDF工程规范&发展历史一、LDF是什么? LDF:LIN description file - LIN总线描述性文件,使用LIN规范中定义的LIN配置语言,在汽车行业应用广泛。主要描述了: ①节点的定义:主节点和从节点(一主多从) 关联文章:LIN是什么? ②…

mac m1上系统内录内部声音的方法/无需安装Blackhole

总所周知&#xff0c;m1的mac不能录制桌面音频&#xff0c;obsstudio都不行。 最快的解决方法就是下载飞书&#xff1a; 登陆后新建直播/视频会议&#xff1a; 共享的时候选择下面的两个钩上去就好了

【GeoDa实用技巧100例】018:制作条件图和条件地图

严重声明:本文为CSDN博主刘一哥GIS原创,原文地址为:https://blog.csdn.net/lucky51222/article/details/132377143,拒绝转载。 文章目录 一、条件图介绍二、制作条件图1. 条件散点图2. 条件直方图3. 条件箱线图三、制作条件地图一、条件图介绍 条件图是一种类似于矩阵统计…

服务器安装centos7踩坑

1、制作启动工具 下载iso https://developer.aliyun.com/mirror/?spma2c6h.25603864.0.0.20387abbo2RFbn http://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/?spma2c6h.25603864.0.0.1995f5ad4AhJaW下载 UltraISO https://cn.ultraiso.net/插入u盘启动 到了如图所示页面…

关于docker-compose up -d在文件下无法运行的原因以及解决方法

一、确认文件下有docker-compose.yml文件 二、解决方法 检查 Docker 服务是否运行&#xff1a; 使用以下命令检查 Docker 服务是否正在运行&#xff1a; systemctl status docker 如果 Docker 未运行&#xff0c;可以使用以下命令启动它&#xff1a; systemctl start docker …

(二)Qt的安装(Linux系统下安装Qt6过程)

一、Qt资源下载网址 网址&#xff1a;点击下载http://download.qt.io/ 下载&#xff1a;点击下载(CSDN) 二、下载二进制安装包 进入Qt资源下载网址&#xff0c;进入对应的资源目录&#xff0c;找对应系统平台的二进制安装包选择进行下载&#xff0c;在这这里我们选择Linux下的二…

马上七夕到了,用各种编程语言实现10种浪漫表白方式

目录 1. 直接表白&#xff1a;2. 七夕节表白&#xff1a;3. 猜心游戏&#xff1a;4. 浪漫诗句&#xff1a;5. 爱的方程式&#xff1a;6. 爱心Python&#xff1a;7. 心形图案JavaScript 代码&#xff1a;8. 心形并显示表白信息HTML 页面&#xff1a;9. Java七夕快乐&#xff1a;…

时尚易用的健康手表,时刻关注身体状况,dido E56S Max体验

智能手表的功能大多只限于显示时间和记录运动数据、睡眠质量等简单的任务&#xff0c;除了漂亮的表盘&#xff0c;其他实质性的提升并不多&#xff0c;而对于重视健康的朋友来说&#xff0c;更需要的是一块能够时刻监测血氧、血压、血糖等身体数据的智能手表。 现在我用的这块d…

__format__和__del__

目录 一、__format__ 二、__del__ python从小白到总裁完整教程目录:https://blog.csdn.net/weixin_67859959/article/details/129328397?spm1001.2014.3001.5502 一、__format__ 自定制格式化字符串 date_dic {ymd: {0.year}:{0.month}:{0.day},dmy: {0.day}/{0.month}/…

stack、queue 和 priority_queue 相关的练习

目录 一、stack 相关的练习 1.1 - 最小栈 1.2 - 栈的压入、弹出序列 1.3 - 逆波兰表达式求值 1.4 - 用栈实现队列 二、queue 相关的练习 2.1 - 二叉树的层序遍历 2.2 - 二叉树的层序遍历 II 2.3 - 用队列实现栈 三、priority_queue 相关的练习 3.1 - 数组中的第K个最…

微信小程序胶囊位置计算,避开胶囊位置

由于小程序在不同的手机上顶部布局会发生变化&#xff0c;不能正确避开胶囊位置&#xff0c;所以通过官方给出的胶囊信息&#xff0c;可以计算出胶囊位置&#xff0c;并避开 图示例&#xff1a; 此处思路是&#xff0c;获取胶囊底部位置&#xff0c;并拉开10个px 计算出来的…

计算机组成与设计 Patterson Hennessy 笔记(二)MIPS 指令集

计算机的语言&#xff1a;汇编指令集 也就是指令集。本书主要介绍 MIPS 指令集。 汇编指令 算数运算&#xff1a; add a,b,c # abc sub a,b,c # ab-cMIPS 汇编的注释是 # 号。 由于MIPS中寄存器大小32位&#xff0c;是基本访问单位&#xff0c;因此也被称为一个字 word。M…