接昨日学习
图像增强的作用
经查阅资料,加载数据集并进行图像增强(image augmentation)是提高模型泛化能力的一种常用技术。图像增强的作用如下:
- 增加数据多样性:通过图像增强技术,可以人为地扩大训练数据集的规模和多样性,从而让模型能够学习到更多的特征,提高其泛化能力。
- 减少过拟合:当模型在训练数据上表现得非常好,但在未见过的数据上表现不佳时,可能发生了过拟合。图像增强通过提供变化的训练样本,可以减少模型对特定训练样本的依赖,从而降低过拟合的风险。
- 提升模型鲁棒性:现实世界中的图像可能受到各种因素的影响,如光照变化、遮挡、姿态变化等。图像增强可以模拟这些变化,使得模型能够更好地适应这些情况,提高模型的鲁棒性。
- 适应不同的应用场景:不同的应用场景可能需要模型适应不同的图像特性。例如,自动驾驶系统中的模型需要能够处理不同时间段、不同天气条件下的图像。图像增强可以帮助模型更好地适应这些场景。
- 数据平衡:在分类任务中,某些类别的样本可能远多于其他类别,导致模型偏向于预测样本数量多的类别。通过图像增强,可以为样本数量少的类别生成更多的训练样本,从而实现数据平衡。
- 节省标注成本:相对于手动收集和标注更多的图像数据,图像增强是一种成本效益更高的方法来扩大数据集。
常见的图像增强操作包括但不限于:
- 几何变换:如旋转、缩放、翻转、裁剪等。
- 颜色变换:如亮度、对比度、饱和度的调整。
- 噪声添加:模拟现实中的噪声干扰。
- 遮挡模拟:模拟部分图像被遮挡的情况。
- 混叠:将多个图像以某种方式混合。
定义输入部分参数的作用及含义
batch_size = 18 # 批量大小
image_size = 224 # 训练图像空间大小
num_epochs = 5 # 训练周期数
lr = 0.001 # 学习率
momentum = 0.9 # 动量
workers = 4 # 并行线程个数
- batch_size:
- 作用:批量大小(batch size)是指在一次梯度更新中使用的样本数量。它影响模型的收敛速度和稳定性。
- 含义:在您的例子中,
batch_size = 18
表示在每个训练步骤中,模型将处理18张图像,并基于这些图像的损失函数计算梯度进行权重更新。
- image_size:
- 作用:训练图像空间大小(image size)是指输入模型前,图像将被调整到的尺寸。这个尺寸通常基于模型架构的要求,例如某些卷积神经网络要求输入图像的特定尺寸。
- 含义:
image_size = 224
表示所有训练图像在输入模型之前将被缩放到224x224像素的尺寸。
- num_epochs:
- 作用:训练周期数(number of epochs)是指整个数据集被模型完整遍历的次数。每个周期结束时,模型会看到数据集中的每一张图像一次。
- 含义:
num_epochs = 5
表示模型将遍历整个数据集5次来完成训练。
- lr:
- 作用:学习率(learning rate)是决定模型参数更新步幅的超参数。合适的学习率可以加快模型的收敛速度,而过大或过小的学习率都会导致训练效果不佳。
- 含义:
lr = 0.001
是一个常见的学习率设置,表示每次权重更新的幅度相对较小,有助于模型在训练过程中逐渐逼近最优解。
- momentum:
- 作用:动量(momentum)是一种在梯度下降算法中加速学习过程的技术,可以帮助算法更快地穿过平坦区域并减少震荡。
- 含义:
momentum = 0.9
是一个常用的动量值,表示在计算参数更新时,会考虑之前梯度的指数衰减平均值,从而平滑化学习过程。
- workers:
- 作用:并行线程个数(number of workers)是指在进行数据加载时,用于并行加载数据的子进程数量。这有助于提高数据加载的效率,尤其是在数据集较大时。
- 含义:
workers = 4
表示将使用4个子进程并行加载数据,这样可以减少CPU在数据加载上的等待时间,让GPU更高效地处理数据。
数据集可视化部分代码解析
# class_name对应label,按文件夹字符串从小到大的顺序标记label
class_name = {0: "dogs", 1: "wolves"}
plt.figure(figsize=(5, 5))
for i in range(4):
# 获取图像及其对应的label
data_image = images[i].asnumpy()
data_label = labels[i]
# 处理图像供展示使用
data_image = np.transpose(data_image, (1, 2, 0))
mean = np.array([0.485, 0.456, 0.406])
std = np.array([0.229, 0.224, 0.225])
data_image = std * data_image + mean
data_image = np.clip(data_image, 0, 1)
# 显示图像
plt.subplot(2, 2, i+1)
plt.imshow(data_image)
plt.title(class_name[int(labels[i].asnumpy())])
plt.axis("off")
plt.show()
部分代码解析如下
设置图像显示大小:
plt.figure(figsize=(5, 5))
这行代码设置了图像显示区域的大小为5x5英寸。
获取图像和标签:
data_image = images[i].asnumpy() data_label = labels[i]
这部分代码从
images
和labels
数组中获取第i
个图像和对应的标签。asnumpy()
函数将图像数据从张量(可能是PyTorch或MXNet中的Tensor)转换为NumPy数组,以便进行后续处理。图像预处理:
data_image = np.transpose(data_image, (1, 2, 0)) mean = np.array([0.485, 0.456, 0.406]) std = np.array([0.229, 0.224, 0.225]) data_image = std * data_image + mean data_image = np.clip(data_image, 0, 1)
这部分代码对图像进行了一系列预处理操作。首先,
np.transpose(data_image, (1, 2, 0))
将图像的通道维度从第一个维度移动到最后一个维度,这是因为在不同的框架中,图像的存储格式可能不同,这个操作确保了图像以HWC(高度、宽度、通道)格式进行显示。接着,代码使用平均值mean
和标准差std
对图像进行标准化,然后将结果裁剪到[0, 1]的范围内,以确保图像像素值有效。显示图像:
plt.subplot(2, 2, i+1) plt.imshow(data_image) plt.title(class_name[int(labels[i].asnumpy())]) plt.axis("off")
这部分代码将图像显示在一个2x2网格的第
i+1
个位置。plt.imshow(data_image)
用于显示图像,plt.title(class_name[int(labels[i].asnumpy())])
添加了图像的标题,即图像对应的类别名称。plt.axis("off")
用于关闭图像的坐标轴显示。
构建网络部分再续
2024-07-06 15:46:07 Mindstorm