iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >聊聊python的gin库的介绍和使用
  • 444
分享到

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

2024-04-02 19:04:59 444人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

1.简介 由于现在很多机器学习的实验需要设置繁琐的参数,在多次实验中,有些参数是一样的,为了方便设置参数,Gin库出现了。它允许函数或类被注释为@gin.configurable,这

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库内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 聊聊python的gin库的介绍和使用

本文链接: https://www.lsjlt.com/news/124161.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 聊聊python的gin库的介绍和使用
    1.简介 由于现在很多机器学习的实验需要设置繁琐的参数,在多次实验中,有些参数是一样的,为了方便设置参数,Gin库出现了。它允许函数或类被注释为@gin.configurable,这...
    99+
    2024-04-02
  • 聊聊python dropna()和notnull()的用法区别
    `dropna()`和`notnull()`是pandas库中用于处理缺失值的函数,它们的用法和功能有一些区别。`dropna()`...
    99+
    2023-08-16
    python
  • Gin-高性能 Golang Web框架的介绍和使用
    偶遇 Gin 我之前一直在使用 Beego 框架来做应用的 Api,因为它的写法跟 PHP 的 MVC 一样,上手简单,所以对它的表现还算满意。用的久了,发现 Beego 的编程思想就是照搬了 PHP 的那一套,写法上倒没什么,但是在...
    99+
    2024-04-02
  • 聊聊@value注解和@ConfigurationProperties注解的使用
    目录@value注解和@ConfigurationProperties注解@value读取默认配置@ConfigurationProperties读取默认配置@Configurati...
    99+
    2024-04-02
  • 聊聊怎么用npm和GitHub完成库的安装
    在开发Web应用程序时,我们通常需要使用很多第三方库来帮助我们完成一些常用的功能。其中,npm和GitHub是两个非常常用的工具,它们提供了方便的安装和管理库的方式。本文将会介绍如何使用npm和GitHub完成库的安装。一、npm安装npm...
    99+
    2023-10-22
  • 聊聊github使用的基本的步骤和技巧
    GitHub是全球最大的开源社区,拥有丰富的资源和项目。对于程序员来说,学会如何打开并使用GitHub是非常重要的。本文将介绍一些基本的步骤和技巧,帮助初学者迅速掌握GitHub的使用方法。一、注册GitHub账号第一步,要打开GitHub...
    99+
    2023-10-22
  • 聊聊golang cookiejar的使用方法
    在golang中,有许多方便的库可以帮助我们进行http请求、cookie管理等操作。其中,cookie是一个常用的概念,它可以帮助我们在不同的http请求之间保持登录状态,记录用户习惯等信息。在本篇文章中,我们将介绍如何使用golang标...
    99+
    2023-05-14
  • 聊聊Git的使用方法和注意事项
    作为程序员和开发人员必备的版本控制工具,Git已经成为了主流。但是,很多人在使用 Git 时常常会遇到一些问题,比如常见的 Git 命令不知道该如何使用、出现冲突怎么办等等。那么,本文就为大家介绍一下 Git 的使用方法和注意事项,帮助大家...
    99+
    2023-10-22
  • 聊聊如何使用PHP修改数据库和数据表
    PHP是一门用于网页开发的脚本语言,使用它可以方便的操作和维护数据库。在使用PHP操作数据库时,修改数据表是一项比较常见的任务。本文将向您介绍如何使用PHP修改数据库和数据表。首先,我们需要连接到数据库。通常使用mysqli或PDO来连接。...
    99+
    2023-05-14
  • 一文聊聊Vue中provide和inject的使用方法
    Vue中如何使用provide与inject?下面本篇文章就来给大家介绍一下Vue中provide和inject的使用方法,希望对大家有所帮助!在vue2.0里面provide与inject是以选项式(配置)API的方式在组件中进行使用的,...
    99+
    2023-05-14
    Vue javascript
  • 深入聊聊 Golang 的使用方法
    在互联网行业的大环境下,Golang(简称Go)已成为一个备受瞩目的编程语言,众多互联网公司如:谷歌、阿里巴巴、腾讯等,都已将其作为主力开发语言。Go 语言在因特网时代不断壮大的背景下,以并发编程,运行速度以及简单易用的特点,受到了众多程序...
    99+
    2023-05-14
  • 聊聊Mybatis反射之ObjectWrapper的使用
    目录获取类属性的类MetaClassObjectWrapper总结获取类属性的类MetaClass MetaClass主要是用于获取类的属性,它的构造方法中通过ReflectorFa...
    99+
    2024-04-02
  • 聊聊Python 3 的字符串:str 和 bytes 的区别
    Python2的字符串有两种:str 和 unicode,Python3的字符串也有两种:str 和 bytes。Python2 的 str 相当于 Python3 的bytes,而unicode相当于Python3的str。Python2...
    99+
    2023-06-02
  • 聊聊安装和使用Github源码的具体方法
    Github源码是开源社区中最受欢迎的源码托管平台之一,它为开发者提供了一个分享和合作的社区平台。使用Github源码需要一定的技术知识和操作技巧,接下来我将为您介绍安装和使用Github源码的具体方法。第一步,创建Github账号Gith...
    99+
    2023-10-22
  • 聊一聊python常用的编程模块
    文件流的读写 读取保存数据为数组的txt文件 使用try进行异常发现,使用while检测文件末尾进行读取 file_to_read = raw_input("Enter file...
    99+
    2024-04-02
  • Python中jieba库的介绍与使用
    目录前言:目录:一、jieba库基本介绍(1)jieba库概述 (2)jieba分词的原理二、jieba库使用说明 (1)jieba分词的三种模式三:jieba库...
    99+
    2023-03-02
    Python中jieba库使用 Python中jieba库
  • 聊聊桌面版GitHub的使用方法
    作为全球最大的开源社区,GitHub 是每一个程序员必不可少的学习和交流平台。除了网站版,GitHub 还有桌面版可供使用,方便用户更加高效地使用和管理代码,可以在 Windows、Mac OS 和 Linux 三个平台上使用。本文将向你介...
    99+
    2023-10-22
  • 聊聊Golang注释的基本语法和使用方法
    Golang(又称Go)是一门热门的编程语言,因其高效、简洁的特性而备受程序员的喜爱。在编写Golang程序时,注释是很重要的一部分。注释是一种对代码进行描述和解释的方式,它可以帮助开发人员更好地理解代码,也可以让代码更易于维护和修改。在本...
    99+
    2023-05-14
    go语言 Golang 注释
  • 聊聊PHP中die()和sleep()函数的用法
    在上一篇《聊聊PHP中删除字符串的逗号和尾部斜杠的方法》给大家介绍了PHP删除字符串中的逗号以及尾部斜杠的方法,感兴趣的朋友可以去学习了解一下~ 本文也将给大家通过示例来讲解标题所述...
    99+
    2024-04-02
  • 聊聊Lombok中的@Builder注解使用教程
    目录Lombok中的@Builder注解的使用作用引入依赖第二步给实体类加上@Builder注解第三步使用测试使用@Builder注解生成对象实体类加上@Builder注解之后的编译...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作