pytorch模型训练函数整理——train.py
- 一、模型训练——train.py
- 1.1 分配硬件设备——torch.device
- 1.2 原始数据划分——torch.utils.data.DataLoader
- 1.3 RMSprop初始化——torch.optim.RMSprop()
- 1.4 二分类损失函数——nn.BCEWithLogitsLoss()
- 1.5 设置训练/评估模式——model.train()和model.eval()
- 1.6 模型参数保存——torch.save()和model.state_dict()
- 1.7 关于optimizer.zero_grad(),loss.backward()和optimizer.step()
- 1.8 梯度清零/初始化——optimizer.zero_grad()
- 1.9 反向传播——loss.backward()
- 1.10 更新参数——optimizer.step()
一、模型训练——train.py
train.py: 设置硬件-->拷贝网络框架-->指定训练集-->划分训练集-->初始化优化器、设置损失函数-->初始化进度条,以epochs循环训练
epochs循环内容:开启训练模式-->根据batch_size大小开始训练
batch_size循环内容:梯度清零-->数据拷贝进硬件-->使用网络框架预测数据的结果-->计算loss,如果是最优loss则文件保存参数-->反向传播计算梯度-->更新参数
1.1 分配硬件设备——torch.device
tips:
- 用处:分配到的设备的对象,包含一个设备类型('cpu’或’cuda’设备类型)和可选的设备的序号。
- 检查cuda是否就绪,返回值为布尔类型
torch.cuda.is_available()
选择cuda或cpu设备,将网络模型net装载入device中
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
//模型装载
net.to(device=device)
1.2 原始数据划分——torch.utils.data.DataLoader
tips:
- 作用: 对数据进行 batch 的划分。在训练模型时使用到此函数,用来把训练数据分成多个小组 ,此函数 每次抛出一组数据 。直至把所有的数据都抛出。
- 主要参数
torch.utils.data.DataLoader(dataset= ,batch_size= ,shuffle= )
名称 | 类型 | 含义 |
---|---|---|
dataset | 原始数据的输入 | |
batch_size | int | 批训练数据量的大小 |
shuffle | bool | 每次迭代训练时是否将数据的顺序打乱,默认设置是False |
1.3 RMSprop初始化——torch.optim.RMSprop()
tips:
- 主要参数
torch.optim.RMSprop(params,
lr=,
alpha=,
eps=,
weight_decay=,
momentum=,
centered=)
参数名 | 作用 |
---|---|
params | 需要被更新的可学习参数 |
lr | 学习率 |
alpha | 平滑常数 |
eps | 加在分母上防止除0 |
weight_decay | 权重衰减,L2正则化系数 |
momentum | 动量,帮助模型跳出局部最优解 |
centered | 如果为真,计算居中的RMSProp,梯度由其方差估计归一化 |
1.4 二分类损失函数——nn.BCEWithLogitsLoss()
tips:
- 在BCE的基础上增加sigmoid()处理
- 基本用法:
criterion =nn.BCEWithLogitsLoss() #设置具体的损失函数算法
loss = criterion(pred, label) #放入具体的结果进行计算
参数名 | 含义 |
---|---|
pred | 模型预测结果 |
label | 实际标签 |
1.5 设置训练/评估模式——model.train()和model.eval()
tips:
- 用法:如果模型中有BN层(Batch Normalization)和 Dropout层 ,需要在训练开始之前写上 model.trian() ,在测试时写上 model.eval()
- 作用:
1)model.train() 是保证 BN 层用每一批数据的均值和方差
2) model.eval() 是保证 BN 用全部训练数据的均值和方差;
1.6 模型参数保存——torch.save()和model.state_dict()
tips:
- model.state_dict() 作用:获取模型中的所有参数,包括可学习参数和不可学习参数,其返回值是一个有序字典 OrderedDict。
- torch.save() 作用:保存模型等相关参数
- 用法1:保存整个模型(不推荐)
torch.save(model,'net.pth')
- 用法2:保存加载模型的参数(推荐,速度快,占内存少)
torch.save(model.state_dict(),'net_params.pth')
1.7 关于optimizer.zero_grad(),loss.backward()和optimizer.step()
理解optimizer.zero_grad(), loss.backward(), optimizer.step()的作用及原理
tips:
- 用法:在遍历epochs的过程中依次用到
- 作用:先将梯度归零(optimizer.zero_grad()),然后反向传播计算得到每个参数的梯度值(loss.backward()),最后通过梯度下降执行一步参数更新(optimizer.step())
1.8 梯度清零/初始化——optimizer.zero_grad()
tips:
- 作用:清除优化器关于所有参数的累计梯度值,初始化为0
- 用法:在每轮batch中设置optimizer.zero_grad() 。因为训练的过程通常使用mini-batch方法,所以如果不将梯度清零的话,梯度会与上一个batch的数据相关,因此该函数要写在反向传播和梯度下降之前。
1.9 反向传播——loss.backward()
tips:
- 作用:实现反向传播,autograd包会根据tensor进行过的数学运算来自动计算其对应的梯度。
- 用法:loss.backward()要写在optimizer.step()之前。
1.10 更新参数——optimizer.step()
tips:
- 作用:执行一次优化步骤,通过梯度下降法来更新参数的值。
- 用法:因为梯度下降是基于梯度的,所以在执行optimizer.step()函数前应先执行loss.backward()函数来计算梯度。