深度学习学习日记4.17

发布于:2024-04-20 ⋅ 阅读:(19) ⋅ 点赞:(0)

几乎正确。。。。在这里插入图片描述

评估 IoU

1.对于每个样本,计算其对应的 IoU 值。
2.将这些 IoU 值存放到一个列表中。
3.对列表中存放的 IoU 值进行求平均操作,得到该 epoch 的平均 IoU。
在这里插入图片描述
将 IoU 计算部分移到 CPU 上的主要原因是确保能够顺利地将计算得到的 IoU 值存储到列表中,以便后续的处理和分析。

传递训练数据给模型

1.准备数据集: 将数据集准备成模型可接受的格式,包括将数据划分为训练集、验证集和测试集等。
2.数据加载器: 使用数据加载器来加载训练数据。数据加载器负责从数据集中加载数据,并将其提供给模型进行训练。
3.迭代训练: 通过迭代训练来传递数据给模型。在每个训练迭代中,模型从数据加载器中获取一个批次的数据,然后根据这些数据更新模型的参数。

损失函数的训练

1.定义损失函数: 根据任务的特性选择合适的损失函数。常见的损失函数包括均方误差(MSE)、交叉熵损失等。
2.计算损失: 将模型的预测值与真实标签进行比较,计算损失值。这个过程通常在每个训练迭代中进行。
3.反向传播: 将损失值反向传播回模型,利用反向传播算法计算模型参数对损失函数的梯度。
4.优化器更新参数: 使用优化器(如随机梯度下降、Adam 等)根据损失函数的梯度来更新模型的参数,以降低损失值。

为什么每个epoch都要进行梯度清零操作

在每个 epoch 开始时进行梯度清零操作是为了确保每个 epoch 内的梯度计算是独立的,不会受到上一个 epoch 的影响。
每个 epoch 是对整个训练数据集的一次完整遍历,而在每次遍历过程中,模型的参数都会根据当前批次数据的梯度进行更新。
如果在每个 epoch 开始时不清零梯度,那么在上一个 epoch 结束时计算的梯度将会被累积到下一个 epoch 的梯度计算中,这可能会导致不正确的参数更新。
因此,为了确保每个 epoch 内的梯度计算是独立的,我们需要在每个 epoch 开始时将梯度清零。这样可以确保模型在每个 epoch 内都是根据当前批次数据计算的梯度进行更新,从而提高训练的稳定性和准确性。

loss.backward()

loss.backward() 方法就是用来计算损失函数相对于模型参数的梯度。
在深度学习中,优化算法通过调整模型参数来最小化损失函数,而梯度则指示了损失函数在参数空间中的变化方向。
oss.backward() 方法使用自动微分技术,沿着计算图计算损失函数对模型参数的梯度,并将梯度存储在相应参数的 .grad 属性中。这些梯度随后用于优化算法的参数更新步骤,从而使模型能够逐渐收敛到最优解。

model.eval()

model.eval() 是 PyTorch 中的一个方法,用于将模型设置为评估模式。在评估模式下,模型的行为会有所不同,主要体现在两个方面:
1.Dropout 和 Batch Normalization 的行为变化: 在评估模式下,model.eval() 会将 Dropout 和 Batch Normalization 层设置为不进行随机失活或批量归一化。这是因为在评估模式下,我们通常希望得到确定性的结果,而不是在训练过程中引入随机性。
2.梯度计算的关闭: 在评估模式下,PyTorch 不会计算梯度,因为在评估模式下,我们通常只是对模型进行前向推理,而不需要进行反向传播和梯度计算。
因此,通过调用 model.eval() 方法,可以确保在评估模式下使用模型时,模型的行为符合预期,并且不会引入不必要的随机性或梯度计算。

自定义 Dataset 类

1.数据加载与预处理: 通过自定义 Dataset 类,可以灵活地组织和加载各种类型的数据,例如图像、文本、时间序列等。你可以在 getitem 方法中实现数据的加载和预处理逻辑,例如图像的缩放、裁剪、标准化,文本的分词和编码,以及其他任何预处理步骤。
2.数据集定制: 自定义 Dataset 类允许你根据具体任务和数据集的特点进行定制。可以根据需求定义不同的 Dataset 类,处理不同格式的数据或应用特定的数据增强技术,以满足模型训练的需要。
3.与 DataLoader 结合使用: 自定义 Dataset 类与 PyTorch 的 DataLoader 结合使用,可以实现高效的数据批量加载和并行处理。DataLoader 可以根据设定的 batch size 自动将数据分成小批次,并在多个 CPU 核心上并行加载和处理数据,从而提高训练效率。
4.代码复用和可维护性: 将数据加载和预处理逻辑封装在 Dataset 类中,有助于提高代码的复用性和可维护性。通过定义清晰的接口和方法,你可以使数据加载和预处理逻辑更易于理解、修改和扩展,同时也方便与其他组件进行集成。