卷积神经网络(CNN) 6.3 常用CNN架构介绍
卷积神经网络(CNN)是深度学习中一种非常重要的架构,广泛应用于图像处理、视频分析、自然语言处理等领域。CNN通过局部连接、权重共享和池化等机制,能够有效提取图像特征,减少参数数量,从而提高模型的训练效率和泛化能力。在本节中,我们将介绍几种常用的CNN架构,包括LeNet、AlexNet、VGG、GoogLeNet(Inception)、ResNet和DenseNet。每种架构都有其独特的设计理念、优缺点和适用场景。
1. LeNet
1.1 介绍
LeNet是由Yann LeCun等人在1989年提出的,是最早的卷积神经网络之一。它主要用于手写数字识别(如MNIST数据集)。
1.2 结构
LeNet的结构相对简单,包含以下层次:
- 输入层:32x32的灰度图像
- 卷积层1:6个5x5的卷积核,步幅为1,输出尺寸为28x28x6
- 池化层1:2x2的平均池化,输出尺寸为14x14x6
- 卷积层2:16个5x5的卷积核,输出尺寸为10x10x16
- 池化层2:2x2的平均池化,输出尺寸为5x5x16
- 全连接层1:120个神经元
- 全连接层2:84个神经元
- 输出层:10个神经元(对应10个数字)
1.3 优缺点
- 优点:
- 结构简单,易于实现。
- 适合小规模数据集。
- 缺点:
- 对于复杂任务,表现不佳。
- 随着网络深度增加,容易出现梯度消失问题。
1.4 示例代码
import tensorflow as tf
from tensorflow.keras import layers, models
def create_lenet():
model = models.Sequential()
model.add(layers.Conv2D(6, (5, 5), activation='tanh', input_shape=(32, 32, 1)))
model.add(layers.AveragePooling2D())
model.add(layers.Conv2D(16, (5, 5), activation='tanh'))
model.add(layers.AveragePooling2D())
model.add(layers.Flatten())
model.add(layers.Dense(120, activation='tanh'))
model.add(layers.Dense(84, activation='tanh'))
model.add(layers.Dense(10, activation='softmax'))
return model
lenet_model = create_lenet()
lenet_model.summary()
2. AlexNet
2.1 介绍
AlexNet是由Alex Krizhevsky等人在2012年提出的,标志着深度学习在计算机视觉领域的突破。它在ImageNet竞赛中取得了显著的成绩。
2.2 结构
AlexNet的结构较LeNet复杂,包含以下层次:
- 输入层:224x224的RGB图像
- 卷积层1:96个11x11的卷积核,步幅为4,输出尺寸为55x55x96
- 池化层1:3x3的最大池化,步幅为2
- 卷积层2:256个5x5的卷积核,输出尺寸为27x27x256
- 池化层2:3x3的最大池化,步幅为2
- 卷积层3:384个3x3的卷积核,输出尺寸为13x13x384
- 卷积层4:384个3x3的卷积核,输出尺寸为13x13x384
- 卷积层5:256个3x3的卷积核,输出尺寸为13x13x256
- 池化层3:3x3的最大池化,步幅为2
- 全连接层1:4096个神经元
- 全连接层2:4096个神经元
- 输出层:1000个神经元(对应1000个类别)
2.3 优缺点
- 优点:
- 通过使用ReLU激活函数加速了训练过程。
- 使用Dropout减少了过拟合。
- 缺点:
- 模型参数较多,计算资源需求高。
- 对于小数据集,容易过拟合。
2.4 示例代码
def create_alexnet():
model = models.Sequential()
model.add(layers.Conv2D(96, (11, 11), strides=4, activation='relu', input_shape=(224, 224, 3)))
model.add(layers.MaxPooling2D(pool_size=(3, 3), strides=2))
model.add(layers.Conv2D(256, (5, 5), activation='relu'))
model.add(layers.MaxPooling2D(pool_size=(3, 3), strides=2))
model.add(layers.Conv2D(384, (3, 3), activation='relu'))
model.add(layers.Conv2D(384, (3, 3), activation='relu'))
model.add(layers.Conv2D(256, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D(pool_size=(3, 3), strides=2))
model.add(layers.Flatten())
model.add(layers.Dense(4096, activation='relu'))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(4096, activation='relu'))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(1000, activation='softmax'))
return model
alexnet_model = create_alexnet()
alexnet_model.summary()
3. VGG
3.1 介绍
VGG是由牛津大学视觉几何组(Visual Geometry Group)提出的,VGGNet在2014年ImageNet竞赛中表现优异。其主要贡献在于使用了更深的网络结构和小卷积核。
3.2 结构
VGG的结构主要由3x3的卷积层和2x2的最大池化层组成,常见的有VGG16和VGG19:
- 输入层:224x224的RGB图像
- 卷积层:多个3x3的卷积层,逐渐增加卷积核数量
- 池化层:2x2的最大池化
- 全连接层:4096个神经元(两层)
- 输出层:1000个神经元
3.3 优缺点
- 优点:
- 通过使用小卷积核,增加了网络深度,提升了特征提取能力。
- 结构简单,易于理解和实现。
- 缺点:
- 参数量大,计算资源需求高。
- 对于小数据集,容易过拟合。
3.4 示例代码
def create_vgg16():
model = models.Sequential()
model.add(layers.Conv2D(64, (3, 3), activation='relu', padding='same', input_shape=(224, 224, 3)))
model.add(layers.Conv2D(64, (3, 3), activation='relu', padding='same'))
model.add(layers.MaxPooling2D(pool_size=(2, 2), strides=2))
model.add(layers.Conv2D(128, (3, 3), activation='relu', padding='same'))
model.add(layers.Conv2D(128, (3, 3), activation='relu', padding='same'))
model.add(layers.MaxPooling2D(pool_size=(2, 2), strides=2))
model.add(layers.Conv2D(256, (3, 3), activation='relu', padding='same'))
model.add(layers.Conv2D(256, (3, 3), activation='relu', padding='same'))
model.add(layers.Conv2D(256, (3, 3), activation='relu', padding='same'))
model.add(layers.MaxPooling2D(pool_size=(2, 2), strides=2))
model.add(layers.Conv2D(512, (3, 3), activation='relu', padding='same'))
model.add(layers.Conv2D(512, (3, 3), activation='relu', padding='same'))
model.add(layers.Conv2D(512, (3, 3), activation='relu', padding='same'))
model.add(layers.MaxPooling2D(pool_size=(2, 2), strides=2))
model.add(layers.Conv2D(512, (3, 3), activation='relu', padding='same'))
model.add(layers.Conv2D(512, (3, 3), activation='relu', padding='same'))
model.add(layers.Conv2D(512, (3, 3), activation='relu', padding='same'))
model.add(layers.MaxPooling2D(pool_size=(2, 2), strides=2))
model.add(layers.Flatten())
model.add(layers.Dense(4096, activation='relu'))
model.add(layers.Dense(4096, activation='relu'))
model.add(layers.Dense(1000, activation='softmax'))
return model
vgg16_model = create_vgg16()
vgg16_model.summary()
4. GoogLeNet(Inception)
4.1 介绍
GoogLeNet是由Google提出的,采用了Inception模块,能够在保持较低计算量的同时,增加网络深度和宽度。
4.2 结构
GoogLeNet的结构较为复杂,主要由多个Inception模块组成:
- 输入层:224x224的RGB图像
- Inception模块:多个不同大小的卷积核并行处理
- 池化层:2x2的最大池化
- 全连接层:1000个神经元
4.3 优缺点
- 优点:
- 通过Inception模块,能够有效提取多尺度特征。
- 参数量相对较少,计算效率高。
- 缺点:
- 结构复杂,难以理解和实现。
- 对于小数据集,可能不如简单模型表现好。
4.4 示例代码
def create_googlenet():
model = models.Sequential()
model.add(layers.Conv2D(64, (7, 7), strides=2, activation='relu', input_shape=(224, 224, 3)))
model.add(layers.MaxPooling2D(pool_size=(3, 3), strides=2))
model.add(layers.Conv2D(192, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D(pool_size=(3, 3), strides=2))
# Inception模块
model.add(layers.Conv2D(64, (1, 1), activation='relu'))
model.add(layers.Conv2D(128, (1, 1), activation='relu'))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.Conv2D(128, (1, 1), activation='relu'))
model.add(layers.Conv2D(128, (5, 5), activation='relu'))
model.add(layers.GlobalAveragePooling2D())
model.add(layers.Dense(1000, activation='softmax'))
return model
googlenet_model = create_googlenet()
googlenet_model.summary()
5. ResNet
5.1 介绍
ResNet是由Microsoft提出的,采用了残差学习的思想,能够训练非常深的网络(如152层)。
5.2 结构
ResNet的核心是残差块(Residual Block),通过跳跃连接(Skip Connection)解决了深度网络中的梯度消失问题:
- 输入层:224x224的RGB图像
- 残差块:多个残差块堆叠
- 全连接层:1000个神经元
5.3 优缺点
- 优点:
- 通过残差学习,能够训练更深的网络。
- 有效缓解了梯度消失问题。
- 缺点:
- 结构复杂,训练时间较长。
- 对于小数据集,可能不如简单模型表现好。
5.4 示例代码
def create_resnet():
model = models.Sequential()
model.add(layers.Conv2D(64, (7, 7), strides=2, activation='relu', input_shape=(224, 224, 3)))
model.add(layers.MaxPooling2D(pool_size=(3, 3), strides=2))
# 残差块
for _ in range(3):
model.add(layers.Conv2D(64, (3, 3), padding='same', activation='relu'))
model.add(layers.Conv2D(64, (3, 3), padding='same'))
model.add(layers.Add())
model.add(layers.Activation('relu'))
model.add(layers.GlobalAveragePooling2D())
model.add(layers.Dense(1000, activation='softmax'))
return model
resnet_model = create_resnet()
resnet_model.summary()
6. DenseNet
6.1 介绍
DenseNet是由Gao Huang等人提出的,采用了密集连接的思想,使得每一层都与前面所有层相连。
6.2 结构
DenseNet的结构由多个密集块(Dense Block)组成,每个块内部的层之间有直接连接:
- 输入层:224x224的RGB图像
- 密集块:多个密集块堆叠
- 全连接层:1000个神经元
6.3 优缺点
- 优点:
- 通过密集连接,能够有效利用特征,减少参数数量。
- 有效缓解了梯度消失问题。
- 缺点:
- 结构复杂,训练时间较长。
- 对于小数据集,可能不如简单模型表现好。
6.4 示例代码
def create_densenet():
model = models.Sequential()
model.add(layers.Conv2D(64, (7, 7), strides=2, activation='relu', input_shape=(224, 224, 3)))
model.add(layers.MaxPooling2D(pool_size=(3, 3), strides=2))
# 密集块
for _ in range(4):
model.add(layers.Conv2D(32, (3, 3), padding='same', activation='relu'))
model.add(layers.Conv2D(32, (3, 3), padding='same'))
model.add(layers.Add())
model.add(layers.Activation('relu'))
model.add(layers.GlobalAveragePooling2D())
model.add(layers.Dense(1000, activation='softmax'))
return model
densenet_model = create_densenet()
densenet_model.summary()
总结
在本节中,我们介绍了几种常用的卷积神经网络架构,包括LeNet、AlexNet、VGG、GoogLeNet、ResNet和DenseNet。每种架构都有其独特的设计理念、优缺点和适用场景。在实际应用中,选择合适的CNN架构需要根据具体任务、数据集规模和计算资源等因素进行综合考虑。希望本节内容能够帮助你更好地理解和应用卷积神经网络。