繁体   English   中英

将函数/方法传递给python脚本

[英]Pass a function/method to a python script

我已经在Google Colab单元格中定义了此方法/函数

[5]:def lstm_model2(input_features, timesteps, regularizers=regularizers, batch_size=10):

       model = Sequential()
       model.add(LSTM(15, batch_input_shape=(batch_size, timesteps, 
          input_features), stateful=True,
                   recurrent_regularizer=regularizers))
       model.add(Dense(1))
       model.compile(loss='mae', optimizer='adam')

       return  model

我想将此方法传递给正在使用argparse在下一个单元格中执行的脚本。

[6]:!python statefulv2.py --model=lstm_model2

我尝试了一种类似于argparse中的类型参数的方法,例如在statefulv2.py脚本中定义了一个名称相同的抽象方法,以便argparse.add_argument('--model', help='LSTM model', type=lstm_model2, required=True)可以写在statefulv2.py内部,但这会引发无效的参数错误。

在argparse中是否有一种巧妙的方法将方法作为参数传递?

将方法保留在外部的原因是为了尝试不同的功能而对其进行编辑,因为GoogleColab没有提供用于在单独文件中更改模型的单独编辑器。

最好不要尝试传递这样的参数。 坚持基本类型。 一种替代方法是将不同的模型存储在诸如models.py类的文件中,例如:

def lstm_model1(...):
    # Definition of model1

def lstm_model2(...):
    # Definition of model2

等等。

statefulv2.py您可以:

import models
import argparse

parser = ...
parser.add_argument('-m', "--model", help='LSTM model', 
                      type=str, choices=['model1', 'model2'], required=True)

model_dict = {'model1': models.lstm_model1(...),
              'model2': models.lstm_model2(...)}

args = parser.parse_args()

my_model = model_dict[args.model]

编辑:如果不允许将模型保存到文件。

如果您绝对必须找到一种解决方法,可以将代码保存在缓冲区文件中,该文件可以作为open类型的参数读入statefulv2.py中。 这是一个演示:

在您的Colab单元格中,将函数代码编写为字符串:

def save_code_to_file():
    func_string = """
def lstm_model3():
    print ("Hey!")
"""
    with open("buffer", "w") as f:
        f.write(func_string)

statefulv2.py ,您可以拥有:

import argparse

parser = argparse.ArgumentParser()

parser.add_argument('-m', "--model", help='LSTM model', type=open, required=True)

args = parser.parse_args()

lines = args.model.readlines()

model_def = ""
for line in lines:
    model_def += line

exec(model_def)

lstm_model3()

输出(这是在iPython中,为Colab进行相应更改):

In [25]: %run statefulv2.py -m buffer                                                  
Hey!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM