网络中的网络 NiN

一、全连接层问题

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())
  • 22
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值