深度学习 —— 个人学习笔记9(图像卷积、填充和步幅及多输入多输出通道)

news2024/11/13 10:01:19

声明

  本文章为个人学习使用,版面观感若有不适请谅解,文中知识仅代表个人观点,若出现错误,欢迎各位批评指正。

十九、图像卷积

import torch
from torch import nn

device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")


def corr2d(X, K):
    """计算二维互相关运算"""
    h, w = K.shape  # 获取输入张量维度
    Y = torch.zeros((X.shape[0] - h + 1, X.shape[1] - w + 1)).to(device)  # 初始化输出张量
    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().to(device)  # 二维互相关计算
    return Y


X = torch.tensor([[0.0, 1.0, 2.0], [3.0, 4.0, 5.0], [6.0, 7.0, 8.0]]).to(device)
K = torch.tensor([[0.0, 1.0], [2.0, 3.0]]).to(device)
print("corr2d(X, K) : ", corr2d(X, K))


class Conv2D(nn.Module):
    def __init__(self, kernel_size):
        super().__init__()
        self.weight = nn.Parameter(torch.rand(kernel_size))
        self.bias = nn.Parameter(torch.zeros(1))

    def forward(self, x):
        return corr2d(x, self.weight) + self.bias


Z = torch.ones((6, 8)).to(device)
Z[:, 2:6] = 0
print(f'构建一个 6*8 像素的黑白图像 : {Z}')

K = torch.tensor([[1.0, -1.0]]).to(device)

Y = corr2d(Z, K)
print(f'垂直边缘检测 : {Y}')

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

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

for i in range(15):
    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) % 5 == 0:
        print(f'epoch {i + 1}, loss {l.sum():.3f}')

Y_hat = conv2d.weight.data.reshape((1, 2))

print(f'训练得到的卷积核的权重张量 : {Y_hat}')
print("使用训练张量做边缘检测 : ", torch.round(corr2d(Z, Y_hat)))

二十、填充和步幅

  在应用多层卷积时,常常丢失边缘像素。 由于通常使用小卷积核,因此对于任何单个卷积,可能只会丢失几个像素。 但随着多个连续卷积层的应用,累积丢失的像素数就多了。解决这个问题的简单方法即为填充(padding):在输入图像的边界填充元素(通常填充元素是 0 )。

import torch
from torch import nn

device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

##### 填充 #####

# 为了方便起见,定义一个计算卷积层的函数。
# 此函数初始化卷积层权重,并对输入和输出提高和缩减相应的维数
def comp_conv2d(conv2d, X):
    # 这里的(1,1)表示批量大小和通道数都是 1
    X = X.reshape((1, 1) + X.shape).to(device)
    Y = conv2d(X)
    # 省略前两个维度:批量大小和通道
    return Y.reshape(Y.shape[2:])


# padding 指四周每边都填充了 1 行或 1 列,因此总共添加了 2 行或 2 列
conv2d = nn.Conv2d(1, 1, kernel_size=3, padding=1).to(device)
X = torch.rand(size=(8, 8)).to(device)
print("padding=1 时维度是否不变 : ", comp_conv2d(conv2d, X).shape == X.shape)

conv2d = nn.Conv2d(1, 1, kernel_size=(5, 3), padding=(2, 1)).to(device)
print("padding=(2, 1) 时维度是否不变 : ", comp_conv2d(conv2d, X).shape == X.shape)

##### 步幅 #####
conv2d = nn.Conv2d(1, 1, kernel_size=3, padding=1, stride=2).to(device)
print("步幅为 2 时 : ", comp_conv2d(conv2d, X).shape)

conv2d = nn.Conv2d(1, 1, kernel_size=(3, 5), padding=(0, 1), stride=(3, 4)).to(device)
print("步幅为 (3, 4)) 时 : ", comp_conv2d(conv2d, X).shape)

二十、多输入多输出通道

import torch

device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

def corr2d(X, K):
    """计算二维互相关运算"""
    h, w = K.shape  # 获取输入张量维度
    Y = torch.zeros((X.shape[0] - h + 1, X.shape[1] - w + 1)).to(device)  # 初始化输出张量
    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().to(device)  # 二维互相关计算
    return Y

def corr2d_multi_in(X, K):
    # 先遍历“X”和“K”的第0个维度(通道维度),再把它们加在一起
    return sum(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]]]).to(device)
K = torch.tensor([[[0.0, 1.0], [2.0, 3.0]], [[1.0, 2.0], [3.0, 4.0]]]).to(device)

print("多输入时互相关运算结果 : ", corr2d_multi_in(X, K))

