0%

python+ml科研经验-实验方面

Main函数与Args的使用

  • args全局,然后引用。在函数中直接传递。
  • 用shadow main调用main,在一个实验环境跑多份代码。注意../和./的差别
  • 在shadow main中,调用main之前修改args的个别参数,不要修改主函数
  • 产生可能使用和变化的新超参数,在args里添加,并保证初始值不变。方便修改,不要硬编码在函数中。
  • args各个部分分开:train部分,test部分,semi-supervised部分等。尽可能用int和str代替bool,防止之后用一个变量控制新功能。
  • print args:
    1
    2
    3
    4
    print('-----Args Items -----')
    for k, v in vars(self.args).items():
    print('{}:{}'.format(k, v))
    print('done')
  • save args:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    def save_args(self):
    model_dir = os.path.dirname(self.args.save_dir)
    if not os.path.exists(model_dir):
    os.makedirs(model_dir)
    filename = 'args.csv'
    args_path = os.path.join(model_dir, filename)
    print('Save args to {}'.format(args_path))
    # print('--------Args Items----------')
    with open(args_path, 'w') as fid:
    for k, v in vars(self.args).items():
    fid.write('{},{}\n'.format(k, v))

更新和迭代

  • 大幅度修改实验前,先把一个相对完整的版本保存下来,然后新开一个项目,可以避免混乱。

起名和架构规范

  • 同类变量起名时,首字母尽可能一致,方便debug。
  • 注意命名写完整,写好help,避免混乱。
  • output和outputs等的单复数,string和str的缩写格式统一。
  • 一个函数实现的多个分支的功能尽可能平行。
  • initialization的多个部分的初始化函数分开
  • train(on_start_epoch, run_iteration(on_forward, calculate_loss), on_end_epoch)
  • 尽可能保留下来更多相关信息,如当前best score, 某一个部分的result等。

checkpoint

  • 设置多种load的方式:load_all, parameters, model_only
  • 所有的变量:变量名=checkpoint[‘变量名’];所有的模型和优化器:model.load_state_dict(checkpoint[‘模型名’])。注意转cuda。
    1
    2
    3
    4
    5
    6
    7
    8
    self.auto_alpha.load_state_dict(checkpoint['auto_alpha_dict'])
    self.auto_alpha_optimizer.load_state_dict(checkpoint['auto_alpha_optimizer'])
    for state in self.auto_alpha_optimizer.state.values():
    for k, v in state.items():
    if torch.is_tensor(v):
    state[k] = v.cuda()
    if torch.cuda.is_available():
    self.auto_alpha.cuda()
-------------这么快就看完啦^ω^谢谢阅读哟-------------