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()
-------------这么快就看完啦^ω^谢谢阅读哟-------------