def corr2d_multi_in_out(X, K):
    # 迭代“K”的第0个维度,每次都对输入“X”执行互相关运算。
    # 最后将所有结果都叠加在一起
    return torch.stack([corr2d_multi_in(X, k) for k in K], 0)


K = torch.stack((K, K + 1, K + 2), 0).to(device)
# print(K)              # 如果不理解这里,可以把 K 输出看一下结果
print("卷积核张量 K 的维度 : ", K.shape)
print("多维度输出结果 : ", corr2d_multi_in_out(X, K))

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

X = torch.normal(0, 1, (3, 3, 3)).to(device)
K = torch.normal(0, 1, (2, 3, 1, 1)).to(device)

Y1 = corr2d_multi_in_out_1x1(X, K)
Y2 = corr2d_multi_in_out(X, K)

if float(torch.abs(Y1 - Y2).sum()) < 1e-6:
    print("Test PASS!(验证 1 * 1 卷积层可以看为全连接层)")


  文中部分知识参考:B 站 —— 跟李沐学AI;百度百科

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

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

相关文章

【Stable Diffusion】(基础篇八)—— 局部重绘

局部重绘 本系列博客笔记主要参考B站nenly同学的视频教程&#xff0c;传送门&#xff1a;B站第一套系统的AI绘画课&#xff01;零基础学会Stable Diffusion&#xff0c;这绝对是你看过的最容易上手的AI绘画教程 | SD WebUI 保姆级攻略_哔哩哔哩_bilibili 我们使用SD生成一张整…

【Vulnhub系列】Vulnhub Noob 靶场渗透(原创)

【Vulnhub系列靶场】Vulnhub Noob靶场渗透 原文转载已经过授权 原文链接&#xff1a;Lusen的小窝 - 学无止尽&#xff0c;不进则退 (lusensec.github.io) 一、主机发现 二、端口扫描 有一个go.php的form表单接收文件 这里识别21端口存在未授权&#xff0c;55077 是ssh 的服务…

计算机网络学习:TCP握手挥手强制连接中断

之前系统学习过TCP协议&#xff0c;但很多地方并不是特别清晰&#xff0c;今天结合抓包情况&#xff0c;再拾一下拾一下>.< 首先看一下TCP数据包的标志位&#xff1a; SYN&#xff1a;简写为S&#xff0c;同步标志位&#xff0c;用于建立会话连接&#xff0c;同步序列号…

ubuntu20.4 微信的安装

一、背景 ubuntu作为常用系统了&#xff0c;微信少不了&#xff0c;但官方没有微信的linux版本 appImage类似于windows下免安装版本。 二、方法 1、下载appImage格式的开源微信版本 https://github.com/zydou/WeChat-AppImage/releases 2、改文件改属性 为什么使用ubuntu 作…

计算机技术基础 (bat 批处理)Note5

计算机技术基础 &#xff08;bat 批处理&#xff09;Note5 本节主要讲解 FOR 命令语句&#xff08;循环&#xff09;在 bat 批处理中的使用 (part 1) FOR 命令语句 在批处理中&#xff0c;for 是最为强大的命令语句&#xff0c;它的出现&#xff0c;使得解析文本内容、遍历文…

Python数值计算(18)——三次样条曲线概述

1. 概述 前面介绍到了多种插值方法&#xff0c;但是这些插值方法都无法避免龙格现象&#xff0c;即高阶多项式可能存在剧烈的振动&#xff0c;而且在区间的一个点处的微小扰动&#xff0c;都可能引起整个范围内的巨大振动&#xff0c;一种替代方式是使用类似线性插值的方式&am…

Python进阶 JSON数据,pyecharts制图

目录 json数据格式的转换 什么是json json本质 注意 pyecharts快速入门 画一个最简单的折线图 使用全局配置选项优化折线图 总结 json数据格式的转换 什么是json 一种轻量级的数据交换格式&#xff0c;可以按json指定的格式去组织和封装数据 json本质 带有特定格式的…

OpenSPG安装部署

文章目录 前言一、安装前准备安装docker安装docker compose 二、安装服务端下载 docker-compose.yml 文件启动服务端 三、安装客户端拉取镜像克隆OpenSPG源码 案例 前言 OpenSPG是以SPG框架为基础设计和实现的知识图谱开放引擎&#xff0c;它为领域图谱构建提供了明确的语义表…

数据结构1绪论

一、数据结构的绪论的思维导图 二、数据 1.数据是描述客观存在事务的符号&#xff0c;其能被计算机识别&#xff0c;处理。 数据不仅仅是整型&#xff0c;实型等数值类型&#xff0c;还包括声音&#xff0c;视频&#xff0c;图像等。 三、数据元素 1.数据元素是组成数据的有…

