动手学PyTorch(李沐)17 ---- NiN

网络中的网络NIN

​ 全连接层尤其占用参数空间,全连接层最重要的问题是会带来过拟合。

卷积层的参数 = 输入的通道数 * 输出的通道数 * 卷积核的高 * 卷积核的宽

全连接层的参数 = 输入的像素 * 输出的通道数

NiN块就是卷积层后跟两个 1 * 1 的卷积层

​ NIN的设计思路就是不要全连接层,节省了大量的参数空间和参数优化时间,用1 * 1的卷积层代替全连接层,1 * 1的卷积层相当于固定参数的全连接层。

卷积层或池化层输出的大小 = ( 输入大小+2*padding-kernel_size )/步幅 + 1

注意:前面部分要向下取整。

QA:

  1. 在卷积后面加池化层,压缩了卷积层的输出,降低了模型复杂度,会提升模型的泛化能力,但会使得模型收敛变慢。
  2. NiN增加了非线性性的原因在于,两个 1 * 1 的卷积层中有两个激活函数。

NIN块,卷积层后跟两个 1*1 的卷积层

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()
  )

NIN模型

from torch.nn.modules.pooling import AdaptiveAvgPool2d
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),
    nin_block(384,10,kernel_size=3,strides=1,padding=1),
    nn.AdaptiveAvgPool2d((1,1)),
    nn.Flatten()
)
x = torch.randn(size=(1,1,224,224))
for layer in net:
  x = layer(x)
  print(layer.__class__.__name__,'output shape:\t',x.shape)

在这里插入图片描述
训练模型

lr,num_epochs,batch_size = 0.1,5,128
train_iter,test_iter = d2l.load_data_fashion_mnist(batch_size,resize=224)
d2l.train_ch6(net,train_iter,test_iter,num_epochs,lr,d2l.try_gpu())

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值