Skip to content

lichunying20/Code-Annotation

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

29 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Code-Annotation

训练前应该做的初始化

在启动一个PyTorch训练工程之前,除了准备好数据集,还需要配置和初始化以下内容:

1、设定随机种子(random seed): 在训练神经网络时,使用相同的随机种子可以确保实验的可重现性,避免每次运行程序得到不同的结果。一般来说,在程序的开头处使用 torch.manual_seed(seed) 指定随机种子即可。

2、定义网络结构:根据实验需求,需要定义神经网络的结构,包括输入层、隐藏层、输出层以及激活函数等。

3、定义损失函数(loss function):损失函数是机器学习中的重要组件,用以衡量模型预测结果与真实结果的差异。常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。

4、初始化网络参数:通过对神经元权重矩阵、偏置向量等参数进行初始化,可以提高神经网络的性能。PyTorch中可以使用torch.nn.init 模块下的函数进行参数初始化。

5、设置优化器(optimizer)和学习率(learning rate):在神经网络的训练过程中,需要使用优化算法对损失函数进行优化,加速神经网络的学习。目前常用的优化算法包括随机梯度下降(SGD)、Adam、Adagrad 等,而学习率则决定了每次参数更新的步长,需要根据实验需求进行设置。

总之,在启动一个PyTorch训练工程之前,需要先将以上内容进行初始化和配置,以保证训练过程的正确性和稳定性。

在 Pytorch 中做好优化的初试准备

1、定义模型:首先需要定义神经网络模型的架构,包括每一层的输入输出大小、激活函数、参数个数等等。

2、定义损失函数:在训练模型时,需要定义一个损失函数来衡量模型预测结果与真实标签之间的差距。

3、定义优化器:在训练模型时,需要使用一个优化器来更新模型参数,使得损失函数值逐渐降低。PyTorch中提供了多种优化器,如SGD、Adam、Adagrad等。

4、定义超参数:优化算法中有一些需要手动指定的超参数,如学习率、权重衰减系数、动量系数等等。这些超参数需要在训练前进行设定,并根据实验结果进行调整。

5、加载数据集:在训练模型时需要加载训练集和验证集,并对数据进行预处理、数据增强等操作。

6、定义训练循环:在训练模型时需要定义一个训练循环,包括对每一批数据的前向传播、反向传播、参数更新等操作。

以上步骤是PyTorch中进行优化算法准备的基本步骤,不同的任务可能需要根据具体需求进行调整。

代码注释

import ...

# 初始化参数
def get_args():...

class Worker:
    def __init__(self, args):
        self.opt = args

        # 判定设备
        self.device = torch.device('cuda:0' if args.is_cuda else 'cpu')
        # 将模型和数据移到GPU或CPU上进行训练和推理。如果args.is_cuda为True,则将设备设置为cuda:0,否则设置为cpu。
        kwargs = {
            'num_workers': args.num_workers,
            # 这个参数表示工作程序数量。但要注意进程数量过高可能会导致系统资源占用过多,而影响其他进程的运行。
            # 如果在训练期间使用GPU加速,则需要将此变量设置为较高值以确保数据加载不成为主要瓶颈。如果在CPU上训练,则最好将其设置为使用 CPU 核心的数量。
            'pin_memory': True,
        } if args.is_cuda else {}

        # 载入数据
        train_dataset = datasets.ImageFolder(
            args.train_dir,
            # 指定了训练数据的目录,args.train_dir是一个参数,代表了训练数据的目录路径,该路径会被传递给训练代码中的相关函数,使得数据可以被正确地读取和使用。
            transform=transforms.Compose([
                transforms.RandomResizedCrop(256),
                # 对图片进行随机大小裁剪,并将其调整为256x256的大小。
                transforms.ToTensor()
                # 是一个数据预处理操作,用于将PIL图像或numpy.ndarray数组转换为PyTorch张量(Tensor)格式。
                # 在转换过程中,图像的像素值将被缩放到0到1之间,并且通道顺序将被调整为PyTorch所需的顺序(即将通道维度从最后一维移到第二维)。
                # transforms.Normalize(opt.data_mean, opt.data_std)
            ])
        )
        val_dataset = datasets.ImageFolder(
           ...
        )
        self.train_loader = DataLoader(
            dataset=train_dataset,
            # 将定义数据集用于模型训练,这个操作将数据集传递给模型训练器,这样它就可以使用数据来训练我们的模型。
            batch_size=args.batch_size,
            # batch_size是指每一次模型训练时,输入的数据分成的小块的大小。这个值决定了一次训练中跑多少个样本。
            shuffle=True,
            # shuffle=True在模型训练中的作用是使每个epoch中的训练数据顺序随机化,从而增加训练的随机性和稳定性。这样可以防止模型在顺序训练过程中出现输入相关的过拟合现象。
            **kwargs
        )
        
        self.val_loader = DataLoader(
            ...
        )

        # 挑选神经网络、参数初始化
        ...

        self.model = net.to(self.device)#将模型(net)移动到指定的设备(device)上进行训练

        # 优化器
        self.optimizer = optim.AdamW(
            self.model.parameters(),
            # 它返回可训练参数的生成器。在模型训练中,它通常用于传递给优化器(optimizer)的参数,以便调整模型参数以最小化损失函数(loss function)。
            lr=args.lr
            # lr=args.lr 是将命令行参数中传入的学习率赋值给 lr 变量,其中 args.lr 是命令行参数中指定的学习率。
            # 这个代码会在模型训练时使用指定的学习率,以控制模型参数的调整速度。
        )

        # 损失函数
        self.loss_function = nn.CrossEntropyLoss()
        # 定义模型训练过程中的损失函数,即交叉熵损失函数,用于计算模型预测输出和真实标签之间的差异。

        # warm up 学习率调整部分
        ...

    def train(...):...
    def val(...):...

if __name__ == '__main__':
    # 初始化
    ...   
    worker = Worker(args=args)
    # 创建了一个名为worker的Worker对象,并将args作为参数传递给它的构造函数,以便在本地或远程计算机上进行多进程训练。
    # Worker对象是 PyTorch 的 DistributedDataParallel 组件的一部分,它利用多进程并行计算来加速模型训练过程,并帮助在多个GPU、多个计算机上训练模型。

    # 训练与验证
    for epoch in range(1, args.epochs + 1):...

在终端启动训练

输入以下命令

python train.py 

训练结果

image

更改参数设置并启动训练(有启动训练的命令即可)

更改为以下参数

image

输入以下命令(参数更改后)

python train.py --epochs 10 --save_station 1 --model ResNet34

参数更改后的训练结果

image

个人总结

1、知道了启动一个Pytorch训练工程之前,除了数据集之外还需要进行的初始化以及在Pytorch 中怎么做好优化的初试准备。

2、了解了如何在终端启动训练并补充命令的参数设置。

3、代码注释的可能不够简洁明了,有点啰嗦。注释一般写在代码上方或右侧,而我写在了代码的下方。

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages