run_lstm_crf总体阅读顺序按照main()函数顺序

参数设置方式所在位置如下图(源码中pathlib.Path部分有所错误,这里有修正)

图中修改后代码仍有问题,之所以分别验证config.output_dirargs.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寻找最优配置耗时)。

标签: none

评论已关闭