网络中的网络 NiN

发布于:2024-07-07 ⋅ 阅读:(122) ⋅ 点赞:(0)

一、全连接层问题

1、卷积层的参数:输入的通道数乘以输出的通道数再乘以窗口的高宽

2、全连接层的参数就是输入的元素个数乘以输出的元素个数,也就是输入的通道数乘以输入的高宽,再乘以输出的通道数乘以输出的高宽,贼大的量级

3、一个卷积层后跟两个全连接层(1*1卷积,步幅1,无填充,输出形状跟卷积层输出一样,起到全连接作用):1×1卷积层相当于一个全连接层,它所做的操作是,按照像素去逐一做的全连接层

二、NiN架构

1、无全连接层

2、交替使用NiN块和步幅为2的最大池化层(逐步减小高宽和增大通道数)

3、最后使用全局平均池化层得到输出(输出通道数是类别数),全局池化层它的高宽等于输入的高宽,等价于对一个类别来说,把它的平均拿出来,把这个值当做类别的预测,再加上soft max就能得到我们的预测了,这样我们就可以不用使用全连接层了,减少我们所占用内存的参数个数

三、总结

1、NiN使用由一个卷积层和多个1×1卷积层组成的块。该块可以在卷积神经网络中使用,以允许更多的每像素非线性。

2、NiN去除了容易造成过拟合的全连接层,将它们替换为全局平均汇聚层(即在所有位置上进行求和)。该汇聚层通道数量为所需的输出数量(例如,Fashion-MNIST的输出为10)。

3、移除全连接层可减少过拟合,同时显著减少NiN的参数。

4、NiN的设计影响了许多后续卷积神经网络的设计。

四、代码

1、NiN块

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


def nin_block(in_channels, out_channels, kernel_size, strides, padding):
    return nn.Sequential(
        nn.Conv2d(in_channels, out_channels, kernel_size, strides, padding),
        nn.ReLU(),
        nn.Conv2d(out_channels, out_channels, kernel_size=1), nn.ReLU(),
        nn.Conv2d(out_channels, out_channels, kernel_size=1), nn.ReLU())

2、NiN模型

net = nn.Sequential(
    nin_block(1, 96, kernel_size=11, strides=4, padding=0),
    nn.MaxPool2d(3, stride=2),
    nin_block(96, 256, kernel_size=5, strides=1, padding=2),
    nn.MaxPool2d(3, stride=2),
    nin_block(256, 384, kernel_size=3, strides=1, padding=1),
    nn.MaxPool2d(3, stride=2),
    nn.Dropout(0.5),
    # 标签类别数是10
    nin_block(384, 10, kernel_size=3, strides=1, padding=1),
    nn.AdaptiveAvgPool2d((1, 1)),
    # 将四维的输出转成二维的输出,其形状为(批量大小,10)
    nn.Flatten())

网站公告

今日签到

点亮在社区的每一天
去签到