将keras优化器作为字符串参数传递给keras优化器函数

mitkmikd  于 2023-03-08  发布在  其他
关注(0)|答案(4)|浏览(147)

我正在借助包含超参数的config.json文件调整keras深度学习模型的超参数。

{ “opt: “Adam”,
      “lr”: 0.01,
       “grad_clip”: 0.5
    }

Keras允许以两种方式指定优化器:
1.作为对函数的调用中的字符串参数,不带其他参数。

model.compile(loss='categorical_crossentropy’,
              optimizer=’Adam’, 
              metrics=['mse'])

1.作为具有附加参数的同名函数。

model.compile(loss='categorical_crossentropy',
              optimizer=optimizers.Adam(lr=0.01, clipvalue=0.5), 
              metrics=['mse'])

我的问题是:如何将优化器(SGD、Adam等)作为配置文件中的参数与子参数一起传递,并像(2)中那样使用keras.optimizers.optimizer()函数调用?

from keras.models import Sequential
from keras.layers import LSTM, Dense, TimeDistributed, Bidirectional
from keras import optimizers

def train(X,y, opt, lr, clip):

   model = Sequential()
   model.add(Bidirectional(LSTM(100, return_sequences=True), input_shape=(500, 300)))    
   model.add(TimeDistributed(Dense(5, activation='sigmoid')))

   model.compile(loss='categorical_crossentropy',
                  optimizer=optimizers.opt(lr=lr, clipvalue=clip), 
                  metrics=['mse'])

   model.fit(X, y, epochs=100, batch_size=1, verbose=2)

   return(model)

当我尝试将参数从配置文件传递到上面的train()函数时,我得到了以下错误:

AttributeError: module 'keras.optimizers' has no attribute 'opt'

如何将字符串中的优化器作为函数进行解析?

gg0vcinb

gg0vcinb1#

至少在tensorflow 2.11版本中,有一个函数可以通过名字获取优化器并传递参数。https://www.tensorflow.org/api_docs/python/tf/keras/optimizers/get.
为了简短起见,下面是一个最小的用法示例:

# read in your config.json file
# KEYS NEED TO BE ADJUSTED TO MAKE THIS WORK CORRECTLY:
# { 
#   “identifier: “Adam”,
#   “learning_rate”: 0.01,
#   “grad_clip”: 0.5
# }

import tensorflow as tf
import json

with open('path/to/config.json', 'r') as f:
    opt_conf = json.load(f)

# define the model
model = tf.keras.Sequential()

# then create the optimizer using the data from opt_conf
optimizer = tf.keras.optimizers.get(**opt_conf)

# compile the model
model.compile(loss='categorical_crossentropy',
              optimizer=optimizer, 
              metrics=['mse'])
bq9c1y66

bq9c1y662#

您可以使用一个类来构造优化器,如下所示:

class Optimizer:
    def __init__(self, lr, clip):
        self.lr=lr
        self.clip = clip

    def get_opt(self, opt):
        """Dispatch method"""
        method_name = 'opt_' + str(opt)
        # Get the method from 'self'. Default to a lambda.
        method = getattr(self, method_name, lambda: "Invalid optimizier")
        # Call the method as we return it
        return method()

    def opt_Adam(self):
        return optimizers.Adam(lr=self.lr, clipvalue=self.clip)

    def opt_example(self):
        return  optimizers.example(lr=self.lr, clipvalue=self.clip)

    #and so on for how many cases you would need

那么你可以称之为

a=Optimizer(lr, clip)
model.compile(loss='categorical_crossentropy',
              optimizer=a.get_opt(opt=opt), 
              metrics=['mse'])
2w3rbyxf

2w3rbyxf3#

您可以初始化包含优化器初始化的json配置文件:例如:

"Adam": {
    "lr":0.001, 
    "beta_1":0.9, 
    "beta_2":0.999, 
    "epsilon":None, 
    "decay":0.0, 
    "amsgrad":False
    }

然后,您可以使用以下代码行从配置中解析它:

with open('configuration.json') as json_data_file:
    data = json.load(json_data_file)

在数据结构中,您将找到优化器的参数设置:

optimizer = data["Adam"]

毕竟,您可以访问所选优化器的所有参数:

lr = data["lr"]
beta_1 = data["beta_1"]
etc...

另一种方法是仅使用配置文件访问优化程序的配置。使用Keras,您可以使用优化程序调度程序,使用从配置文件中选择的特定优化程序来编译神经网络:

optimizer= {"Adam": keras.optimizers.Adam(**config}

请记住keras优化器的名称应该与配置文件中的名称相同。

cvxl0en2

cvxl0en24#

确保您的csl对象(配置对象)的键实际上与这些类的参数匹配,然后,下面的代码将创建优化器对象,从配置对象中搜索适当的参数,并将它们传递给它

csl = { "opt": "Adam",
  "lr": 0.01,
   "grad_clip": 0.5}
optimizer = eval(f"keras.optimizers.{csl["opt"]}")()
optimizer = optimizer.from_config({k:v for k,v in csl.items() if hasattr(optimizer, k)})

相关问题