本文主要是介绍24.9.1学习心得,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
VGG(Visual Geometry Group)网络是由牛津大学视觉几何小组提出的一种卷积神经网络模型,该模型因其在ImageNet大规模视觉识别挑战赛(ILSVRC 2014)中的优异表现而闻名。VGG模型的特点在于其架构的简单性和一致性,以及对参数数量的大量使用,这使得它成为了深度学习领域中一个非常受欢迎的基础模型。
VGG架构的主要特点包括:
-
堆叠的3x3卷积层:VGG网络使用了多个连续的3x3卷积核来构建其网络层,这种设计允许增加网络的深度而不显著增加参数的数量。3x3的小型滤波器有助于捕捉局部特征,并且通过堆叠可以构建更大范围的感受野。
-
Max Pooling层:在网络中每经过几次卷积后就会有一个2x2大小的Max Pooling层,用于降低空间维度,同时保持深度不变。
-
全连接层:在卷积层之后,通常会有几个全连接层用于分类任务。原版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, Dropoutdef VGG16(input_shape=(224, 224, 3), num_classes=1000):input_img = Input(shape=input_shape)# Block 1x = 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 2x = 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 3x = 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 4x = 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 5x = 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 blockx = 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的关键组成部分:
-
1x1卷积层(微网络):NIN中引入了1x1卷积的概念,这实际上就是一种特殊的全连接层,但它作用在一个特定的位置上,而不是整个图像。1x1卷积可以在不改变输入的空间尺寸的情况下改变其深度(通道数),因此常被用作特征变换。在NIN中,这些1x1卷积层被组织成多层感知机的形式,形成所谓的“微网络”。
-
全局平均池化(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(例如灰度图像),输出通道数为96nin_block(1, 96, kernel_size=11, strides=4, padding='valid'),# 最大池化层,减少空间维度layers.MaxPooling2D(pool_size=3, strides=2),# 第二个NIN块,输入通道数为96,输出通道数为256nin_block(96, 256, kernel_size=5, strides=1, padding='same'),# 再次使用最大池化层layers.MaxPooling2D(pool_size=3, strides=2),# 第三个NIN块,输入通道数为256,输出通道数为384nin_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()
这篇关于24.9.1学习心得的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!