聊聊python的gin库的介绍和使用

1.简介

由于现在很多机器学习的实验需要设置繁琐的参数,在多次实验中,有些参数是一样的,为了方便设置参数,Gin库出现了。它允许函数或类被注释为@gin.configurable,这使得能够使用清晰而强大的语法通过简单的配置文件来设置它们的参数。这种方法减少了配置维护,同时使实验配置透明且易于重复。

简单理解,gin像一个封装了参数配置的类,使用这个类将使得大量的参数配置变得简单清晰

安装

pip install gin-config

2.@gin.configurable

任何函数和类都可以使用@gin.configurable装饰器

@gin.configurable
def my_network(images, num_outputs, num_layers=3, weight_decay=1e-4):
  ...

@gin.configurable装饰器做了如下三件事:

  1. 把类或函数声明成了可配置的东西
  2. 它决定了函数或类构造函数的哪些参数是可配置的(默认情况下是其所有的参数)
  3. 封装类或函数,拦截调用,并向函数的可配置参数提供来自参数设置全局注册表的值(这些值是类或函数声明时没有指定的值)

为了确定哪些是可以配置的参数,@gin.configurable会使用到allowlist和denylist参数,分别声明哪些是可配的哪些是不可配的,我们通常用一个即可,默认没有用allowlist指定的都为不可配,反之亦然。

@gin.configurable('supernet', denylist=['images'])
def my_network(images, num_outputs, num_layers=3, weight_decay=1e-4):
  ...

其中supernet是我们指定的配置名。

3.赋值

我们使用如下两种格式给参数赋值:

  1. gin.bind_parameter('configurable_name.parameter_name', value)
  2. configurable_name.parameter_name = value

具体例子分别如下:

gin.bind_parameter('supernet.num_layers', 5)
gin.bind_parameter('supernet.weight_decay', 1e-3)
supernet.num_layers = 5
supernet.weight_decay = 1e-3

4.取值

我们可以用gin.query_parameter来取值,具体例子如下

num_layers = gin.query_parameter('supernet.num_layers')
weight_decay = gin.query_parameter('supernet.weight_decay')

5.配置参考文件

假如我们有以下代码:

@gin.configurable
class DNN(object):
  def __init__(self, num_units=(1024, 1024)):
    ...
  def __call__(inputs, num_outputs):
    ...

@gin.configurable(denylist=['data'])
def train_model(network_fn, data, learning_rate, optimizer):
  ...

我们可以在gin文件里配置参数:

train_model.network_fn = @DNN()  # An instance of DNN is passed.
train_model.optimizer = @MomentumOptimizer  # The class itself is passed.
train_model.learning_rate = 0.001

DNN.num_units = (2048, 2048, 2048)
MomentumOptimizer.momentum = 0.9

上面显示了两种配置参数风格。@DNN()@MomentumOptimizer。对于前者将会调用DNN类的实例参数,且每次参数配置都会随着每个DNN类的实例变动。对于后者将会调用类MomentumOptimizer的默认参数。

6.使用gin文件

我们经常会和absl下flags一起使用gin,比如下面这样

from absl import flags

flags.DEFINE_multi_string(
  'gin_file', None, 'List of paths to the config files.')
flags.DEFINE_multi_string(
  'gin_param', None, 'Newline separated list of Gin parameter bindings.')

FLAGS = flags.FLAGS

然后主程序main.py里最先解析参数:

gin.parse_config_files_and_bindings(FLAGS.gin_file, FLAGS.gin_param)

假设我们参数文件example.gin在当前目录下,则运行时,我们在终端输入python main.py --gin_file=example.gin

也可以在代码里改成这样:

flags.DEFINE_multi_string(
  'gin_file', ["example.gin"], 'List of paths to the config files.')

然后直接运行

6.调用其他类或函数

我们可以用下面代码调用其他类或函数的参数,甚至这个类或函数可以在其他项目里。

gin.external_configurable(tf.train.MomentumOptimizer)

7.范围限定

当一个可配置函数在程序执行过程中被多次调用时,可能需要为每次调用提供不同的参数绑定。Gin提供了一个范围限定机制来促进这一点。
例如,假设我们想要实现一个GAN,我们必须交替训练一个生成器和一个鉴别器。在Tensoflow中,这最容易通过两个优化器来实现,因此我们可能有这样一个函数:

gin.external_configurable(tf.train.GradientDescentOptimizer)

@gin.configurable(allowlist=['generator_optimizer', 'discriminator_optimizer'])
def gan_trainer(
    generator_loss, generator_vars, generator_optimizer,
    discriminator_loss, discriminator_vars, discriminator_optimizer):
  # Construct the optimizers and minimize w.r.t. the correct variables.
  generator_train_op = generator_optimizer().minimize(
      generator_loss, generator_vars)
  discriminator_train_op = discriminator_optimizer().minimize(
      discriminator_loss, discriminator_vars)
  ...

