训练DPT:由测试test到训练train图像的一个epochs的optimize.zero_grad() loss.backward() optimizer.step()
时间:2022-12-03 04:00:00
我不知道你是否有这种感觉。许多研究论文通常会给他们test.py文件,但它train.py文件通常是空白的。在这个时候,我感觉到了文章test确实很nice,我只想探索其更原始、最优参数和训练参数的过程。然后我们必须开始研究如何从test进一步得到train呢?
我想的是,我绝对不是唯一一个想这样做的人。我的前任一定有不同的经验分享。这只是我的初步探索test到构建train:
1.研究现有的train.py文件:
- 我们可以从现有的研究所携带train文件学习他是如何训练的,这里还是很安利的adabin的培训文件,其整体结构详细列出,同时结合在线可视化wandb工具。
2.比较研究可以发现test和train一般差异:
- test:简单从inpu通过模型读取图像model处理,直接输出output,图像张数不受限制。
- train:调用数据集(多个图像),训练方法(CPU/GPU/GPUs),损失函数(loss),优化器(Optimizer),调度器(Scheduler),训练流程(train loop),验证流程(validation loop)。
其中很多训练都差不多,会的test修改时,除了添加缺失的模块外,还需要修改test这个过程,不再是简单的输入输出,而是进一步的数据集,同时增加损失,test它被修改成train。
3.实践
以DPT实践,学习adabins的train文件,将其test.py进行修改成train,主要是图像预处理涉及正确读取和train中的遍历epochs(详情请参考)
- optimize.zero_grad():
- 通过p.grad.detach_()切断反向传播的梯度流,然后通过p.grad.zero_()函数将每个参数的梯度值设置为0,即上次的梯度记录被清空。因为通常使用训练过程mini-batch因此,如果梯度不清除,梯度将与上一个相匹配batch因此,该函数应写在反向传输和梯度下降之前。
- loss.backward():
- 损失函数loss模型的所有权重w是通过一系列操作获得的,如果某个wrequires_grads为True,所有上层参数(后层权重)w)的.grad_fn相应的操作保存在属性中,然后在使用中loss.backward()之后,每个w的梯度值将逐层反向传播计算,并保存到w.grad属性中。假如没有tensor.backward()梯度值将是None,因此loss.backward()要写在optimizer.step()之前。假如没有tensor.backward()梯度值将是None,因此loss.backward()要写在optimizer.step()之前。
- PyTorch反向传播(即tensor.backward()通过autograd包实现,autograd包会根据tensor自动计算相应的梯度。具体来说,torch.tensor是autograd如果设置了包的基本类,tensor的requires_grads为True,就会开始跟踪这个tensor如果您在完成操作后使用上述所有操作tensor.backward(),所有梯度将自动运行,tensor梯度会累积到它身上.grad去属性。
- 损失函数loss模型的所有权重w是通过一系列操作获得的,如果某个wrequires_grads为True,所有上层参数(后层权重)w)的.grad_fn相应的操作保存在属性中,然后在使用中loss.backward()之后,每个w的梯度值将逐层反向传播计算,并保存到w.grad属性中。假如没有tensor.backward()梯度值将是None,因此loss.backward()要写在optimizer.step()之前。假如没有tensor.backward()梯度值将是None,因此loss.backward()要写在optimizer.step()之前。
- optimizer.step():
- step()函数的作用是通过梯度下降法执行优化步骤,更新参数值。由于梯度下降是基于梯度的,因此正在执行中optimizer.step()函数前应执行loss.backward()计算梯度的函数。optimizer梯度只负责梯度下降的优化,而不负责梯度的生成tensor.backward()生成的方法。
-
model.train():
-
使 model 此时成为训练模式 dropout 和 batch normalization 操作可以防止网络过拟合。
-
-
model.eval():
-
PyTorch会自动把 BN 和 DropOut 固定,不会取平均值,而是用训练值。否则,一旦测试集 Batch Size 太小,很容易被抓住 BN 层导致图片颜色失真。
-
- with torch.no_grad():
- PyTorch 梯度将不再计算,这将使模型 forward 显存需求大幅减少,速度大幅提高。
DPT的train loop
for epoch in range(args.epoch, epochs): ######################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################## Train loop ########################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################### if should_log: wandb.log({"Epoch": epoch}, step=step) for i, batch in tqdm(enumerate(train_loader), desc=f"Epoch: {epoch 1}/{epochs}. Loop: Train", total=len(train_loader)) if is_rank_zero( args) else enumerate(train_loader): optimizer.zero_grad() #完成tensor数据向GPU复制粘贴 img = batch['image'].to(device) depth = batch['depth'].to(device) pred = model.forward(img) #print(pred) pred =pred.unsqueeze(1) #print(pred) mask = depth #loss = criterion_ueff(pred, depth, mask=mask.to(torch.bool), interpolate=True) loss = ss(pred, depth, mask=mask.to(torch.bool),interpolate=True) loss.backward() nn.utils.clip_grad_norm_(model.parameters(), 0.1) # optional optimizer.step() if should_log and step % 5 == 0: wandb.log({f"Train/{ss.name}": loss.item()}, step=step) # wandb.log({f"Train/{criteion_bins.name}": l_chamfer.item()}, step=step)
step += 1
scheduler.step()
#########################################################################
return model