PTA—基础编程题目集(7-20)

7-20 打印九九口诀表 目录 题目描述 输入格式&#xff1a; 输出格式&#xff1a; 输入样例&#xff1a; 输出样例&#xff1a; 参考代码 总结 题目描述 下面是一个完整的下三角九九口诀表&#xff1a; 1*11 1*22 2*24 1*33 2*36 3*39 1*44 2*48 …

js基础-作用域与作用域链

什么是作用域&#xff1f; 简单说就是在代码中定义的变量或者函数能起作用的范围 什么是作用域链&#xff1f; 简单说就是JavaScript 在执行时查找变量的过程&#xff0c;它按照从当前作用域到全局作用域的顺序逐层向上搜索&#xff0c;直到找到变量或到达作用域的顶…

C#进阶-轻量级ORM框架Dapper的使用教程与原理详解

本文详细介绍了Dapper在C#中的使用方法&#xff0c;包括Dapper的基本概念、与其他持久层框架的比较、基本语法和高级语法的使用&#xff0c;并通过实例讲解了如何在项目中集成和使用Dapper。Dapper以其高效的性能和简洁的API受到开发者的青睐&#xff0c;适用于各种数据库操作需…

基于环形拓扑的多目标粒子群优化算法(MO_Ring_PSO_SCD)求解无人机三维路径规划(MATLAB代码)

一、无人机多目标优化模型 无人机三维路径规划是无人机在执行任务过程中的非常关键的环节&#xff0c;无人机三维路径规划的主要目的是在满足任务需求和自主飞行约束的基础上&#xff0c;计算出发点和目标点之间的最佳航路。 1.1路径成本 无人机三维路径规划的首要目标是寻找…

怎么智能化管理公司众多电脑?公司电脑太多怎么管控!智慧运维,精准管控的它来啦!

俗语称&#xff1a;“团结则强&#xff0c;分散则弱&#xff1b;集腋成裘&#xff0c;聚沙成塔。” 面对公司里如繁星般的电脑大军&#xff0c;你是否曾感到管理无力&#xff0c;仿佛在与一群“不羁的野马”较劲&#xff1f;别担心&#xff0c;智慧运维的浪潮已经席卷而来&…

Mybatis学习(3)

目录 一、JDBC vs Mybatis 二、Mybatis Plugin 三、Dao接口和xml文件的sql如何建立关联 四、Mybatis如何将sql执行结果封装为目标对象并返回的&#xff1f;都有哪些映射形式&#xff1f; 五、动态SQL 六、一级缓存和二级缓存 七、接口绑定的实现 八、Mybatis vs Hiberna…

Mybatis的注解开发学习笔记

学习视频:5001 Select注解_哔哩哔哩_bilibili~5009 案例&#xff1a;基于MyBatis注解的学生管理程序_哔哩哔哩_bilibili 目录 1.基于注解的单表增删改查 1.1Select注解 1.2Insert注解 1.3Update注解 1.4Delete注解 1.5Param注解 2.基于注解的关联查询 2.1一对一查询 2.2…

[Meachines] [Easy] nibbles Nibbleblog-Upload

信息收集 IP AddressOpening Ports10.10.10.75TCP:22,80 $ nmap -p- 10.10.10.75 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.2 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 2048 c4:f8:ad:e8:f8:04:…

实践致知第17享:电脑忽然黑屏的常见原因及处理方法

一、背景需求 小姑电话说&#xff1a;最近&#xff0c;电脑忽然就黑屏了&#xff08;如下图所示&#xff09;&#xff0c;但是等待几十秒甚至一分钟&#xff0c;电脑就能自然恢复了&#xff0c;这种状况一天能出现三四次&#xff0c;怎么办&#xff1f; 二、分析诊断 电脑黑屏…

C++从入门到起飞之——string类用法 全方位剖析!

&#x1f308;个人主页&#xff1a;秋风起&#xff0c;再归来~&#x1f525;系列专栏&#xff1a;C从入门到起飞 &#x1f516;克心守己&#xff0c;律己则安 目录 1. 为什么学习string类&#xff1f; 1.1 C语言中的字符串 1.2 两个面试题(先不做讲解) 2. 标准库中…

IMYAI智能助手介绍:全能AI工具箱,AI爱好者AIGC系统的首选。

IMYAI系统官方网站&#xff1a;https://new.imyai.top 引言&#xff1a; IMYAI系统是一款集多种先进AI技术于一身的创作工具箱&#xff0c;为用户提供无限的创作可能。不论您是想创作精彩的文章&#xff0c;还是创作精美的绘画作品&#xff0c;IMYAI系统都能满足您的需求。它集…