Sacred - 将所有参数作为一个参数传递
Sacred - pass all parameters as one
使用 Sacred
时,需要将实验配置中的所有变量传递到主函数中,例如
ex = Experiment('iris_rbf_svm')
@ex.config
def cfg():
C = 1.0
gamma = 0.7
@ex.automain
def run(C, gamma):
iris = datasets.load_iris()
per = permutation(iris.target.size)
iris.data = iris.data[per]
iris.target = iris.target[per]
clf = svm.SVC(C, 'rbf', gamma=gamma)
clf.fit(iris.data[:90],
iris.target[:90])
return clf.score(iris.data[90:],
iris.target[90:])
如你所见,在这个实验中有2个变量,C
和gamma
,它们被传递到主函数中。
在实际场景中,有几十个实验变量,将它们全部传递到 main 函数中非常混乱。
有没有办法将它们全部作为字典传递?或者可能作为具有属性的对象?
一个好的解决方案会产生如下结果:
@ex.automain
def run(config):
config.C # Option 1
config['C'] # Option 2
我能找到的最优雅的解决方案
ex = Experiment('iris_rbf_svm')
@ex.config
def cfg():
C = 1.0
gamma = 0.7
params = {'C': C, 'gamma': gamma}
@ex.automain
def run(params):
iris = datasets.load_iris()
per = permutation(iris.target.size)
iris.data = iris.data[per]
iris.target = iris.target[per]
clf = svm.SVC(params['C'], 'rbf', gamma=params['gamma'])
clf.fit(iris.data[:90],
iris.target[:90])
return clf.score(iris.data[90:],
iris.target[90:])
是的,您可以为此使用 special value _config
值:
ex = Experiment('iris_rbf_svm')
@ex.config
def cfg():
C = 1.0
gamma = 0.7
@ex.automain
def run(_config):
C = _config['C']
gamma = _config['gamma']
git 存储库中有一个相关示例:
https://github.com/IDSIA/sacred/blob/master/examples/08_less_magic.py
可以直接指定一个字典(不用创建修饰函数)
from sacred import Experiment
from sacred.observers import FileStorageObserver
from sklearn import svm, datasets, model_selection
ex = Experiment("svm")
ex.add_config(
{ # Configuration is explicitly defined as dictionary.
"C": 1.0,
"gamma": 0.7,
"kernel": "rbf",
"seed": 42,
}
)
并按如下方式使用它:
def get_model(C, gamma, kernel):
return svm.SVC(C=C, kernel=kernel, gamma=gamma)
@ex.main # Using main, command-line arguments will not be interpreted in any special way.
def run(_config):
X, y = datasets.load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = model_selection.train_test_split(
X, y, test_size=0.2
)
clf = get_model(
_config["C"], _config["gamma"], _config["kernel"]
) # Parameters are passed explicitly.
clf.fit(X_train, y_train)
return clf.score(X_test, y_test)
if __name__ == "__main__":
ex.run()
使用 Sacred
时,需要将实验配置中的所有变量传递到主函数中,例如
ex = Experiment('iris_rbf_svm')
@ex.config
def cfg():
C = 1.0
gamma = 0.7
@ex.automain
def run(C, gamma):
iris = datasets.load_iris()
per = permutation(iris.target.size)
iris.data = iris.data[per]
iris.target = iris.target[per]
clf = svm.SVC(C, 'rbf', gamma=gamma)
clf.fit(iris.data[:90],
iris.target[:90])
return clf.score(iris.data[90:],
iris.target[90:])
如你所见,在这个实验中有2个变量,C
和gamma
,它们被传递到主函数中。
在实际场景中,有几十个实验变量,将它们全部传递到 main 函数中非常混乱。 有没有办法将它们全部作为字典传递?或者可能作为具有属性的对象?
一个好的解决方案会产生如下结果:
@ex.automain
def run(config):
config.C # Option 1
config['C'] # Option 2
我能找到的最优雅的解决方案
ex = Experiment('iris_rbf_svm')
@ex.config
def cfg():
C = 1.0
gamma = 0.7
params = {'C': C, 'gamma': gamma}
@ex.automain
def run(params):
iris = datasets.load_iris()
per = permutation(iris.target.size)
iris.data = iris.data[per]
iris.target = iris.target[per]
clf = svm.SVC(params['C'], 'rbf', gamma=params['gamma'])
clf.fit(iris.data[:90],
iris.target[:90])
return clf.score(iris.data[90:],
iris.target[90:])
是的,您可以为此使用 special value _config
值:
ex = Experiment('iris_rbf_svm')
@ex.config
def cfg():
C = 1.0
gamma = 0.7
@ex.automain
def run(_config):
C = _config['C']
gamma = _config['gamma']
git 存储库中有一个相关示例: https://github.com/IDSIA/sacred/blob/master/examples/08_less_magic.py
可以直接指定一个字典(不用创建修饰函数)
from sacred import Experiment
from sacred.observers import FileStorageObserver
from sklearn import svm, datasets, model_selection
ex = Experiment("svm")
ex.add_config(
{ # Configuration is explicitly defined as dictionary.
"C": 1.0,
"gamma": 0.7,
"kernel": "rbf",
"seed": 42,
}
)
并按如下方式使用它:
def get_model(C, gamma, kernel):
return svm.SVC(C=C, kernel=kernel, gamma=gamma)
@ex.main # Using main, command-line arguments will not be interpreted in any special way.
def run(_config):
X, y = datasets.load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = model_selection.train_test_split(
X, y, test_size=0.2
)
clf = get_model(
_config["C"], _config["gamma"], _config["kernel"]
) # Parameters are passed explicitly.
clf.fit(X_train, y_train)
return clf.score(X_test, y_test)
if __name__ == "__main__":
ex.run()