文章目录
0. 前言
- 目标:
- 模型输出的形式。
- 数据集标签是的形式。
- 损失函数在哪里计算,有哪些选择。
- 训练相关细节:
- hooks
- loggings
- tensorboard
- lr
- 训练一般通过
tools/run_net.py实现,其中调用了tools/train_net.py中的def train(cfg)方法。
1. 训练流程
- 第一步:初始化若干参数,包括日志参数、分布式训练参数、random seed、multigrid等。
- 第二步:构建模型,并统计模型中的参数数量以及计算量。
- 第三步:构建训练相关功能模块,包括优化器、预训练模型、tensorboard、性能指标监控等。
- 第四步:构建训练集/验证集。
- 第五步:实际训练。这一部分包括很多内容,稍微罗列下。
- 设置 multigrid 参数。
- 训练一个epoch,即遍历训练集一次计算损失函数、梯度下降、更新参数、更新tensorboard参数。
- 更BN参数(Compute precise BN stats)
- 保存模型。
- 在验证集上进行验证。
2. 损失函数相关
- 关注的细节:
- 输入数据形式
- 模型输出形式
- 损失函数选择与计算
2.1. 输入数据的形式:
data_loader的结果包括四个,frames, label, index, extra_data- frames 的形式是
C, T, H, W,经过loader后应该就是B, C, T, H, W. - label分两种情况,对于ava形式是
[num_boxes, num_classes],经过loader后就是batch_size, num_boxes, num_classes,kinetics的形式是整数,经过loader后是[batch_size]。 - index是整数,经过loader后是
[batch_size] extrac_data只有 ava有,kinetcis没有,是一个字典,包括boxes, ori_boxes, metadata三个key。
2.2. 模型输出形式:
- 模型分为两种,行为识别模型以及时空行为检测模型。
- 行为识别模型对应
slowfast/models/head_helper.py中的ResNetBasicHead。- 在该header中会先通过一个avg pooling,将输入的
N, C, T, H, W转换为N, C, 1, 1, 1的形式,然后再transpose进行fc操作,最终得到[N, num_classes]的logits。 - 如果有多路分支会在ROI Pooling后将特征进行concat。
- 在该header中会先通过一个avg pooling,将输入的
- 时空行为检测模型对应
slowfast/models/head_helper.py中的ResNetRoIHead。- 这部分操作先会根据
T纬度进行avg pool,将输入从N, C, T, H, W转换为N, C, H, W,之后就是普通的ROI Pooling+fc判断每个ROI的类别,最终结果是[num_boxes, num_classes]。 - 如果有多路分支会在ROI Pooling后将特征进行concat。
- boxes 是要外部输入(而不是算法内部生成)。
- 这部分操作先会根据
2.3. 损失函数选择与计算
- 通过
slowfast/models/losses.py中的get_loss_func实现,包括了nn.CrossEntropyLossnn.BCELossnn.BCEWithLogitsLoss
3. 性能指标/logging/tensorboard 相关
3.1. 性能指标(包括logging)
- AVA 使用
slowfast/utils/meters.py中的AVAMeter记录相关性能指标。 - 行为识别数据集使用
slowfast/utils/meters.py中的TrainMeter记录相关性能指标。 - 相关类的常用方法是:
iter_tic与iter_toc来设置开始、结束结束。update_stats更新记录的参数。log_iter_stats输出每iter的数据,有logging和本地json文件两种输出方式。log_epoch_stats输出每epoch的数据,有logging和本地json文件两种输出方式。
- log记录的内容包括:
_type:表示的是log数据类型,比如train_iter/val_iter/test_iter/val_epoch/test_epochcur_epochcur_itereta:训练剩余时间。计算方法是:当前 iter 时间 * (总iter数量 - 当前iter编号)- 训练的时候,这个数值存在较大问题:如果进行100次训练,其中一个iter耗时很长,剩余耗时很短,那
eta展示的时间就很有迷惑性。
- 训练的时候,这个数值存在较大问题:如果进行100次训练,其中一个iter耗时很长,剩余耗时很短,那
time_diff:当前 iter 使用时间(不知道为啥叫这个名字)mode:train/val/test其中之一losslrtop1_err/top5_err:仅用于行为识别数据集。
- 记录一些需要累加算平均的数值时,使用了
slowfast/utils/meters.py中的ScalarMeter - 其他用到的一些配置参数
cfg.LOG_PERIOD:log的频率cfg.DATA.MULTI_LABEL:判断是否需要输出top1/top5_err
3.3. tensorboard
- 主要实现代码都在
slowfast/utils/tensorboard_vis.py中。- 基本功能都封装在
TensorboardWriter中。
- 基本功能都封装在
- 常用参数:
cfg.TENSORBOARD.ENABLE:是否使用tensorboard相关功能。默认关闭cfg.TENSORBOARD.LOG_DIR:保存路径,空是保存在cfg.OUTPUT_DIR中。
- 所做的工作
- 训练的时候就是记录
loss/lr/top1_err/top5_err。 - 每个iter都记录。
- 训练的时候就是记录
4. 多线程/分布式训练相关
-
之后补充

本文详细解析深度学习模型的训练流程,涵盖初始化参数、构建模型、选择损失函数、性能指标记录、多线程及分布式训练等内容,深入探讨输入数据与模型输出形式,以及损失函数的计算方式。
3195

被折叠的 条评论
为什么被折叠?



