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

Python 将keras优化器作为字符串参数传递给keras优化器函数,python,optimization,keras,deep-learning,parameter-passing,Python,Optimization,Keras,Deep Learning,Parameter Passing,我正在使用一个包含超参数的config.json文件来调优keras深度学习模型的超参数 { “opt: “Adam”, “lr”: 0.01, “grad_clip”: 0.5 } Keras允许通过两种方式指定优化器: 作为函数调用中的字符串参数,无需附加参数 作为带有附加参数的同名函数 我的问题是:如何从配置文件中将优化器(SGD、Adam等)作为参数与子参数一起传递,并使用keras.optimizer.optimizer()函数调用,如(2)

我正在使用一个包含超参数的
config.json
文件来调优
keras
深度学习模型的超参数

    { “opt: “Adam”,
      “lr”: 0.01,
       “grad_clip”: 0.5
    }
Keras允许通过两种方式指定优化器:

  • 作为函数调用中的字符串参数,无需附加参数
  • 作为带有附加参数的同名函数
  • 我的问题是:如何从配置文件中将优化器(SGD、Adam等)作为参数与子参数一起传递,并使用
    keras.optimizer.optimizer()
    函数调用,如(2)所示

    当我试图将配置文件中的参数传递到上述
    train()
    函数时,我得到以下错误:

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

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

    您可以使用这样一个类来构造优化器:

    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'])
    

    您可以使用这样一个类来构造优化器:

    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'])
    

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

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

    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...
    
    毕竟,您可以访问所选优化器的所有参数:

    optimizer = data["Adam"]
    
    lr = data["lr"]
    beta_1 = data["beta_1"]
    etc...
    
    另一种方法是仅使用配置文件访问优化器的配置。使用Keras,您可以使用优化器调度器从配置文件中选择的特定优化器编译神经网络:

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

    请记住,keras优化器名称在配置文件中应该相同

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

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

    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...
    
    毕竟,您可以访问所选优化器的所有参数:

    optimizer = data["Adam"]
    
    lr = data["lr"]
    beta_1 = data["beta_1"]
    etc...
    
    另一种方法是仅使用配置文件访问优化器的配置。使用Keras,您可以使用优化器调度器从配置文件中选择的特定优化器编译神经网络:

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

    请记住,keras优化器名称在配置文件中应该相同

    确保
    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)})
    

    确保
    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)})
    

    您最近的编辑应该修复您在问题底部的错误。如果有错误,您现在会遇到什么错误?我已经在重新运行代码后更新了错误。这与我在问题中提出的问题更直接相关:如何将字符串解析为属性?您最近的编辑应该会修复您在问题底部的错误。如果有错误,您现在会遇到什么错误?我已经在重新运行代码后更新了错误。它与我在问题中提出的问题更直接相关:如何将字符串解析为属性?我是否需要将“lr”和“clip”定义为类属性,如:def uu init_uu_;(self):self.lr=.0 self.clip=.0,然后在方法中将它们称为“self.lr”和“self.clip”?如果是,此更改对呼叫有何影响?目前,解释器抱怨类声明中未定义的变量名,并在执行代码时抛出错误。嘿!我更新了代码,很抱歉,一开始我没有进行测试就编写了代码,现在应该可以工作了:)如果它解决了您的问题,请选择已接受的答案。我需要将“lr”和“clip”定义为类属性,如:def uu init _;(self):self.lr=.0 self.clip=.0,然后在方法中将它们称为“self.lr”和“self.clip”?如果是,此更改对呼叫有何影响?目前,解释器抱怨类声明中未定义的变量名,并在执行代码时抛出错误。嘿!我更新了代码,很抱歉,一开始我没有测试就写了它,现在应该可以工作了。tho:)如果解决了您的问题,请选择接受的答案