每一场Kaggle比赛都一个项目,代码则需要按照规范进行整理。项目规范方便后续的沟通、迭代,非常关键。本文将对竞赛和深度学习通用项目的规范细节进行整理。
首先确定好具体任务,然后根据任务选择合适的框架,如PyTorch Lightning
或MMDection
。
如果框架有默认目录,则遵守。否则可以创建适合自己的目录,一般而言目录推荐如下:
general
:常见的训练过程、保存加载模型过程,与具体任务相关的代码。layers
:模型定义、损失函数等;experiments
:具体任务的训练流程、数据读取和验证过程;general/
│ train.py
│ task.py
│ mutils.py
layers/
experiments/
│ task1/
│ train.py
│ task.py
│ eval.py
│ dataset.py
│ task2/
│ train.py
│ task.py
│ eval.py
│ dataset.py
Notebook虽然很好用,但是具体.py
代码实际运行和管理更加方便。所以命令行解析就非常关键。
你可以选择自己喜欢的参数解析器,在命令行中一般推荐加入学习率、batch、seed等超参数。
python train.py --learning ... --seed ... --hidden_size ...
在调试和训练模型的过程中,肯定需要多次训练,此时TensorBoard
可以非常好的管理实验日志。
调参是非常乏味的,比较重要的是确定好学习率
和batch size
。学习率和优化器有非常多的选择,SGD是一个比较好的开始。一般而言模型越深,学习率越小。batch size越大,学习率越大。
深度学习模型有一定的随机性,模型是否可复现非常重要。在比赛期间,非常推荐提前把不同fold的次序存储到文件,减少随机性。
把配置文件、模型权重、日志文件保存好,这样每次都可以进行实验对比。
torch.manual_seed(SEED)
torch.cuda.manual_seed_all(SEED)
np.random.seed(SEED)
random.seed(SEED)
torch.backends.cudnn.deterministic = True
from tfdeterminism import patch
patch()
os.environ['PYTHONHASHSEED']=str(SEED)
random.seed(SEED)
np.random.seed(SEED)
tf.set_random_seed(SEED)
os.environ['TF_DETERMINISTIC_OPS'] = '1'
os.environ['PYTHONHASHSEED']=str(SEED)
random.seed(SEED)
np.random.seed(SEED)
tf.random.set_seed(SEED)