(cluener 02)run_lstm_crf.py参数设置方式解读
run_lstm_crf总体阅读顺序按照main()函数顺序
参数设置方式所在位置如下图(源码中pathlib.Path部分有所错误,这里有修正)
图中修改后代码仍有问题,之所以分别验证config.output_dir
和args.output_dir
,则是希望可以通过逐次建立一级目录的形式创建args.output_dir
,实际上可以设置Path().mkdir()中参数实现多层级目录建立。
argparse使用
使用方式
python main.py (--gpu xx)
预设超参数,此部分超参数可以与config.py一起完成参数管理。
import argparse # 默认加载
import torch # 用于演示
parser = argparse.ArgumentParser()
parser.add_argument('--gpu', default='0', type=str)
args = parser.parse_args()
if args.gpu != '':
args.device = torch.device(f"cuda:{args.gpu}")
else:
args.device = torch.device("cpu")
# model.to(args.device)
亮点
其中,传参方式非常简洁,该方式为格式化字符串常量。
'''
1. 使用占位符传参 torch.device("cuda:%s" % args.gpu)
2. 使用format函数传参 torch.device("cuda:{}".format(args.gpu))
3. 使用格式化字符串常量 torch.device(f"cuda:{args.gpu}") # 注意使用格式化字符串常量传参一定不要忘记f
'''
pathlib使用
使用pathlib.Path替代os.path,使用更加优雅。
from pathlib import Path
# 添加路径(自带相应格式,变换后的格式有更多的调用属性)
output_dir = Path("./outputs")
# 路径拼接且创建多级目录
if not output_dir.exists():
args.output_dir = output_dir / 'bilstm_crf'
if not args.output_dir.exists():
args.output_dir.mkdir(parents=True) # 由于'./outputs/bilstm_crf'不存在且为多级目录,parents=True
常用的相关命令如下:(不建议使用删除操作,故未记录)
'''
1. 绝对路径: Path.cwd()
2. 路径拼接: Path.joinpath(Path1或str1, Path2或str2)、 Path1 / Path2或str2,注意Path1必须为有格式路径
3. 路径测试: Path1.exists()是否存在、 Path1.is_file()是否为文件、 Path1.is_dir()是否为文件夹
4. 创建文件: Path1.touch(exist_ok=True)如果文件存在则不进行任何操作、 Path1.torch(exist_ok=False)如果文件存在则报错
5. 创建目录: Path.mkdir()可以创建一层目录、 Path.mkdir(parents=True)可以创建多级目录
'''
随机种子的设置
通过函数封装需要设置随机种子的参数,在设置随机种子之前的随机参数不受影响,所以使用时放最前
import os
import random
import numpy as np
import torch
def seed_everything(seed=42):
random.seed(seed)
os.environ['PYTHONHASHSEED'] = str(seed)
np.random.seed(seed)
torch.manual_seed(seed)
torch.cuda.manual_seed(seed)
torch.cuda.manual_seed_all(seed)
torch.backends.cudnn.deterministic = True # 如果为True则cudnn使用确定性卷积算法,保持复现性
torch.backends.cudnn.benchmark = False # 如果为True则导致cudnn对多个卷积算法进行基准测试并选择最快的
seed_everything(args.seed) # 设置各随机种子,一般写于main.py数据处理之前,保持实验结果的可复现性
关于torch.backends.cudnn.deterministic和torch.backends.cudnn.benchmark的说明
代码中的注释是翻自官方API文档,以下摘自不同博客:
torch.backends.cudnn.benchmark = False # 方便复现,提升训练速度
torch.backends.cudnn.benchmark = True # 不需要复现,尽可能提升网络性能
torch.backends.cudnn.deterministic = True # 保持可复现性
torch.backends.cudnn.enabled = True # cudnn使用非确定性算法
torch.backends.cudnn.enabled = False # cudnn禁用非确定性算法
torch.backends.cudnn.enabled = True and torch.backends.cudnn.benchmark = True # cudnn使用非确定性算法,且自动寻找最适合当前配置的高效算法,来达到优化运行效率(特指网络的输入数据维度和类型上变化不大的情况,如果网络的输入数据在每次iteration都变化的话,会导致cudnn寻找最优配置耗时)。
评论已关闭