24-NIN

全局平均池化替代全连接层,一个显而易见的好处就是,参数量极大地减少了,从而也防止了过拟合
另一个角度看,是从网络结构上做正则化防止过拟合.比方说[1,10,6,6]的输入,即10个6x6的feature map,我们做全局平均池化后得到[1,10,1,1]的输出,展平后即10x1的输出,这10个标量,我们认为代表十个类别.训练的过程就是使这十个标量不断逼近代表真实类别的标量的过程.这使得模型的可解释性更好了.
nn.AdaptiveAvgPool2d函数,二维自适应平均池化层,它可以将输入特征图的大小调整为 (1, 1),无论输入特征图的原始大小如何,通过这个可以实现全局池化,因为这样我们不用计算上一层的输出大小,直接通过自适应完成计算

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

def block(in_channels, out_channels, kernel_size, stride, padding):
    return nn.Sequential(
        nn.Conv2d(in_channels, out_channels, kernel_size, stride, padding),
        nn.ReLU(),
        nn.Conv2d(out_channels, out_channels, kernel_size=1, padding=0),
        nn.ReLU(),
        nn.Conv2d(out_channels, out_channels, kernel_size=1, padding=0),
        nn.ReLU()
    )

net = nn.Sequential(
    block(1, 96, kernel_size=11, stride=4),
    nn.MaxPool2d(kernel_size=3, stride=2),
    block(96, 256, kernel_size=5, padding=1),
    nn.MaxPool2d(kernel_size=3, stride=2),
    block(256, 384, kernel_size=3, padding=1),
    nn.MaxPool2d(kernel_size=3, stride=2),
    nn.Dropout(0.5),
    block(384, 10, kernel_size=3, padding=1),
    nn.AdaptiveAvgPool2d((1, 1))
)
posted @ 2024-08-26 17:04  不是孩子了  阅读(37)  评论(0)    收藏  举报