T8-猫狗识别

>- **🍨 本文为[🔗365天深度学习训练营](https://mp.weixin.qq.com/s/AtyZUu_j2k_ScNH6e732ow) 中的学习记录博客**

>- **🍦 参考文章:365天深度学习训练营-第8周:猫狗识别(训练营内部成员可读)**

>- **🍖 原作者:[K同学啊 | 接辅导、项目定制](https://mtyjkh.blog.csdn.net/)**

>- **🚀 文章来源:[K同学的学习圈子](https://www.yuque.com/mingtian-fkmxf/zxwb45)**

 model.fit()与model.train_on_batch()

1.  `model.fit()`:适用于那些希望进行快速实验的人。它是一个高级 API,用户只需调用这个方法,并提供训练数据和标签,就能方便地训练模型。`model.fit()` 能处理完整的训练集,自动执行批次划分、训练迭代和验证过程。您可以通过设置 `epochs`、`batch_size` 等参数来进行简单的配置。总的来说,`model.fit()`适合初学者使用,因为它可以让他们专注于模型构建,而不用过多担心训练过程的细节。
2.  `model.train_on_batch()`:这是一个更底层的 API,尤其适用于那些希望精细控制训练过程的用户。它允许您在一个给定批次的数据上进行训练,进行权重更新,并控制训练过程中的控制结构。`model.train_on_batch()`主要在自定义训练循环中使用,可以让您添加特定条件、较精确更新学习率、保存模型权重等。请注意,当采用`model.train_on_batch()`方法时,用户需自主编写循环控制语句和数据分批操作。使用 `model.train_on_batch()` 将使您对模型训练过程有更多的控制权,但相应地会增加编写和维护代码的难度。

两者之间的选择取决于您的需求和经验水平。如果您希望简单快速地训练模型,`model.fit()` 是不错的选择。但是,如果您需要对训练过程进行更细粒度的控制,或要在训练循环中执行特定操作,那么 `model.train_on_batch()` 更符合您的需求。

`model.train_on_batch()` 是 Keras 中一个重要的方法,在 Python 深度学习库 TensorFlow 的 Keras API 中实现。它被用于更细粒度地控制模型的训练过程,能在一个给定批次的数据上训练神经网络模型。相较于使用 `fit()` 方法一次处理整个训练集,`train_on_batch()` 允许您手动地输入小批量数据(batches),并控制权重更新,以便更好地定制训练过程。

`model.train_on_batch()`的主要参数如下:

*   `x`: 输入数据的 NumPy 数组或 TensorFlow 张量,对应于模型的输入。通常,它是一个形状为`(batch_size, input_dim)`的数组或者更高维度,具体取决于您的神经网络结构。
*   `y`: 目标数据的 NumPy 数组或 TensorFlow 张量,与输入数据一一对应。对于分类任务,标签通常为形状为`(batch_size, num_classes)`的多维数组,每行包含一个 one-hot 编码向量。
*   `sample_weight`: 可选参数,一个 NumPy 数组,表示每个样本在计算损失时的权重。数组的长度应与批次中的样本数相同。这个参数允许您对训练过程进行权衡,给予具有特定特征或类别的样本更多关注。
*   `class_weight`: 可选参数,一个字典映射。将类别索引映射到该类别在计算损失时的权重。可以在数据不平衡问题中使用,以平衡损失函数中不同类别的贡献。

`model.train_on_batch()`返回一个标量值,表示单个批次上的损失,以及一个可选的度量值列表,用于评估模型性能。例如,您可能会返回损失以及分类准确率。

以下是一个使用`model.train_on_batch()`的简单示例:


    import numpy as np
    import tensorflow as tf
    from tensorflow.keras.layers import Dense, Input
    from tensorflow.keras.models import Model
    
    inputs = Input(shape=(10,))
    outputs = Dense(1, activation='linear')(inputs)
    model = Model(inputs=inputs, outputs=outputs)
    model.compile(loss='mean_squared_error', optimizer='sgd', metrics=['accuracy'])
    
    # 生成模拟数据
    train_data = np.random.random((1000, 10))
    train_labels = np.random.randint(2, size=(1000, 1))
    
    # 设置批次大小和训练回合数
    batch_size = 32
    epochs = 10
    
    # 对每个训练回合进行迭代
    for _ in range(epochs):
        for index in range(0, train_data.shape[0], batch_size):
            data_batch = train_data[index:index + batch_size]
            labels_batch = train_labels[index:index + batch_size]
    
            # 使用 train_on_batch 进行训练
            results = model.train_on_batch(data_batch, labels_batch)
    
            # 输出结果
            print(f"Batch {index // batch_size} - Loss: {results[0]}, Accuracy: {results[1]}")
    
    

在这个代码示例中,我们的模型利用输入的小批量数据手动更新权重。我们批次地训练模型,输出每个批次的损失和准确度结果。使用 `train_on_batch()` 的好处是,您可以在自定义训练循环中添加更多控制逻辑,如特定条件下修改学习率、保存模型权重等。

`shuffle()`, `prefetch()` 和 `cache()` 是 TensorFlow 的 `tf.data.Dataset` API 中的方法,用于微调数据输入管道。这些方法有助于提高模型训练速度和效率,可以让您针对特定硬件和需求进行数据管道优化。

1.  `shuffle()`:此方法用于重新随机化数据集中元素的顺序。输入参数 `buffer_size` 决定了要在其中随机抽样的元素数量。设定较大的 `buffer_size` 可在牺牲内存开销的前提下提高随机性。打乱数据集有助于避免批次间的相关性,从而改善模型的泛化性能。

示例:

    dataset = dataset.shuffle(buffer_size=10000)
    
    

1.  `prefetch()`:此方法允许数据预取,即在模型正处理当前批次数据时,可以提前加载下一个批次的数据到内存中。这样做可以减少 CPU 和 GPU 之间的空闲时间。输入参数 `buffer_size` 用于指定预取的批次数。通常使用 `tf.data.AUTOTUNE` 让 TensorFlow 自动选择合适的预取缓冲区大小。

示例:

    dataset = dataset.prefetch(buffer_size=tf.data.AUTOTUNE)
    
    

1.  `cache()`:此方法将数据集存储在缓存中(内存或本地存储),以便在后续的迭代中加速数据读取。如果您的数据集较小,或可容忍内存开销,则缓存数据集有助于提高训练速度。可选输入参数 `filename` 用于指定缓存所在位置。如未指定,数据集将存储在内存中。

示例:

    dataset = dataset.cache() # 缓存数据到内存
       # 或
       dataset = dataset.cache(filename='./cached_data') # 缓存数据到本地磁盘
    
    

在设置数据输入管道时,通常会将这些函数一起使用。例如:

    dataset = dataset.shuffle(buffer_size=10000)
                           .cache()
                           .prefetch(buffer_size=tf.data.AUTOTUNE)
    =
    
    

这段代码设置了一个随机化、缓存和预取的数据输入管道,旨在提高模型训练的速度和效率。

VGG(Visual Geometry Group)是牛津大学的一个研究团队提出的深度学习模型,获得了2014年的ILSVRC竞赛第二名。VGG模型是一个深度卷积神经网络,其主要特点是网络结构简单,易于理解和实现,但同时也存在一些缺点。

**VGG优点:**

1. 结构简单:VGG模型的结构非常简单,主要由卷积层和全连接层组成,没有引入复杂的模块,因此易于理解和实现。

2. 模型性能强大:尽管结构简单,但VGG模型在图像分类和识别等任务上表现出了很强的性能,甚至超过了一些更复杂的模型。

3. 可以处理大尺寸图像:由于VGG模型使用了大量的卷积层,因此可以处理大尺寸的图像,具有很好的适应性。

4. 可以进行微调:VGG模型可以很方便地进行微调(Fine-tuning),可以在预训练模型的基础上进行修改和优化,以适应不同的任务和数据集。

**VGG缺点:**

1. 计算资源消耗大:VGG模型由于深度较深、参数较多,因此需要大量的计算资源,训练和推理时间较长。

2. 内存占用大:由于VGG模型参数多,因此模型的存储需要大量的内存,这对于资源有限的设备来说是一个问题。

3. 没有解决过拟合问题:VGG模型没有引入正则化或者其他防止过拟合的技术,因此在小数据集上可能会出现过拟合的情况。

4. 模型复杂度高:虽然VGG模型结构简单,但由于深度较深,模型的复杂度较高,对于一些简单任务来说可能存在“杀鸡用牛刀”的情况。

5. 没有引入空间金字塔:VGG模型没有引入空间金字塔(Spatial Pyramid Pooling,SPP),因此对于不同尺寸的图像可能处理不够灵活。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值