深度学习中降维的几种方法

news2024/9/21 20:42:10

在这里插入图片描述

笔者在搞网络的时候碰到个问题,就是将特征维度从1024降维到268,那么可以通过哪些深度学习方法来实现呢?

文章目录

  • 1. 卷积层降维
  • 2. 全连接层降维
  • 3. 使用注意力机制
  • 4. 使用自编码器

1. 卷积层降维

可以使用1x1卷积层(也叫pointwise卷积)来减少通道数。这种方法保留了特征图的空间维度(宽度和高度),同时减少了通道数。

import torch
import torch.nn as nn

class ReduceDim(nn.Module):
    def __init__(self, in_channels, out_channels):
        super(ReduceDim, self).__init__()
        self.conv1x1 = nn.Conv2d(in_channels, out_channels, kernel_size=1)

    def forward(self, x):
        return self.conv1x1(x)

# 假设输入的特征图为 (bs, 1024, 28, 28)
x = torch.randn(56, 1024, 28, 28)
model = ReduceDim(1024, 268)
output = model(x)
print(output.shape)  # 输出形状应为 (56, 268, 28, 28)

2. 全连接层降维

可以将特征图展平为一个向量,然后使用全连接层(线性层)来降维。这种方法适用于特征图的全局降维。

class ReduceDimFC(nn.Module):
    def __init__(self, in_channels, out_channels, width, height):
        super(ReduceDimFC, self).__init__()
        self.fc = nn.Linear(in_channels * width * height, out_channels * width * height)
        self.width = width
        self.height = height

    def forward(self, x):
        bs, c, w, h = x.shape
        x = x.view(bs, -1)
        x = self.fc(x)
        x = x.view(bs, out_channels, self.width, self.height)
        return x

# 假设输入的特征图为 (bs, 1024, 28, 28)
x = torch.randn(56, 1024, 28, 28)
model = ReduceDimFC(1024, 268, 28, 28)
output = model(x)
print(output.shape)  # 输出形状应为 (56, 268, 28, 28)

3. 使用注意力机制

可以使用基于注意力机制的方法来降维。例如,可以使用Transformer编码器或自注意力机制来实现降维。

import torch
import torch.nn as nn

class ReduceDimAttention(nn.Module):
    def __init__(self, in_channels, out_channels):
        super(ReduceDimAttention, self).__init__()
        self.attention = nn.MultiheadAttention(embed_dim=in_channels, num_heads=8)
        self.fc = nn.Linear(in_channels, out_channels)

    def forward(self, x):
        bs, c, w, h = x.shape
        x = x.view(bs, c, -1).permute(2, 0, 1)  # (w*h, bs, c)
        x, _ = self.attention(x, x, x)
        x = x.permute(1, 2, 0).view(bs, c, w, h)
        x = self.fc(x.permute(0, 2, 3, 1)).permute(0, 3, 1, 2)
        return x

# 假设输入的特征图为 (bs, 1024, 28, 28)
x = torch.randn(56, 1024, 28, 28)
model = ReduceDimAttention(1024, 268)
output = model(x)
print(output.shape)  # 输出形状应为 (56, 268, 28, 28)

4. 使用自编码器

可以训练一个自编码器网络来学习降维。自编码器由编码器和解码器组成,通过最小化重建误差来学习紧凑的表示。


class Encoder(nn.Module):
    def __init__(self, in_channels, out_channels):
        super(Encoder, self).__init__()
        self.conv1 = nn.Conv2d(in_channels, 512, kernel_size=3, padding=1)
        self.conv2 = nn.Conv2d(512, out_channels, kernel_size=3, padding=1)

    def forward(self, x):
        x = torch.relu(self.conv1(x))
        x = torch.relu(self.conv2(x))
        return x

class Decoder(nn.Module):
    def __init__(self, in_channels, out_channels):
        super(Decoder, self).__init__()
        self.conv1 = nn.Conv2d(in_channels, 512, kernel_size=3, padding=1)
        self.conv2 = nn.Conv2d(512, out_channels, kernel_size=3, padding=1)

    def forward(self, x):
        x = torch.relu(self.conv1(x))
        x = torch.relu(self.conv2(x))
        return x

