[英]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.