我们如何将generator_optimizerdiscriminator_optimizer都配置为@GradientDescentOptimizer,但具有不同的学习速率?
下面是个错误示范:

# Won't work!
gan_trainer.generator_optimizer = @GradientDescentOptimizer
GradientDescentOptimizer.learning_rate = 0.01

gan_trainer.discriminator_optimizer = @GradientDescentOptimizer
# This binding will overwrite the previous one:
GradientDescentOptimizer.learning_rate = 0.001

Gin提供了一个范围界定机制来处理这种情况。任何可配置引用的前面都可以有一个作用域名称,用/字符与可配置名称分开。同样,也可以通过在可配置名称前面加上一个范围名称来应用特定于某个范围的绑定。
下面是对的示范:

# This will work! Use scoping to apply different parameter bindings.
gan_trainer.generator_optimizer = @generator/GradientDescentOptimizer
gan_trainer.discriminator_optimizer = @discriminator/GradientDescentOptimizer

generator/GradientDescentOptimizer.learning_rate = 0.01
discriminator/GradientDescentOptimizer.learning_rate = 0.001

8.标记gin参数

Gin允许您指示在Gin配置中必须提供某些参数。这可以通过两种方式实现:
1.在函数的调用位置
2.在函数的签名中

当调用一个可配置时,您可以通过gin.REQUIRED标记任何arg或kwarg。所需对象:

my_network(images, gin.REQUIRED, num_layers=5, weight_decay=gin.REQUIRED)

将在调用时检查所需参数。如果没有为这些参数提供Gin绑定,将会引发一个错误,列出缺少的参数绑定以及需要它们的可配置名称。
定义可配置时,可以使用gin.REQUIRED将参数标记为必需的:

@gin.configurable
def run_training(model_dir=gin.REQUIRED, network=gin.REQUIRED, ...):
  ...

9.从Gin文件中导入模块

import some.module.spec

10.在Gin文件中调用另一个Gin文件参数

一个Gin文件可以包含其他Gin文件,这样可以更容易地将一个配置拆分成单独的组件(例如,一个“基础”配置,它被其他派生配置包含和修改)。包含另一个Gin文件可以使用以下语法完成:

include 'path/to/another/file.gin'

11.Gin “macros”

有时一个值应该在多个绑定之间共享。为了实现这一点并避免多次重复该值(导致维护负担),Gin提供了以下预定义的可配置功能:

@gin.configurable
def macro(value):
  return value

可以引用“宏”函数(通过“()”来取值)。例如:

num_layers/macro.value = 10
network.num_layers = @num_layers/macro()

也可以这样写

num_layers = 10
network.num_layers = %num_layers

12.常量

gin.constant函数可用于定义常量,这些常量可通过上述宏语法访问。例如,在Python中:

gin.constant('THE_ANSWER', 42)

然后在配置文件gin中

meaning.of_life = %THE_ANSWER

请注意,任何Python对象都可以用作常量的值(包括不能表示为Gin文字的对象)。值将被存储到Gin内部字典中,直到程序终止,因此避免创建具有有限生命周期的值的常数。
一个消除歧义的模块可以放在常量名称的前面。例如:

gin.constant('some.modules.PI', 3.14159)

13.实验使用多个Gin文件和额外的命令行绑定

在许多情况下,可以定义多个包含实验整体配置不同部分的Gin文件。对整体配置的额外“调整”可以通过命令行标志作为单独的绑定来传递。

一种推荐的方法是创建一个包含多个Gin配置的文件夹,然后创建一个包含以下内容的BUILD文件:

filegroup(
    name = "gin_files",
    srcs = glob(["*.gin"]),
    visibility = [":internal"],
)

filegroup可用作二进制文件中的数据依赖项:

data = ["//path/to/configs:gin_files",]

在二进制文件中,可以定义以下标志:

from absl import flags

flags.DEFINE_multi_string(
  'gin_file', None, 'List of paths to the config files.')
flags.DEFINE_multi_string(
  'gin_param', None, 'Newline separated list of Gin parameter bindings.')

FLAGS = flags.FLAGS

然后用Gin解析它们:

gin.parse_config_files_and_bindings(FLAGS.gin_file, FLAGS.gin_param)

最后,二进制文件可以运行为:

.../run_gin_eval \
  --gin_file=$CONFIGS_PATH/cartpole_balance.gin \
  --gin_file=$CONFIGS_PATH/base_dqn.gin \
  --gin_file=$CONFIGS_PATH/eval.gin \
  --gin_param='evaluate.num_episodes_eval = 10' \
  --gin_param='evaluate.generate_videos = False' \
  --gin_param='evaluate.eval_interval_secs = 60'

