python - 将函数/方法传递给 python 脚本
问题描述
我已经在 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]
编辑:如果不允许将模型保存到文件。
如果您绝对必须找到解决方法,您可以将代码保存在缓冲区文件中,该文件可以statefulv2.py
作为 type 的参数读入open
。这是一个演示:
在 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!
推荐阅读
- php - Count(): 参数必须是数组或者实现了Countable错误的对象,如何解决?
- linux - Vfio 0000:41:00.0:无法打开 /dev/vfio/32:没有这样的文件或目录 - QEMU
- javascript - 对存储在数据库中的会话数据的混淆违反了 REST 原则
- c++ - 与 std::type_index 相比,使用 std::type_info::hash_code 有什么优势
- reactjs - 在 React 中以编程方式打开一个 html 模式
- git - 构建 Git 虚拟文件系统
- javascript - 如何将 Json 返回从控制器发送到 Asp.NET Core MVC 应用程序的前端?
- python - 在 Heroku 中使用烧瓶部署 ML 模型时出现 H12 请求超时错误
- python - 从其他模块使用导入的函数时不起作用
- jestjs - 导入全局变量时 Jest 无法运行测试