主頁(yè) > 知識(shí)庫(kù) > 聊聊python的gin庫(kù)的介紹和使用

聊聊python的gin庫(kù)的介紹和使用

熱門(mén)標(biāo)簽:南京銷售外呼系統(tǒng)軟件 蓋州市地圖標(biāo)注 房產(chǎn)電銷外呼系統(tǒng) 地圖制圖標(biāo)注位置改變是移位嗎 地圖標(biāo)注微信發(fā)送位置不顯示 315電話機(jī)器人廣告 地圖標(biāo)注的意義點(diǎn) 浙江電銷卡外呼系統(tǒng)好用嗎 上海機(jī)器人外呼系統(tǒng)哪家好

1.簡(jiǎn)介

由于現(xiàn)在很多機(jī)器學(xué)習(xí)的實(shí)驗(yàn)需要設(shè)置繁瑣的參數(shù),在多次實(shí)驗(yàn)中,有些參數(shù)是一樣的,為了方便設(shè)置參數(shù),Gin庫(kù)出現(xiàn)了。它允許函數(shù)或類被注釋為@gin.configurable,這使得能夠使用清晰而強(qiáng)大的語(yǔ)法通過(guò)簡(jiǎn)單的配置文件來(lái)設(shè)置它們的參數(shù)。這種方法減少了配置維護(hù),同時(shí)使實(shí)驗(yàn)配置透明且易于重復(fù)。

簡(jiǎn)單理解,gin像一個(gè)封裝了參數(shù)配置的類,使用這個(gè)類將使得大量的參數(shù)配置變得簡(jiǎn)單清晰

安裝

pip install gin-config

2.@gin.configurable

任何函數(shù)和類都可以使用@gin.configurable裝飾器

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

@gin.configurable裝飾器做了如下三件事:

  1. 把類或函數(shù)聲明成了可配置的東西
  2. 它決定了函數(shù)或類構(gòu)造函數(shù)的哪些參數(shù)是可配置的(默認(rèn)情況下是其所有的參數(shù))
  3. 封裝類或函數(shù),攔截調(diào)用,并向函數(shù)的可配置參數(shù)提供來(lái)自參數(shù)設(shè)置全局注冊(cè)表的值(這些值是類或函數(shù)聲明時(shí)沒(méi)有指定的值)

為了確定哪些是可以配置的參數(shù),@gin.configurable會(huì)使用到allowlist和denylist參數(shù),分別聲明哪些是可配的哪些是不可配的,我們通常用一個(gè)即可,默認(rèn)沒(méi)有用allowlist指定的都為不可配,反之亦然。

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

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

3.賦值

我們使用如下兩種格式給參數(shù)賦值:

  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來(lái)取值,具體例子如下

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文件里配置參數(shù):

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

上面顯示了兩種配置參數(shù)風(fēng)格。@DNN()@MomentumOptimizer。對(duì)于前者將會(huì)調(diào)用DNN類的實(shí)例參數(shù),且每次參數(shù)配置都會(huì)隨著每個(gè)DNN類的實(shí)例變動(dòng)。對(duì)于后者將會(huì)調(diào)用類MomentumOptimizer的默認(rèn)參數(shù)。

6.使用gin文件

我們經(jīng)常會(huì)和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里最先解析參數(shù):

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

假設(shè)我們參數(shù)文件example.gin在當(dāng)前目錄下,則運(yùn)行時(shí),我們?cè)诮K端輸入python main.py --gin_file=example.gin

也可以在代碼里改成這樣:

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

然后直接運(yùn)行

6.調(diào)用其他類或函數(shù)

我們可以用下面代碼調(diào)用其他類或函數(shù)的參數(shù),甚至這個(gè)類或函數(shù)可以在其他項(xiàng)目里。

gin.external_configurable(tf.train.MomentumOptimizer)

7.范圍限定

當(dāng)一個(gè)可配置函數(shù)在程序執(zhí)行過(guò)程中被多次調(diào)用時(shí),可能需要為每次調(diào)用提供不同的參數(shù)綁定。Gin提供了一個(gè)范圍限定機(jī)制來(lái)促進(jìn)這一點(diǎn)。
例如,假設(shè)我們想要實(shí)現(xiàn)一個(gè)GAN,我們必須交替訓(xùn)練一個(gè)生成器和一個(gè)鑒別器。在Tensoflow中,這最容易通過(guò)兩個(gè)優(yōu)化器來(lái)實(shí)現(xiàn),因此我們可能有這樣一個(gè)函數(shù):

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)
  ...

我們?nèi)绾螌?code>generator_optimizer和discriminator_optimizer都配置為@GradientDescentOptimizer,但具有不同的學(xué)習(xí)速率?
下面是個(gè)錯(cuò)誤示范:

