common包的utils模块
Python的utils
模块是一个通用工具模块,其中包含了一些有用的函数和类,用于编写Python程序。
以下是utils
模块中的一些常见功能:
-
copy
:提供了深拷贝和浅拷贝的函数。 -
range
:提供了一组非常方便的函数来生成数字范围。 -
random
:提供了伪随机数生成器和一些随机选择函数。 -
sys
:提供了一些与Python解释器和进程相关的函数和变量。 -
os
:提供了一些与操作系统交互的函数和变量。 -
re
:提供了正则表达式的功能。 -
time
:提供了一些与时间和日期相关的函数和变量。 -
collections
:提供了一些有用的数据结构,如defaultdict和Counter。 -
functools
:提供了一些有用的函数,如partial和reduce。 -
json
:提供了JSON编码和解码的功能。 -
pickle
:提供了Python对象的序列化和反序列化功能。
除了上述常用功能,utils
模块还包含了许多其他有用的函数和类。在编写Python程序时,可以查看utils
模块,以了解是否有可以重复使用的代码。
utils模块的Params函数
在Python的utils
模块中,Params
函数是一个用于将参数转换为对象的函数。这个函数的定义如下:
class Params:
“”"
Load hyperparameters from a json file.
Example:
```
params = Params(json_path)
print(params.learning_rate)
params.learning_rate = 0.5 # change the value of learning_rate in params
```
def __init__(self, json_path):
self.update(json_path)
def save(self, json_path):
with open(json_path, 'w') as f:
json.dump(self.__dict__, f, indent=4)
def update(self, json_path):
with open(json_path, 'r') as f:
params = json.load(f)
self.__dict__.update(params)
Params
函数的作用是将一个JSON格式的参数文件加载到一个Python对象中。这个对象可以像Python类实例一样访问参数。例如,如果JSON文件中包含一个learning_rate
参数,则可以使用以下方式访问该参数:
params = Params('params.json')
print(params.learning_rate)
在这个例子中,params.json
是一个JSON格式的参数文件,它包含了一个learning_rate
参数。Params
函数将这个参数文件加载到一个Python对象中,并使用点运算符来访问learning_rate
参数的值。
Params
函数还提供了一个update
方法,该方法允许在运行时更新参数。例如,以下代码将learning_rate
参数的值更改为0.5:
params.learning_rate = 0.5
最后,Params
函数还提供了一个save
方法,该方法可以将当前参数对象保存回JSON格式的文件中。例如,以下代码将参数对象保存回params.json
文件中:
params.save('params.json')
这个函数对于在训练和测试中使用参数非常有用,因为它可以轻松地在不同的实验和模型之间共享参数。
utils模块的set_logger函数
set_logger
函数是一个用于设置日志记录器的函数。这个函数的定义如下:
import logging
import os
def set_logger(log_path):
"""
Set the logger to log info in terminal and file `log_path`.
In general, it is useful to have a logger so that every output to the terminal is saved
in a permanent file. Here we save it to `model_dir/train.log`.
Example:
```
logger = set_logger('mylog.log')
logger.info('Start training...')
```
Args:
log_path: (string) where to log
"""
if os.path.exists(log_path):
os.remove(log_path)
logger = logging.getLogger()
logger.setLevel(logging.INFO)
# File handler
file_handler = logging.FileHandler(log_path)
file_handler.setFormatter(logging.Formatter('%(asctime)s:%(levelname)s: %(message)s'))
logger.addHandler(file_handler)
# Stream handler
stream_handler = logging.StreamHandler()
stream_handler.setFormatter(logging.Formatter('%(message)s'))
logger.addHandler(stream_handler)
return logger
set_logger
函数的作用是设置一个日志记录器,将日志记录到终端和文件中。通过设置日志记录器,我们可以方便地将程序的输出保存在一个文件中,以便后续查看。
在set_logger
函数中,首先创建了一个名为logger
的日志记录器对象,并设置其记录级别为INFO
。接着创建了一个文件处理器file_handler
,它将日志记录到文件中。文件处理器使用FileHandler
类来创建,使用setFormatter
方法设置日志记录的格式,最后将其添加到logger
对象中。接着创建了一个流处理器stream_handler
,它将日志记录到终端中。流处理器使用StreamHandler
类来创建,同样使用setFormatter
方法设置日志记录的格式,并将其添加到logger
对象中。
最后,set_logger
函数返回一个logger
对象,我们可以使用该对象来记录日志。例如,以下代码使用set_logger
函数创建了一个日志记录器,并使用logger.info
方法记录一条信息:
logger = set_logger('mylog.log') logger.info('Start training...')
在这个例子中,日志记录器将日志记录到mylog.log
文件和终端中。logger.info
方法用于记录一条信息,该信息将包含时间戳、级别和消息。此外,由于我们设置了日志记录器的级别为INFO
,所以只有级别为INFO
及以上的日志记录才会被记录下来