在alexnet的实现中,在FC层之前使用了AdaptiveAvgPool2d这个trick。自适应的池化。
这个trick就是使得图片,不管多大的分辨率,输出都是6*6的。为什么要都统一成6*6呢?因为后面接了FC层,FC的输入神经元数目是固定的。如果前面的输入的神经元个数不匹配的话,那么这个FC层是没办法运行的。所以接了一个自适应的池化,把尺寸不匹配的特征图都池化到6*6。
例1:当不加AdaptiveAvgPool2d()时,输入的尺寸必须是固定的。
alexnet代码中不加自适应池化,当输入的图片尺寸是224*224时,不会报错:
# @file name : main.py
# @brief :
# @author : liupc
# @date : 2021/8/15
import torch
import torch.nn as nn
class AlexNet(nn.Module):
def __init__(self, num_classes=1000):
super(AlexNet, self).__init__()
self.features = nn.Sequential(
nn.Conv2d(3, 64, kernel_size=11, stride=4, padding=2),
nn.ReLU(inpl