到此这篇关于python的gin库的介绍和使用的文章就介绍到这了,更多相关python gin库内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python logging类库使用例子

    一.简单使用 复制代码 代码如下: def TestLogBasic():     import logging     logging.basicConfig(filename = 'log.txt', filemode = 'a', level = logging.NOTSET, format = '%(asctime)s - %(levelname)s: %(message)s')     logging.debug('this is a message')     logging.inf

  • Python中logging日志库实例详解

    logging的简单使用 用作记录日志,默认分为六种日志级别(括号为级别对应的数值) NOTSET(0) DEBUG(10) INFO(20) WARNING(30) ERROR(40) CRITICAL(50) special 在自定义日志级别时注意不要和默认的日志级别数值相同 logging 执行时输出大于等于设置的日志级别的日志信息,如设置日志级别是 INFO,则 INFO.WARNING.ERROR.CRITICAL 级别的日志都会输出. |2logging常见对象 Logger:日志,

  • python GUI库图形界面开发之PyQt5浏览器控件QWebEngineView详细使用方法

    PyQt5浏览器控件QWebEngineView PyQt5使用QWebEngineView控件来展示HTML页面,对老版本的QWebView类不在进行维护,因为QWebEngineView使用CHromium内核可以给用户带来更好的体验 QWebEngineView类中常用方法 方法 描述 load(QUrl url) 加载指定的URL并显示 setHtml(QString&html) 将网页视图的内容设置为指定的HTML内容 QWebEngineView控件使用load()函数加载一个Web

  • Python logging日志库空间不足问题解决

    项目中使用的日志库是使用python官方库logging封装的,但是居然一直么有设置日志自动滚动,经常会受到告警说哪台机器磁盘空间又满,清理一下,于是研究一下,解决这个问题. 参考:https://docs.python.org/2/library/logging.handlers.html TimedRotatingFileHandler有三个参数很关键 when.interval.backupCount when指定滚动依据的单位,可选的有天.小时.分钟.秒等:interval指定间隔多少个

  • Python 分析Nginx访问日志并保存到MySQL数据库实例

    使用Python 分析Nginx access 日志,根据Nginx日志格式进行分割并存入MySQL数据库.一.Nginx access日志格式如下: 复制代码 代码如下: $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_f

  • 在Python中使用MongoEngine操作数据库教程实例

    这篇文章主要介绍了在Python中使用MongoEngine操作数据库教程实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 pymongo来操作MongoDB数据库,但是直接把对于数据库的操作代码都写在脚本中,这会让应用的代码耦合性太强,而且不利于代码的优化管理 一般应用都是使用MVC框架来设计的,为了更好地维持MVC结构,需要把数据库操作部分作为model抽离出来,这就需要借助MongoEngine MongoEngine是一个对象文档映射

  • python中logging库的使用总结

    前言 最近因为工作的需要,在写一些python脚本,总是使用print来打印信息感觉很low,所以抽空研究了一下python的logging库,来优雅的来打印和记录日志,下面话不多说了,来一起看看详细的介绍吧. 一.简单的将日志打印到屏幕: import logging logging.debug('This is debug message') #debug logging.info('This is info message') #info logging.warning('This is

  • python GUI库图形界面开发之PyQt5中QWebEngineView内嵌网页与Python的数据交互传参详细方法实例

    这几天研究了下PyQt5中QWebEngineView内嵌网页与Python的数据交互,今天把实例方法与代码发布出来供大家参数 数据交互需要load进一个网页,这里我选择load进一个本地html网页:JSTest.html. 同时,QWebEngineView与外面的交互还需要Qt官方提供的一个js文件:qwebchannel.js,这个文件可以在网上下载. JSTest.html和qwebchannel.js两个文件放在同一个目录下,我这边都是放在Python工程目录下. qwebchann

  • win系统下为Python3.5安装flask-mongoengine 库

    环境: windows 10.python 3.5.flask-mongoengine 0.8.2或0.9.0 使用以下命令安装 flask-mongoengine pip install flask-mongoengine 会出现以下错误: 复制代码 代码如下: flask-mongoengine-0.8.2\setup.py", line 10, in <module> UnicodeDecodeError: 'gbk' codec can't decode byte 0xa6

  • 聊聊python的gin库的介绍和使用

    1.简介 由于现在很多机器学习的实验需要设置繁琐的参数,在多次实验中,有些参数是一样的,为了方便设置参数,Gin库出现了.它允许函数或类被注释为@gin.configurable,这使得能够使用清晰而强大的语法通过简单的配置文件来设置它们的参数.这种方法减少了配置维护,同时使实验配置透明且易于重复. 简单理解,gin像一个封装了参数配置的类,使用这个类将使得大量的参数配置变得简单清晰 安装 pip install gin-config 2.@gin.configurable 任何函数和类都可以使

  • 13个最常用的Python深度学习库介绍

    如果你对深度学习和卷积神经网络感兴趣,但是并不知道从哪里开始,也不知道使用哪种库,那么这里就为你提供了许多帮助. 在这篇文章里,我详细解读了9个我最喜欢的Python深度学习库. 这个名单并不详尽,它只是我在计算机视觉的职业生涯中使用并在某个时间段发现特别有用的一个库的列表. 这其中的一些库我比别人用的多很多,尤其是Keras.mxnet和sklearn-theano. 其他的一些我是间接的使用,比如Theano和TensorFlow(库包括Keras.deepy和Blocks等). 另外的我只

  • python 的numpy库中的mean()函数用法介绍

    1. mean() 函数定义: numpy.mean(a, axis=None, dtype=None, out=None, keepdims=<class numpy._globals._NoValue at 0x40b6a26c>)[source] Compute the arithmetic mean along the specified axis. Returns the average of the array elements. The average is taken over

  • 简单介绍Python的第三方库yaml

    目录 一.yaml基本介绍 二.适用场景 三.基本的语法规则 四.YAML支持的三种数据结构 4.1 对象 4.2 数组 4.2.1 对象和数组 4.3 纯量 4.4 还有一些特殊符号 4.4.1 - YAML可在同一个文件中,使用-表示一个文档的开始 4.4.2 -和-配合使用,在一个配置文件中代表一个的结束 4.4.3 YAML中使用!!做类型强行转换 4.4.4 > 在字符串中表示折叠换行:| 保留换行.这两个符号是YAML中字符串经常使用的符号 4.4.5 引用.重复的内容在YAML中可

  • Python中安装库的常用方法介绍

    目录 方法一:需要在网络条件下安装 方法二:离线安装 方法三:换源安装 总结 方法一:需要在网络条件下安装 win+R进入运行框输入命令cmd 点击确定进入 普通下载:pip install 模块名字 例如:输入 pip install pygame pip install numpy pip install xlwt xlwt代表需要安装所需包和库等 列出安装版本:pip list 和pip freeze 卸载模块: pip uninstall xlwt Y--确定卸载,n--否 指定版本下载

  • Python爬虫之requests库基本介绍

    目录 一.说明 二.基本用法: 总结 一.说明 requests是一个很实用的Python HTTP客户端库,爬虫和测试服务器响应数据时经常会用到,requests是Python语言的第三方的库,专门用于发送HTTP请求,使用起来比urllib简洁很多. Requests 有这些功能: 1.Keep-Alive & 连接池2.国际化域名和 URL3.带持久 Cookie 的会话4.浏览器式的 SSL 认证5.自动内容解码6.基本/摘要式的身份认证7.优雅的 key/value Cookie8.自

  • Python中itertools库的四个函数介绍

    目录 1. 引言 2. accumulate() 函数 3. compress() 函数 4. groupby() 函数 5. 排列组合操作 6 总结 1. 引言 在Python开发中,​​itertools​​库经常被忽视,实际上该库中抱恨了一些非常棒的函数,特别是用于处于数据流的函数.在本文中,我们将讨论该库中的十分使用的几个函数,并重点介绍什么时候我们应该考虑使用它们.闲话少说,我们直接开始吧! 2. accumulate() 函数 第三方库​​itertools​​提供的函数​​accu

  • 关于Python网络爬虫requests库的介绍

    1. 什么是网络爬虫 简单来说,就是构建一个程序,以自动化的方式从网络上下载.解析和组织数据. 就像我们浏览网页的时候,对于我们感兴趣的内容我们会复制粘贴到自己的笔记本中,方便下次阅读浏览——网络爬虫帮我们自动完成这些内容 当然如果遇到一些无法复制粘贴的网站——网络爬虫就更能显示它的力量了 为什么需要网络爬虫 当我们需要做一些数据分析的时候——而很多时候这些数据存储在网页中,手动下载需要花费的时间太长,这时候我们就需要网络爬虫帮助我们自动爬取这些数据来(当然我们会过滤掉网页上那些没用的东西) 网

  • python中requests库session对象的妙用详解

    在进行接口测试的时候,我们会调用多个接口发出多个请求,在这些请求中有时候需要保持一些共用的数据,例如cookies信息. 妙用1 requests库的session对象能够帮我们跨请求保持某些参数,也会在同一个session实例发出的所有请求之间保持cookies. 举个栗子,跨请求保持cookies,在命令行上输入下面命令: # 创建一个session对象 s = requests.Session() # 用session对象发出get请求,设置cookies s.get('http://ht

随机推荐