# 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提供了一個(gè)范圍界定機(jī)制來(lái)處理這種情況。任何可配置引用的前面都可以有一個(gè)作用域名稱,用/字符與可配置名稱分開(kāi)。同樣,也可以通過(guò)在可配置名稱前面加上一個(gè)范圍名稱來(lái)應(yīng)用特定于某個(gè)范圍的綁定。
下面是對(duì)的示范:

# 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.標(biāo)記gin參數(shù)

Gin允許您指示在Gin配置中必須提供某些參數(shù)。這可以通過(guò)兩種方式實(shí)現(xiàn):
1.在函數(shù)的調(diào)用位置
2.在函數(shù)的簽名中

當(dāng)調(diào)用一個(gè)可配置時(shí),您可以通過(guò)gin.REQUIRED標(biāo)記任何arg或kwarg。所需對(duì)象:

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

將在調(diào)用時(shí)檢查所需參數(shù)。如果沒(méi)有為這些參數(shù)提供Gin綁定,將會(huì)引發(fā)一個(gè)錯(cuò)誤,列出缺少的參數(shù)綁定以及需要它們的可配置名稱。
定義可配置時(shí),可以使用gin.REQUIRED將參數(shù)標(biāo)記為必需的:

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

9.從Gin文件中導(dǎo)入模塊

import some.module.spec

10.在Gin文件中調(diào)用另一個(gè)Gin文件參數(shù)

一個(gè)Gin文件可以包含其他Gin文件,這樣可以更容易地將一個(gè)配置拆分成單獨(dú)的組件(例如,一個(gè)“基礎(chǔ)”配置,它被其他派生配置包含和修改)。包含另一個(gè)Gin文件可以使用以下語(yǔ)法完成:

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

11.Gin “macros”

有時(shí)一個(gè)值應(yīng)該在多個(gè)綁定之間共享。為了實(shí)現(xiàn)這一點(diǎn)并避免多次重復(fù)該值(導(dǎo)致維護(hù)負(fù)擔(dān)),Gin提供了以下預(yù)定義的可配置功能:

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

可以引用“宏”函數(shù)(通過(guò)“()”來(lái)取值)。例如:

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

也可以這樣寫(xiě)

num_layers = 10
network.num_layers = %num_layers

12.常量

gin.constant函數(shù)可用于定義常量,這些常量可通過(guò)上述宏語(yǔ)法訪問(wèn)。例如,在Python中:

gin.constant('THE_ANSWER', 42)

然后在配置文件gin中

meaning.of_life = %THE_ANSWER

請(qǐng)注意,任何Python對(duì)象都可以用作常量的值(包括不能表示為Gin文字的對(duì)象)。值將被存儲(chǔ)到Gin內(nèi)部字典中,直到程序終止,因此避免創(chuàng)建具有有限生命周期的值的常數(shù)。
一個(gè)消除歧義的模塊可以放在常量名稱的前面。例如:

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

13.實(shí)驗(yàn)使用多個(gè)Gin文件和額外的命令行綁定

在許多情況下,可以定義多個(gè)包含實(shí)驗(yàn)整體配置不同部分的Gin文件。對(duì)整體配置的額外“調(diào)整”可以通過(guò)命令行標(biāo)志作為單獨(dú)的綁定來(lái)傳遞。

一種推薦的方法是創(chuàng)建一個(gè)包含多個(gè)Gin配置的文件夾,然后創(chuàng)建一個(gè)包含以下內(nèi)容的BUILD文件:

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

filegroup可用作二進(jìn)制文件中的數(shù)據(jù)依賴項(xiàng):

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

在二進(jìn)制文件中,可以定義以下標(biāo)志:

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)

最后,二進(jìn)制文件可以運(yùn)行為:

.../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'

到此這篇關(guān)于python的gin庫(kù)的介紹和使用的文章就介紹到這了,更多相關(guān)python gin庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Python logging日志庫(kù)空間不足問(wèn)題解決
  • python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5中QWebEngineView內(nèi)嵌網(wǎng)頁(yè)與Python的數(shù)據(jù)交互傳參詳細(xì)方法實(shí)例
  • python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5瀏覽器控件QWebEngineView詳細(xì)使用方法
  • Python中l(wèi)ogging日志庫(kù)實(shí)例詳解
  • 在Python中使用MongoEngine操作數(shù)據(jù)庫(kù)教程實(shí)例
  • python中l(wèi)ogging庫(kù)的使用總結(jié)
  • win系統(tǒng)下為Python3.5安裝flask-mongoengine 庫(kù)
  • python logging類庫(kù)使用例子
  • Python 分析Nginx訪問(wèn)日志并保存到MySQL數(shù)據(jù)庫(kù)實(shí)例

標(biāo)簽:日照 赤峰 雙鴨山 臨汾 貴州 陽(yáng)泉 金華 克拉瑪依

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《聊聊python的gin庫(kù)的介紹和使用》,本文關(guān)鍵詞  聊聊,python,的,gin,庫(kù),介紹,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《聊聊python的gin庫(kù)的介紹和使用》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于聊聊python的gin庫(kù)的介紹和使用的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章