一个轻率而全面的python实验管理器
ExperimentManager的Python项目详细描述
实验管理器
轻率和全面的python实验管理器。它的主要目的是自动化所有与保存文件和日志记录相关的后台工作。experimentmanager可以很容易地用于:
- 使用自动验证和日志管理所有实验文件的保存和加载目录。
- 记录实验的输出并保存所有源文件以获得更高的可复制性。
- 保存(几乎)任何对象而不必担心任何事情。
- 轻率地记录所有指标。
- 直接在指定功能中管理、编辑和插入配置用语
- 封装实验中的单个运行。任何函数都可以用于创建运行;这将自动在
saved_runs
中生成一个新的运行目录,其中包含专用的saved_files
和saved_metrics
目录以及一个特定的日志文件。
免责声明
这是测试版。它在我的测试环境(ubuntu和特定的库verisons)中是稳定的,但没有在其他环境中测试过。很多功能还没有记录下来!
对于那些熟悉神圣图书馆的人来说,这个项目源于他们的实验管理员,但是他们的目标是纠正一些行为问题(在他们的问题中提到),同时允许更好和更灵活的特性,并且在本地做所有事情(不依赖其他数据库管理员)。在特定环境中安装起来可能不灵活或很棘手的界面)。这里使用的代码中只有函数签名捕获部分。
安装
要安装,只需在git目录中使用pip install。。
这个beta版本运行tensorflow 1.13和keras 2.2.4(用于tensorboard和模型保存功能)。早期版本未经测试。
用法
要创建实验,只需在主文件中添加以下行:
fromExperimentManagerimportcreateExperimentmanager=createExperiment('my first experiment')
创建实验时可以指定许多参数,主要参数有:
- 名称:实验的名称。如果需要,将用于创建保存目录。
- 实验目录:希望管理器保存和记录的可选父目录。
- project_dir:用于运行实验的代码的父目录。这主要用于备份源代码以获得更高的可复制性。如果没有提供,将使用调用init的文件的父目录。
- load_dir:用于更容易导入的目录,它将在使用manager生成的所有路径上加前缀。get_load_path
- 详细:0、1或2。1将在experience_info.log中添加一些内部日志,而2将在debug.log中记录每个内部函数调用的详细信息(仅用于测试该类的行为,这会使进程慢很多!)
- tensorboard:true或false,使用度量日志记录方法时记录到tensorboard事件
- ghost:true或false(默认为false)。如果为true,则将禁用所有保存和日志记录功能,而不会创建单个目录或文件。这在运行测试时很有用。
experimentmanager也可以使用manager=experimentmanager.getmanagerfromconfig('config.json')
从配置文件创建。示例配置文件可以在演示目录中找到。
管理目录
创建实验管理器将自动生成以下目录结构:
./ -- (your_source_code) -- managed_experiments/ ---- my first experiment DATETIME/ ------- saved_files/ ------- saved_sources/ ------- saved_metrics/ ------- saved_runs/ ------- experiment_info.log ------- debug.log ------- stdout_capture.log
请注意,manager_experiments direcotry是在与源代码相同的目录中创建的。更准确地说,如果在初始化时没有指定实验目录,则目录将是包含名为experimentmanager.createmanager的代码的目录。
所有创建的目录都有相当直接的目标。保存的运行包含有关在例如,使用管理器进行实验。运行
命令。使用此方法的优点在下面的"运行"部分中进行了说明。
每个目录的路径都是管理器的一个属性,因此您可以随时访问它。特别是,可以使用manager.experiment\u dir
访问"我的第一个实验日期时间"目录。
要在任何文件中访问您的实验管理器,只需使用experismanager的getexperiment方法。它将恢复活动的实验管理器:experismanager.getexperience()
可复制性和控制性
默认情况下,实验管理器还将在saved_sources
中保存所有项目源文件(.py)的副本,并在专用记录器("stoud_capture.log")中捕获stdout。这通常足以牢牢掌握过去的任何实验并重现其结果。
储蓄,前所未有
在任何时候,您都可以简单地调用manager.save(object,name)
并且experimentmanager将:
- 检测它应该保存在哪个文件夹中:general
saved_files
目录位于my first experience datetime
或特定的run子目录中。 - 检测应使用的保存方法。
- 如果需要,请改名。
实现的保存方法包括以下数据类型:
- 列表和听写
- numpy数组
- 张量流张量(如果可以计算的话)
- Keras车型
- matplotlib图形
可以轻松添加新的保存方法,请参阅"添加保存方法"文档。
日志记录指标
实验管理器支持标量的csv日志和标量和直方图的tensorboard日志。
只需使用manager.log_scalar(metric_name,value)
并且experimentmanager将再次检测当前运行并保存度量,必要时对名称进行版本控制。可以在值
之后添加可选的步骤
参数,默认情况下,步骤将自动递增基于0的整数。除非manager.tensorboard设置为false,否则日志标量将记录到runs或global metrics目录中的csv,也将记录到tensorboard目录。metric_name用于命名csv文件以及csv中值列的标题。
要在单个csv中记录多个度量,请使用manager.log\u标量(文件名、值、标题、步骤=无)
记录柱状图的方法与manager.log\u historgram(name,values,step,bins=1000)完全相同(请记住,柱状图只记录到tensorboard,而不是csv,因为csv太重;因此,如果tensorboard支持被禁用,这将不起作用)。
配置
配置是在一个地方(json文件或字典)管理所有实验参数的好方法。除了全局配置用语外,experimentmanager为每次运行都有一个专用的配置用语。对于手工指定的函数,您的管理器将通过更改函数的签名(覆盖默认值)来插入其配置参数。
要添加配置字典,只需使用manager.add_config(字典)
(即将提供JSON文件支持)。当前运行或常规配置字典将使用输入字典进行更新。如果运行配置用语中有与通用用语相同的字段,则始终以运行选项为准(当然只能在该运行中!)
若要指定应接收配置值的函数,请添加@manager.capture
装饰符。您可以使用prefixes参数精确地指定应该注入哪些字段。下面是一个示例:
manager=createManager('test')config1={"name":"Victor","status":1,"details":{"age":22,"towns":{0:"Brussels",1:"Paris"}}}manager.add_config(config1)#this will update the general configurations dict since we are not in a run@manager.capture()deffunction1(time,name,details):pass@manager.capture()deffunction2(name,status,details):pass@manager.capture(prefixes=['name','details.towns','details.age,'details'])deffunction2(names,towns,details):pass
相当于:
deffunction1(time,name='Victor',details={"age":22,"towns":{0:"Brussels",1:"Paris"}}):passdeffunction2(name='Victor',status=1,details={"age":22,"towns":{0:"Brussels",1:"Paris"}}):passdeffunciton3(name='Victor',towns={0:"Brussels",1:"Paris"},age=22,details={"age":22,"towns":{0:"Brussels",1:"Paris"}}):pass
如您所见,并非所有函数参数都需要覆盖。如果您添加**Kwargs,将添加所有键。
运行
充分利用experimentmanager,使用管理器的run方法运行任务。 当使用保存和记录方法时,experimentmanager将自动检测哪个运行处于活动状态,这样您的文件将始终在正确的位置结束。要开始跑步,您有两个选项:
- 向函数添加
@manager.command
decorator并使用manager.run(函数的名称)运行它
- 使用
manager.add_command(function)
和相同的运行方法。这样做的好处是不需要修改代码的任何部分(通过添加@manager.command),但代价是丢失配置注入。 - 使用
注意,命令decorator还调用捕获decorator(从而执行配置注入)。