24.9.1学习心得

VGG(Visual Geometry Group)网络是由牛津大学视觉几何小组提出的一种卷积神经网络模型,该模型因其在ImageNet大规模视觉识别挑战赛(ILSVRC 2014)中的优异表现而闻名。VGG模型的特点在于其架构的简单性和一致性,以及对参数数量的大量使用,这使得它成为了深度学习领域中一个非常受欢迎的基础模型。

VGG架构的主要特点包括:

  1. 堆叠的3x3卷积层:VGG网络使用了多个连续的3x3卷积核来构建其网络层,这种设计允许增加网络的深度而不显著增加参数的数量。3x3的小型滤波器有助于捕捉局部特征,并且通过堆叠可以构建更大范围的感受野。

  2. Max Pooling层:在网络中每经过几次卷积后就会有一个2x2大小的Max Pooling层,用于降低空间维度,同时保持深度不变。

  3. 全连接层:在卷积层之后,通常会有几个全连接层用于分类任务。原版VGG模型包含三个全连接层,但在实践中有时会减少以防止过拟合。

VGG的不同变体:

VGG模型有几种不同的配置,主要区别在于层数不同。其中最常用的是VGG16和VGG19,表示网络中有16个和19个可学习的层(卷积层和全连接层)。以下是VGG16的一个简化示例结构:

  • 输入图像大小:224x224x3
  • 第一部分:两个3x3卷积层(输出64通道),一个2x2 Max Pooling层
  • 第二部分:两个3x3卷积层(输出128通道),一个2x2 Max Pooling层
  • 第三部分:三个3x3卷积层(输出256通道),一个2x2 Max Pooling层
  • 第四部分:三个3x3卷积层(输出512通道),一个2x2 Max Pooling层
  • 第五部分:三个3x3卷积层(输出512通道),一个2x2 Max Pooling层
  • 全连接层:三个全连接层,每个层有4096个节点,最后接一个softmax分类层

VGG的优点:

  • 结构清晰,容易实现。
  • 深度的增加可以提高性能。
  • 在很多基准数据集上都取得了很好的结果。

VGG的缺点:

  • 参数量大,对于计算资源要求较高。
  • 全连接层可能导致过拟合,尤其是在小数据集上。
  • 训练时间较长。

尽管VGG网络由于其较大的模型大小和计算需求,在某些方面已经被更高效的网络结构所取代,但它仍然是理解卷积神经网络工作原理的一个重要参考点。

代码如下:

import tensorflow as tf
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input, Conv2D, MaxPooling2D, Flatten, Dense, Dropout

def VGG16(input_shape=(224, 224, 3), num_classes=1000):
    input_img = Input(shape=input_shape)
    
    # Block 1
    x = Conv2D(64, (3, 3), activation='relu', padding='same', name='block1_conv1')(input_img)
    x = Conv2D(64, (3, 3), activation='relu', padding='same', name='block1_conv2')(x)
    x = MaxPooling2D((2, 2), strides=(2, 2), name='block1_pool')(x)

    # Block 2
    x = Conv2D(128, (3, 3), activation='relu', padding='same', name='block2_conv1')(x)
    x = Conv2D(128, (3, 3), activation='relu', padding='same', name='block2_conv2')(x)
    x = MaxPooling2D((2, 2), strides=(2, 2), name='block2_pool')(x)

    # Block 3
    x = Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv1')(x)
    x = Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv2')(x)
    x = Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv3')(x)
    x = MaxPooling2D((2, 2), strides=(2, 2), name='block3_pool')(x)

    # Block 4
    x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv1')(x)
    x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv2')(x)
    x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv3')(x)
    x = MaxPooling2D((2, 2), strides=(2, 2), name='block4_pool')(x)

    # Block 5
    x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv1')(x)
    x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv2')(x)
    x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv3')(x)
    x = MaxPooling2D((2, 2), strides=(2, 2), name='block5_pool')(x)

    # Classification block
    x = Flatten(name='flatten')(x)
    x = Dense(4096, activation='relu', name='fc1')(x)
    x = Dropout(0.5)(x)
    x = Dense(4096, activation='relu', name='fc2')(x)
    x = Dropout(0.5)(x)
    output = Dense(num_classes, activation='softmax', name='predictions')(x)

    # Create model.
    model = Model(inputs=input_img, outputs=output, name='VGG16')

    return model

# 实例化模型
model = VGG16()
model.summary()

NIN(Network In Network)是一种卷积神经网络(CNN)架构,由Min Lin等人在2013年提出。它的主要创新点是在传统的卷积层之后引入了“微网络”(Micro-Networks),这些微网络通常是小型的多层感知机(MLP, Multi-Layer Perceptron),用于替代传统的卷积层+非线性激活函数的模式。NIN的设计目的是为了增强模型的表征能力,并且在一定程度上减少参数的数量。

