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

时间:2019-11-18 19:15:08

标签: python optimization keras deep-learning parameter-passing

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

    { “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等)作为配置文件中的参数以及子参数传递,并采用keras.optimizers.optimizer()函数调用,如(2)所示?

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'

如何从函数中解析字符串中的优化器?

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

您可以初始化一个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优化程序名称应与配置文件中的名称相同。

答案 2 :(得分:1)

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