class Autoencoder(nn.Module):
    def __init__(self, in_channels, bottleneck_channels, out_channels):
        super(Autoencoder, self).__init__()
        self.encoder = Encoder(in_channels, bottleneck_channels)
        self.decoder = Decoder(bottleneck_channels, out_channels)

    def forward(self, x):
        x = self.encoder(x)
        x = self.decoder(x)
        return x

# 假设输入的特征图为 (bs, 1024, 28, 28)
x = torch.randn(56, 1024, 28, 28)
model = Autoencoder(1024, 268, 1024)
encoded = model.encoder(x)
print(encoded.shape)  # 输出形状应为 (56, 268, 28, 28)

以上方法都是有效的深度学习降维技术,可以根据具体的需求和应用场景选择合适的方法。Enjoy~

∼ O n e   p e r s o n   g o   f a s t e r ,   a   g r o u p   o f   p e o p l e   c a n   g o   f u r t h e r ∼ \sim_{One\ person\ go\ faster,\ a\ group\ of\ people\ can\ go\ further}\sim One person go faster, a group of people can go further

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

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

相关文章

AI新闻:近期AI领域最繁忙的一周!

本周AI领域发生了许多令人瞩目的大事,可以说是繁忙的一周了。下面我将为大家一一盘点这些精彩瞬间。 OpenAI的新功能和发展 高级语音功能:OpenAI开始推出全新的高级语音功能,之前展示时声音如同斯嘉丽约翰逊。这项功能已经开放给部分用户使用…

鸿蒙双向绑定组件:TextArea、TextInput、Search、Checkbox,文本输入组件,图案解锁组件PatternLock

