Epoch,Batch Size 和 Iteration
-
Epoch(周期):
-
一个 Epoch 指的是将整个训练数据集中的所有样本都过一遍(且仅过一遍)的训练过程。
-
在深度学习中,我们通常需要多次遍历整个数据集,以便模型能够更好地学习数据的特征。例如,如果您的模型进行了 10 个 Epoch 的训练,那么它将对整个数据集进行 10 次遍历。
-
-
Batch Size(批大小):
-
Batch Size 是每个训练批次所包含的样本数量。
-
在训练过程中,我们不会一次性将整个数据集送入神经网络,因为数据集可能非常大。
-
相反,我们将数据集分成小批次,每个批次的大小由 Batch Size 决定。
例如,如果您的 Batch Size 设置为 10,那么每次训练时,神经网络将使用 10 个样本进行计算。
-
-
Iteration(迭代):
-
Iteration 是完成一次 Epoch 所需的批次数量。换句话说,一个 Iteration 等于使用 Batch Size 个样本训练一次。
-
如果你的模型进行了 10 个 Epoch 的训练,并且 Batch Size 设置为 5,那么总共需要 20 个 Iteration 来完成这 10 个 Epoch。
-
具体计算方式为:总共样本数 / 每次样本数 = 迭代次数。
-
总结:我们通常需要对数据集进行多次训练,对整个数据集进行一次训练的过程我们称之为一个Epoch。但是我们一般将数据集分多次训练,在这多次训练中,一次训练的样本数量为Batch Size,训练的次数为即为迭代的次数Iteration。
DataSet和 DataLoader
介绍
1)DataSet是一个表示数据集的抽象类,我们可以自定义一个类来继承它。在自定义数据集类中,我们需要实现以下三个魔术方法:
-
__init__(self, *args, **kwargs)
: 初始化方法,用于设置数据集的属性。 -
__len__(self)
: 返回数据集中样本的数量。 -
__getitem__(self, idx)
: 根据索引idx
返回数据集中的一个样本。 -
我们也可以的需求在数据集类中添加其他方法和属性。
2)DataLoader(数据加载器) 是 PyTorch 中用于加载数据的类。它接受一个数据集对象作为参数,并根据设置的参数来生成批次数据。
常用参数:
-
dataset
: 数据集对象,通常是torch.utils.data.Dataset的子类实例,我们可以使用现有的数据集如MINIST,或者自定义一个数据集。 -
batch_size
: 每个批次中的样本数量。 -
shuffle
: 是否打乱数据集,如果该值设置为true,数据在每个epoch开始时会随机排序,有助于增加模型的泛化能力。
总结:我们可以自定义数据集类继承自 DataSet,实现必要的魔术方法。再用DataLoader 用于加载数据,根据设置生成批次数据。
代码实现
我们先引入了torch.utils.data包下的Dataset类和DataLoader类
再自定义DiabetesDataset类实现了Dataset类,在其中编写了3个方法:
1)加载数据或设置数据路径 2)返回数据集的样本数量3)根据索引 idx
返回对应的数据样本。
再实例化自定义的数据集类DiabetesDataset,再使用DataLoader创建数据加载器。
具体的代码实现如以下所示:
from torch.utils.data import Dataset
from torch.utils.data import DataLoader
class DiabetesDataset(Dataset):
def __init__(self, filepath):
# 初始化数据集属性,例如读取数据文件等
# ...
def __len__(self):
# 返回数据集中样本的数量
return len(self.x_data)
def __getitem__(self, index):
# 根据索引返回一个样本
return self.x_data[index], self.y_data[index]
# 实例化自定义的数据集类
dataset = DiabetesDataset('diabetes.csv')
# 创建数据加载器
train_loader = DataLoader(dataset=dataset, batch_size=32, shuffle=True, num_workers=2)
以上创建出来的数据集DiabetesDataset
的每个元素是一个样本,每个样本由输入特征(即特征)和对应的标签组成。
其中标签包重指数括:患者的年龄,性别,体,平均血压,六项血清测量值,家族糖尿病遗传因子(一个与糖尿病史相关的函数),怀孕次数,输出变量是换则在基线后一年内的定量测试结果,其以数值的形式进行标记。这个数值表示了糖尿病的严重程度,越高表示疾病进展越严重。
通过训练这个数据集,我们可以训练模型来预测患者是否患有糖尿病,这对于早起诊断和治疗至关重要。
torchvision模块下的常用包
torchvision
是 PyTorch 的一个扩展库,专门用于处理图像数据。以下是他的常用包。
-
模型加载与预训练模型:
torchvision.models
提供了深度学习中各种经典的网络结构和预训练好的模型,例如 AlexNet、VGG、ResNet、Inception 等。你可以通过设置
pretrained=True来加载预训练模型,也可以只加载模型结构而不加载预训练参数。什么是预训练模型?
这是一种深度学习模型的策略。就像是小孩子从小学习各种技能,英语,数学,语文,口才训练,而当他们接触到计算机时,他们小时候从小到大学到的这些技能便能够在潜移默化之中发挥作用。而预训练模型的思想便是通过在一个相关但较大的任务上训练模型,使得模型学习到通用的特征表示,以至于该模型在执行到具体任务时能够表现的更好,因为它已经学到了普性的特征。
预训练模型分为无监督预训练和监督预训练,他们之间的区别是:在无监督预训练中,模型是在没有标签的大规模数据上进行预训练的,而在有监督预训练中,模型在一个与最终任务相关的较大数据集上进行预训练。
预训练与训练又是不同的,预训练便是我们前面所述的要让模型学到普性的价值,而训练模型则是针对特定任务,最小化损失函数,优化模型参数以让该模型在该任务上表现的更好,即他们的目的是不一样的。
2.数据集加载:
-
torchvision.datasets
提供了常用的数据集,例如 MNIST、CIFAR10/100、ImageNet、COCO 等。这些数据集继承自torch.utils.data.Dataset
,方便使用torch.utils.data.DataLoader
进行多线程处理。
3.数据预处理操作:
-
torchvision.transforms
提供了常用的数据预处理操作,包括对 Tensor 和 PIL 图像对象的操作。你可以使用这些操作来进行数据增强、标准化等。
4.工具类:
-
torchvision.utils
包含一些工具类,例如将张量保存为图像文件、创建图像网格等。
加载数据集例子
现在我们以下载MNIST数据集为例对其下载数据的过程进行演示:
1.首先,我们导入了必要的库,包括 torch
、torchvision
和 transforms
。
2.接着,我们使用 datasets.MNIST
创建了两个数据集:train_dataset
和 test_dataset,
其中 train_dataset
用于训练,test_dataset
用于测试。还使用了transforms.ToTensor()
将图像转换为张量,并设置 download=True
来下载数据集(如果尚未下载),且指定了数据集的存储路径 root
。
3.然后,我们创建了训练和测试数据加载器 train_loader
和 test_loader
,用于批量加载数据。
4.最后,我们使用 enumerate(train_loader)
遍历训练数据集中的每个批次,其中 inputs
是图像数据,target
是对应的标签。
import torch
from torch.utils.data import DataLoader
from torchvision import transforms
from torchvision import datasets
train_dataset = datasets.MNIST(root='../dataset/mnist',
train=True,
transform= transforms.ToTensor(),
download=True)
test_dataset = datasets.MNIST(root='../dataset/mnist',
train=False,
transform= transforms.ToTensor(),
download=True)
train_loader = DataLoader(dataset=train_dataset,batch_size=32,shuffle=True)
test_loader = DataLoader(dataset=test_dataset,batch_size=32,shuffle=False)
for batch_idx, (inputs, target) in enumerate(train_loader):
注:
-
batch_idx
是循环的索引,inputs
和target
是从train_loader
中获取的数据。 -
enumerate(train_loader)
返回一个迭代器,它产生(batch_idx, (inputs, target))
对。
diabetes.csv 文件形式
CSV是一个纯文本格式,可以在几乎所有操作系统和应用程序中使用。它没有隐藏的格式或复杂的标记,只是纯文本和逗号。由于其简单的结构,生成和解析CSV文件也相对简单和直接。
为了演示CSV文件的格式,我从数据库查询出一些结果,并以CSV的方式进行导出,并用文本编辑器打开。其格式如下:
CSV文件可以使用各种工具和应用程序打开:
电子表格软件:如Microsoft Excel。
文本编辑器:如Notepad、TextEdit或Vim。
编程语言:如Python、Java和C++都有库或方法可以读取和处理CSV文件。
关于diabetes.csv文件,我找到了几个可能的数据集来源。
-
NCD-RisC 提供了全球、地区和国家特定的糖尿病数据下载。
-
UCI Machine Learning Repository 也提供了一个名为
Diabetes
的数据集,用于机器学习研究。
MNIST 数据集
MNIST(Modified National Institute of Standards and Technology)是一个包含手写数字的数据集。该数据集最初由 LeCun 等人在文档识别领域应用梯度下降算法时引入。MNIST 数据集包含了大量的手写数字图像,用于测试图像处理系统的性能。
MNIST 数据集包含了 0 到 9 的手写数字。训练集包含了 60,000 个样本,测试集包含了 10,000 个样本。每个样本包含两个部分:
-
image
:28x28 像素的图像,数据类型为 uint8,图像中的每个像素值表示灰度级别,从 0(黑色)到 255(白色)。 -
label
:表示图像对应的数字标签,数据类型为 int64,共有 10 个类别(0 到 9)。
MNIST 数据集常用于机器学习算法的基准测试。它是深度学习中的“Hello World”,用于验证模型的性能。我们可以在 这里 找到 MNIST 数据集的详细信息。
Titanic 数据集
Titanic 数据集是一个经典的机器学习示例,用于预测 Titanic 号船上乘客的生存情况。
该数据集被分成训练集(train.csv)和测试集(test.csv)。每个数据样本包含了乘客的特征,例如性别、舱位等级等。我们的目的是构建和训练预测模型,预测乘客是否在 Titanic 号沉船事件中幸存。我们可以访问以下链接来下载 Titanic 数据集。