NIN的关键组成部分:

  1. 1x1卷积层(微网络):NIN中引入了1x1卷积的概念,这实际上就是一种特殊的全连接层,但它作用在一个特定的位置上,而不是整个图像。1x1卷积可以在不改变输入的空间尺寸的情况下改变其深度(通道数),因此常被用作特征变换。在NIN中,这些1x1卷积层被组织成多层感知机的形式,形成所谓的“微网络”。

  2. 全局平均池化(Global Average Pooling, GAP:NIN使用全局平均池化层来代替传统CNN中的全连接层。GAP层接收最后一个卷积层的输出,并将其所有空间位置上的值求平均,从而生成一个固定长度的向量,直接用于分类。这种方法减少了对权重参数的需求,同时也减轻了过拟合的风险。

NIN的架构:

NIN的基本架构包括以下几个部分:

  • 输入层:接受原始图像数据。
  • 多个“微网络”层:每个微网络层包含多个1x1卷积层组成的多层感知机,用于特征转换。
  • 传统的卷积层和最大池化层:用于提取空间特征。
  • 全局平均池化层:将特征图转换为固定长度的向量。
  • 输出层:用于分类任务。

一个典型的NIN模型结构如下所示:

  • 输入图像大小:224x224x3
  • 第一个微网络:1x1卷积层(假设输出通道数为96),ReLU激活
  • 传统的3x3卷积层(输出通道数为96)和最大池化层
  • 第二个微网络:类似第一个微网络的结构,但输出通道数可能不同
  • 又一组传统卷积层和最大池化层
  • 第三个微网络
  • 最后的传统卷积层和最大池化层
  • 全局平均池化层
  • 输出层:使用Softmax激活函数进行分类

NIN的优点:

  • 通过引入1x1卷积层,增强了模型的非线性表达能力。
  • 使用全局平均池化减少了参数数量,并有助于缓解过拟合。
  • 架构灵活,易于扩展和调整。

NIN的缺点:

  • 相比于后来的一些高效网络结构(如ResNet、Inception等),NIN在计算效率和模型精度上可能不占优势。
  • 对于非常大的数据集,NIN可能需要更多的计算资源来进行训练。

尽管NIN并不是当前最先进的模型,但它引入的概念如1x1卷积和全局平均池化在现代深度学习中仍然有着广泛的应用。

import tensorflow as tf
from tensorflow.keras import layers, models

# 定义一个NIN块,它包含三个卷积层,其中第一层可以是有大小的卷积核,后两层都是1x1卷积核。
def nin_block(in_channels, out_channels, kernel_size, strides=1, padding='valid'):
    return tf.keras.models.Sequential([
        # 第一层卷积,使用给定的kernel_size,stride和padding参数
        layers.Conv2D(out_channels, kernel_size, strides=strides, padding=padding, activation='relu'),
        # 第二层卷积,1x1卷积核,用于特征变换
        layers.Conv2D(out_channels, kernel_size=1, activation='relu'),
        # 第三层卷积,也是1x1卷积核,进一步变换特征
        layers.Conv2D(out_channels, kernel_size=1, activation='relu')
    ])

# 定义整个NIN模型
def tiny_nin_model():
    # 创建一个Sequential模型,方便按顺序添加层
    net = tf.keras.models.Sequential([
        # 第一个NIN块,输入通道数为1(例如灰度图像),输出通道数为96
        nin_block(1, 96, kernel_size=11, strides=4, padding='valid'),
        # 最大池化层,减少空间维度
        layers.MaxPooling2D(pool_size=3, strides=2),
        # 第二个NIN块,输入通道数为96,输出通道数为256
        nin_block(96, 256, kernel_size=5, strides=1, padding='same'),
        # 再次使用最大池化层
        layers.MaxPooling2D(pool_size=3, strides=2),
        # 第三个NIN块,输入通道数为256,输出通道数为384
        nin_block(256, 384, kernel_size=3, strides=1, padding='same'),
        # 再次使用最大池化层
        layers.MaxPooling2D(pool_size=3, strides=2),
        # Dropout层,防止过拟合
        layers.Dropout(0.5),
        # 第四个NIN块,作为分类层的一部分,输出通道数等于类别数(这里是10类)
        nin_block(384, 10, kernel_size=3, strides=1, padding='same'),
        # 全局平均池化层,将特征图转换为一个固定长度的向量
        layers.GlobalAveragePooling2D(),
        # 将输出形状从(1, 1, 10)转换为(10,),以便用于分类
        layers.Reshape((10,))
    ])
    return net

# 创建模型实例
model = tiny_nin_model()

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值