对象暂不支持双向绑定, 效果: 代码: Entry Component struct MvvmCase {StateisSelect: boolean falseStatesearchText: String ""StateinputText: string ""StateareaText: string ""build() {Grid() {G…

「漏洞复现」百易云资产管理运营系统 comfileup.php 文件上传漏洞(XVE-2024-18154)

0x01 免责声明 请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任。工具来自网络,安全性自测,如有侵权请联系删…

武汉流星汇聚:亚马逊北美站引领中国跨境潮,全球商机触手可及

在当今全球跨境电商的浪潮中,亚马逊北美站以其独特的区域优势和强大的市场影响力,为中国跨境卖家提供了前所未有的发展机遇。根据最新统计数据显示,60%的中国跨境卖家将亚马逊视为他们海外拓展的首选平台,这一选择背后&#xff0c…

ASPCMS 漏洞

一、后台修改配置文件拿shell 登录后台后如下点击 点击保存并抓包 将slideTextStatus的值修改为1%25><%25Eval(Request(chr(65)))25><%25 放包&#xff08;连接密码是a&#xff09; 影响文件为 /config/AspCms_Config.asp 访问文件,使用工具连接

window10上配置typora图床

window10上配置typora图床 window10picgotypora 教程 picgo设定存储区域 picgo下载地址 安利一款截图贴图软件

Simulink代码生成:数学运算

文章目录 1 引言2 模块使用实例2.1 Math Function模块2.2 Trigonometric Function模块2.3 Abs模块 3 代码生成4 总结 1 引言 Simulink中提供了大量的数学运算模块&#xff0c;对应C语言中<math.h>中用于数学计算的函数&#xff0c;例如幂函数、开平方、三角反三角函数、…

FFmpeg源码:av_gcd函数分析

一、引言 公约数&#xff0c;是一个能同时整除几个整数的数。如果一个整数同时是几个整数的约数&#xff0c;称这个整数为它们的“公约数”&#xff1b;公约数中最大的称为最大公约数。对任意的若干个正整数&#xff0c;1总是它们的公约数。 公约数与公倍数相反&#xff0c;就…

数据科学 - 数据预处理 (数据清洗,结构化数据)

1. 前言 数据清洗与结构化数据在数据分析和机器学习项目中扮演着至关重要的角色。随着大数据时代的到来&#xff0c;数据的质量、准确性和可用性成为决定项目成功与否的关键因素。 数据清洗提高数据质量&#xff0c;保证数据集的一致性&#xff1b;促进数据分析与挖掘&#xf…

剪映课+短视频综合课程:抖音底层算法

课程内容&#xff1a; 01-直播回放精选&#xff1a;2024抖音4_5月新知识.mp4 02-直播回放&#xff1a;核心算法讲解.mp4 03-直播回放&#xff1a;推流人群顺序和赛马依据.mp4 04-直播回放&#xff1a;从0-1kw推流细节.mp4 05-直播回放&#xff1a;抖加投放①.mp4 06-直播回…

调试模式下如何调试看门狗?

大家在调试GD32 MCU系统的时候&#xff0c;若开了看门狗外设&#xff0c;是否会碰到进入调试模式看门狗就会咬狗造成无法调试的问题&#xff1f; 碰到这种情况&#xff0c;一般是将看门狗关闭&#xff0c;然后再进行调试&#xff0c;但这个时候看门狗外设就无法工作了&#xf…

SSH远程服务器MobaXterm PuTTY XShell Tabby

云服务器运维SSH远程工具软件&#xff0c; PuTTY 相比有很大的优势&#xff0c;有兼顾 SSH 和 FTP一体的工具。 SSH的软件&#xff0c;而且有支持 Mac 、Windows 、Linux等跨平台的。 1、XShell 官网地址&#xff1a;https://www.xshell.com/en/xshell/ 免费地址&#xff1a;h…

Kimi居然能做PPT了,是职场人的得力助手还是噱头满满?

你们有没有发现&#xff0c;Kimi最近搞了个大新闻——它竟然能做PPT了&#xff01;是的&#xff0c;你没听错&#xff0c;就是那个让我们又爱又恨的演示PPT。这不&#xff0c;我一看到公告&#xff0c;就激动得像打了鸡血&#xff0c;连夜把市面上其他的几款主流AI PPT产品测了…

数据工程解决的十大数据生命周期问题

欢迎来到雲闪世界。解决关键痛点的明确策略 使用Kandinsky 的AI 生成图像 在本文中&#xff0c;我想解决数据工程师在整个数据生命周期中使用管道时面临的一些最大挑战。了解如何管理数据生命周期是我们不断变化的领域的关键。作为一名数据工程师&#xff0c;我经常处理大量不同…

【Spring Boot】用 Spring Security 实现后台登录及权限认证功能

用 Spring Security 实现后台登录及权限认证功能 1.引入依赖2.创建权限开放的页面3.创建需要权限验证的页面4.配置 Spring Security4.1 配置 Spring MVC4.2 配置 Spring Security 5.创建登录页面6.测试权限 1.引入依赖 使用前需要引入相关依赖&#xff0c;见以下代码&#xff…

DeDe-cms 漏洞

一、文件管理上传shell 我们写一个一句话木马&#xff0c; 上传 点击访问后使用工具连接 连接成功 二、修改模板文件拿shell 找到index.html修改 保存,进行如下操作 更新html 访问返回的地址 拿工具连接 三、后台任意命令执行拿shell 写入一个木马 添加成功后点击代码 这里是文…

python-鼠标绘画线条程序

闲来无聊简单编写了一个绘图小程序。 主要思路 主要是基于Python中的内置模块turtle编写的&#xff0c;简单扩展了一下&#xff0c;通过绑定事件能够达到鼠标绘制、删除、存储已经绘制图案的线条这几个功能。 路径结构 -draw- define.py- main.py- myturtle.py使用 点住鼠…

zabbix7.0TLS-01-部署

文章目录 1 介绍1.1 架构1.2 主要概念和名词1.3 最新 7.0 TLS 版本的部分新特性更灵活的资源发现和管理 2 官方部署指导地址3 在 Rocky Linux 9 上安装 zabbix3.1 安装软件包3.2 创建初始化数据库3.3 配置zabbix-server3.4 启动Zabbix server和agent进程3.5 默认监听端口3.6 访…

电脑新加的硬盘如何分区?新加硬盘分区选MBR还是GPT

最近有网友问我,电脑新加的硬盘如何分区?电脑新加的硬盘分区选MBR还是GPT要看引导模式采用uefi还是传统的legacy模式&#xff0c;如果采用的是uefi引导模式&#xff0c;分区类型对应的就是gpt分区(guid)&#xff0c;如果引导模式采用的是legacy&#xff0c;对应的分区类型为mb…

springboot专家门诊预约管理平台-计算机毕业设计源码79775

摘要 随着互联网技术的快速发展&#xff0c;医疗健康领域数字化需求日益增长&#xff0c;专家门诊预约管理平台应运而生。本研究基于Spring Boot框架开发了一款专家门诊预约管理平台。该平台涵盖了患者用户、专家用户和管理员三个角色&#xff0c;实现了患者的预约、评价、信息…