CNN模型分析 | 4 Network In Network

ZFNet网络综述

前言

  • 卷积神经网络(CNN)由卷积层和池化层交替组成。卷积层使用线性滤波器和底层receptive field做内积,然后接一个非线性的激活函数,得到的输出称作特征图(feature map)。
  • CNN的卷积滤波器是底层数据块的广义线性模型(generalized linear model )(GLM),而且我们认为它的抽象程度较低。这里的抽象较低是指该特征对同一概念的变体是不变的。
  • 用更有效的非线性函数逼近器代替GLM可以增强局部模型的抽象能力。
  • 当样本的隐含概念(latent concept)线性可分时,GLM可以达到很好的抽象程度,例如:这些概念的变体都在GLM分割平面的同一边,而传统的CNN就默认了这个假设——认为隐含概念(latent concept)是线性可分的。
  • 同一概念的数据通常是非线性流形的(nonlinear manifold),捕捉这些概念的表达通常都是输入的高维非线性函数。
  • 在NIN中,GLM用“微型网络”结构替代,该结构是一个非线性函数逼近器。在本项研究中,我们选择多层感知器实例化微型网络,该感知器是一个通用函数逼近器,也是一个通过反向传播训练的神经网络。

Network In Network网络的设计思想

设计思想与特点

  • 使用mlpconv卷积网络层替代传统的convolution层,卷积后面加两层1*1卷积核实现
  • 减少了参数个数,网络层数的加深,加快训练速度
  • CNN网络中不使用FC层(全连接层)
  • 求和取平均操作综合了空间信息,使得对输入的空间变换更鲁棒(与卷积层相连的FC按顺序对特征进行了重新编排(flatten),可能破坏了特征的位置信息).

Network In Network网络的核心架构

在这里插入图片描述

Keras实现Network In Network

from keras.models import Model
from keras.layers import Input, GlobalAveragePooling2D
from keras.layers import Conv2D, MaxPool2D, BatchNormalization

# Mlpconv layer
def mlp_layer(x, filters, size, stide, padding):
    x = Conv2D(filters=filters, kernel_size=(size, size), strides=(stide, stide), padding=padding, activation='relu')(x)
    x = BatchNormalization()(x)
    x = Conv2D(filters=filters, kernel_size=(1, 1), strides=(1, 1), padding='same', activation='relu')(x)
    x = BatchNormalization()(x)
    x = Conv2D(filters=filters, kernel_size=(1, 1), strides=(1, 1), padding='same', activation='relu')(x)
    x = BatchNormalization()(x)
    return x


def body(img_input, classes):
    # Con1 227X227X3
    x = mlp_layer(img_input, 96, 11, 4, 'valid')
    x = MaxPool2D(pool_size=(3,3), strides=(2,2), padding='valid')(x)

    # Con2 27X27X96
    x = mlp_layer(x, 256, 5, 1, 'same')
    x = MaxPool2D(pool_size=(3,3), strides=(2,2), padding='valid')(x)

    # Con3 13X13X256
    x = mlp_layer(x, 384, 3, 1, 'same')
    x = MaxPool2D(pool_size=(3,3), strides=(2,2), padding='valid')(x)

    #Con4 6X6X384
    x = mlp_layer(x, classes, 3, 1, 'same')

    # GLP 6X6Xclasses
    x = GlobalAveragePooling2D()(x)

    return x

PyTorch实现Network In Network

import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.autograd import Variable

def mlp_layer(channels, kernel_size, padding, strides=1, max_pooling=True):
    net = nn.Sequential()
    net.add(
        nn.Conv2d(channels=channels, kernel_size=kernel_size, strides=strides, padding=padding, activation='relu'),
        nn.Conv2d(channels=channels,kernel_size=1,padding=0,stride=1,activation='relu'),
        nn.Conv2D(channels=channels, kernel_size=1, padding=0, strides=1, activation='relu')
    )
    if max_pooling:
        net.add(nn.MaxPool2D(pool_size=3, strides=2))
    return net

if __name__ == '__main__':
    net = nn.Sequential()
    with net.name_scope():
        net.add(
            mlp_layer(96, 11, 0, strides=4),
            mlp_layer(256, 5, 2),
            mlp_layer(384, 3, 1),
            nn.Dropout(0.5),
            mlp_layer(10, 3, 1, max_pooling=False),  # 目标类为10类
            nn.GlobalAvgPool2D(),  # 输入为 batch_size x 10 x 5 x 5, 通过AvgPool2D转成 batch_size x 10 x 1 x 1。
            # 使用全局池化可以避免估算pool_size大小
            nn.Flatten()  # 转成 batch_size x 10
        )
发布了123 篇原创文章 · 获赞 54 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/qq_41940950/article/details/103355463