>- **🍨 本文为[🔗365天深度学习训练营](https://mp.weixin.qq.com/s/AtyZUu_j2k_ScNH6e732ow) 中的学习记录博客**
>- **🍦 参考文章:365天深度学习训练营-第9周:猫狗识别-2(训练营内部成员可读)**
>- **🍖 原作者:[K同学啊 | 接辅导、项目定制](https://mtyjkh.blog.csdn.net/)**
>- **🚀 文章来源:[K同学的学习圈子](https://www.yuque.com/mingtian-fkmxf/zxwb45)**
image_dataset_from_directory
是一个用于从目录中加载图像数据集的实用函数,它属于 TensorFlow 的 Keras 预处理模块。这个函数可以帮助您轻松地从文件系统中的目录结构加载图像数据,以便为深度学习任务准备数据。
shuffle()
, prefetch()
和 cache()
是用于处理数据集的常用方法,它们在许多深度学习框架中都可以找到,如TensorFlow和PyTorch。这些方法有助于提高数据处理效率,从而加速模型训练。
-
shuffle(buffer_size)
:打乱数据集的顺序。buffer_size
参数指定了用于存储样本的缓冲区大小。在每次迭代时,都会从缓冲区中随机选择一个样本进行训练。这有助于避免模型在训练过程中对数据顺序的依赖。通常,buffer_size
应设置为接近或等于数据集大小,以便在每次迭代时都能实现充分的随机化。 -
prefetch(buffer_size)
:预取数据。该方法会在训练过程中预先加载一定数量的数据(由buffer_size
参数指定),从而确保在模型训练时始终有足够的数据可用。这有助于降低数据加载的延迟,使模型训练更加高效。 -
cache(filename)
:将数据集缓存到内存或磁盘中。如果filename
参数为空,则数据集会被缓存到内存中;否则,数据集会被缓存到指定的文件中。缓存数据集可以加速数据的读取速度,尤其是在多次迭代训练时,这样可以避免每次迭代都从原始数据源中加载数据。
VGG(Visual Geometry Group)是一种深度卷积神经网络,由牛津大学的VGG小组开发。该网络在2014年的ImageNet竞赛中取得了优异的成绩。VGG网络的主要特点是其简单的结构和使用多个连续的小卷积核(3x3)来构建深度网络。VGG有多个版本,如VGG-16和VGG-19,数字代表网络层数。下面是VGG的优缺点分析:
VGG优点:
1. 结构简单:VGG网络结构非常简单和规整,主要由卷积层和全连接层组成,易于理解和实现。
2. 层次丰富:VGG网络具有较深的层次,这使得它可以学习更多的特征表示,提高了模型的准确性。
3. 模块化设计:VGG网络采用模块化设计,可以方便地扩展网络结构和深度,以满足不同任务的需求。
4. 特征提取能力强:由于VGG网络的深度和多层小卷积核的设计,它具有很强的特征提取能力,能够捕捉图像中的细节特征。
5. 预训练模型丰富:VGG网络在多个领域和任务上均有预训练模型,可以方便地用于迁移学习和微调,加速模型训练和优化过程。
VGG缺点:
1. 计算量大:VGG网络由于其深度和多层卷积操作,导致计算量较大,需要较高的计算资源。
2. 参数量多:VGG网络包含大量的参数,尤其是全连接层,这使得模型容易过拟合,同时也增加了模型的存储和计算需求。
3. 训练时间长:由于VGG网络的计算量大和参数量多,训练过程通常需要较长时间,尤其是在大规模数据集上。
4. 模型冗余:VGG网络中的全连接层可能导致模型冗余,一些研究表明,将全连接层替换为全局平均池化层可以减少参数量,提高模型效率。
5. 难以适应新的任务:虽然VGG网络在许多任务上取得了优异的成绩,但其结构相对固定,可能难以适应一些特定任务的需求。后续的网络结构(如ResNet、Inception等)通过更复杂的设计,提高了模型的灵活性和适应性。
VGG-16包含了16个隐藏层(13个卷积层和3个全连接层),故称为VGG-16
from tensorflow.keras import layers, models, Input
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Dense, Flatten, Dropout
def VGG16(nb_classes, input_shape):
input_tensor = Input(shape=input_shape)
# 1st block
x = Conv2D(64, (3,3), activation='relu', padding='same',name='block1_conv1')(input_tensor)
x = Conv2D(64, (3,3), activation='relu', padding='same',name='block1_conv2')(x)
x = MaxPooling2D((2,2), strides=(2,2), name = 'block1_pool')(x)
# 2nd block
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)
# 3rd block
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)
# 4th block
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)
# 5th block
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)
# full connection
x = Flatten()(x)
x = Dense(4096, activation='relu', name='fc1')(x)
x = Dense(4096, activation='relu', name='fc2')(x)
output_tensor = Dense(nb_classes, activation='softmax', name='predictions')(x)
model = Model(input_tensor, output_tensor)
return model
model=VGG16(1000, (img_width, img_height, 3))
model.summary()