模型怎么处理不同尺寸的输入图像

1.有全连接层的的CNN模型

卷积能够处理不同尺寸的输入图像,但全连接层不行,因此在送入全连接层之前需将卷积层提取的特征转换为一个固定长度的特征向量。

那么如何转换?

1.1 GAP(Global Average Pooling)全局平均池化

直接代码举例:

python 复制代码
import torch
import torch.nn as nn
from torchvision import transforms

# 定义带有全连接层和全局平均池化层的 CNN 模型
class CNNWithGlobalAvgPool(nn.Module):
    def __init__(self):
        super(CNNWithGlobalAvgPool, self).__init__()
        self.conv1 = nn.Conv2d(3, 16, 3)
        self.conv2 = nn.Conv2d(16, 32, 3)
        self.fc = nn.Linear(32, 10)  # 假设输出类别数为 10
        self.global_avg_pool = nn.AdaptiveAvgPool2d(1)

    def forward(self, x):           #(1,3,224,224)
        x = self.conv1(x)           #(1,16,222,222)
        x = self.conv2(x)           #(1,32,220,220)
        x = self.global_avg_pool(x) #(1,32,1,1)
        x = x.view(x.size(0), -1)   #(1,32)
        x = self.fc(x)              #(1,10)
        return x

# 创建模型实例
model = CNNWithGlobalAvgPool()

image = torch.randn(1,3,224,224)

output = model(image)
print(output)

左边为普通卷积网络提取特征num_chanels*h*w后全部展开成一维向量num_chanels*h*w,再送入到全连接层,不同尺寸的图像得到不同的一维向量,输入到全连接层的in_feature数就不同,故需要统一尺寸。

右图为GAP,直接将每个通道的所有特征取平均得到num_chanels*1的向量,这样就与输入图像尺寸无关了。

1.2 SPP(Spatial Pyramid Pooling)空间金字塔池化。其中,全局平均池化是空间金字塔池化的一种特殊形式,只使用一个池化层。

上示例代码:

python 复制代码
import torch
import torch.nn as nn
import torch.nn.functional as F

class SpatialPyramidPooling(nn.Module):
    def __init__(self, levels=[1, 2, 4]):
        super(SpatialPyramidPooling, self).__init__()
        self.levels = levels

    def forward(self, x):
        N, C, H, W = x.size()
        output = []
        
        for level in self.levels:
            kh = H // level
            kw = W // level
            for i in range(level):
                for j in range(level):
                    h_start = i * kh
                    w_start = j * kw
                    h_end = min(h_start + kh, H)
                    w_end = min(w_start + kw, W)
                    
                    pool_feat = F.adaptive_max_pool2d(x[:, :, h_start:h_end, w_start:w_end], (1, 1))
                    output.append(pool_feat.view(N, -1))

        output = torch.cat(output, dim=1)
        
        return output

# 使用示例
spp = SpatialPyramidPooling(levels=[1, 2, 4])
input_data = torch.randn(1, 3, 32, 32)  # 输入数据大小为(1, 3, 32, 32)
output = spp(input_data)
print(output.size())

SPP:将特征图划分成不同尺寸的子区域,如1x1、2x2、4x4等不同级别的子区域,对每个子区域进行池化操作,通常是最大池化或平均池化,将这些子区域内的特征映射转换为固定长度的向量,最后将这些向量连接在一起,形成一个具有固定维度的特征表示。

2.FCN全卷积模型

没有全连接层,故可以处理不同尺寸的输入图像

相关推荐
刘孬孬沉迷学习1 分钟前
AI+通信+多模态应用分类与核心内容总结
人工智能·机器学习·分类·数据挖掘·信息与通信
Allenlzcoder11 分钟前
掌握机器学习算法及其关键超参数
人工智能·机器学习·超参数
LaughingZhu12 分钟前
Product Hunt 每日热榜 | 2025-10-26
人工智能·经验分享·搜索引擎·产品运营
2401_8414956413 分钟前
【自然语言处理】Transformer模型
人工智能·python·深度学习·算法·语言模型·自然语言处理·transformer
KG_LLM图谱增强大模型13 分钟前
[ICAIS2025]探索LLM驱动的知识图谱构建:技术机制、方法对比与未来方向
人工智能·知识图谱·graphrag·知识图谱增强大模型
CH_Qing14 分钟前
【ROS2】驱动开发-雷达篇
人工智能·ros2·1024程序员节
孤廖14 分钟前
面试官问 Linux 编译调试?gcc 编译流程 + gdb 断点调试 + git 版本控制,连 Makefile 都标好了
linux·服务器·c++·人工智能·git·算法·github
星期天要睡觉22 分钟前
什么是提示词(Prompt),提示词类型、结构解析
人工智能·语言模型
深度学习lover30 分钟前
<数据集>yolo煤矿安全帽识别数据集<目标检测>
人工智能·python·深度学习·yolo·目标检测·计算机视觉·煤矿安全帽识别
前端双越老师39 分钟前
建议应届毕业生不要再做前端开发了
人工智能·面试·ai编程