Sacred - pass all parameters as one





.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ height:90px;width:728px;box-sizing:border-box;
}







0















When using Sacred it is necessary to pass all variables from the experiment config, into the main function, for example



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


As you can see, in this experiment there are 2 variables, C and gamma, and they are passed into the main function.



In real scenarios, there are dozens of experiment variables, and the passing all of them into the main function gets really cluttered.
Is there a way to pass them all as a dictionary? Or maybe as an object with attributes?



A good solution will result in something like follows:



@ex.automain
def run(config):
config.C # Option 1
config['C'] # Option 2









share|improve this question























  • Not sure about sacred, but in python you can! this is what is often refered to **kwargs you can check here for some example: book.pythontips.com/en/latest/args_and_kwargs.html

    – RomainL.
    Nov 22 '18 at 12:52











  • Yep, I'm aware of that. The problem is that I am not the one passing the variables from the cfg function into the run function so I'm not responsible for sending them as positional / key-word arguments

    – bluesummers
    Nov 22 '18 at 12:55


















0















When using Sacred it is necessary to pass all variables from the experiment config, into the main function, for example



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


As you can see, in this experiment there are 2 variables, C and gamma, and they are passed into the main function.



In real scenarios, there are dozens of experiment variables, and the passing all of them into the main function gets really cluttered.
Is there a way to pass them all as a dictionary? Or maybe as an object with attributes?



A good solution will result in something like follows:



@ex.automain
def run(config):
config.C # Option 1
config['C'] # Option 2









share|improve this question























  • Not sure about sacred, but in python you can! this is what is often refered to **kwargs you can check here for some example: book.pythontips.com/en/latest/args_and_kwargs.html

    – RomainL.
    Nov 22 '18 at 12:52











  • Yep, I'm aware of that. The problem is that I am not the one passing the variables from the cfg function into the run function so I'm not responsible for sending them as positional / key-word arguments

    – bluesummers
    Nov 22 '18 at 12:55














0












0








0








When using Sacred it is necessary to pass all variables from the experiment config, into the main function, for example



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


As you can see, in this experiment there are 2 variables, C and gamma, and they are passed into the main function.



In real scenarios, there are dozens of experiment variables, and the passing all of them into the main function gets really cluttered.
Is there a way to pass them all as a dictionary? Or maybe as an object with attributes?



A good solution will result in something like follows:



@ex.automain
def run(config):
config.C # Option 1
config['C'] # Option 2









share|improve this question














When using Sacred it is necessary to pass all variables from the experiment config, into the main function, for example



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


As you can see, in this experiment there are 2 variables, C and gamma, and they are passed into the main function.



In real scenarios, there are dozens of experiment variables, and the passing all of them into the main function gets really cluttered.
Is there a way to pass them all as a dictionary? Or maybe as an object with attributes?



A good solution will result in something like follows:



@ex.automain
def run(config):
config.C # Option 1
config['C'] # Option 2






python python-sacred






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 22 '18 at 12:41









bluesummersbluesummers

2,57612650




2,57612650













  • Not sure about sacred, but in python you can! this is what is often refered to **kwargs you can check here for some example: book.pythontips.com/en/latest/args_and_kwargs.html

    – RomainL.
    Nov 22 '18 at 12:52











  • Yep, I'm aware of that. The problem is that I am not the one passing the variables from the cfg function into the run function so I'm not responsible for sending them as positional / key-word arguments

    – bluesummers
    Nov 22 '18 at 12:55



















  • Not sure about sacred, but in python you can! this is what is often refered to **kwargs you can check here for some example: book.pythontips.com/en/latest/args_and_kwargs.html

    – RomainL.
    Nov 22 '18 at 12:52











  • Yep, I'm aware of that. The problem is that I am not the one passing the variables from the cfg function into the run function so I'm not responsible for sending them as positional / key-word arguments

    – bluesummers
    Nov 22 '18 at 12:55

















Not sure about sacred, but in python you can! this is what is often refered to **kwargs you can check here for some example: book.pythontips.com/en/latest/args_and_kwargs.html

– RomainL.
Nov 22 '18 at 12:52





Not sure about sacred, but in python you can! this is what is often refered to **kwargs you can check here for some example: book.pythontips.com/en/latest/args_and_kwargs.html

– RomainL.
Nov 22 '18 at 12:52













Yep, I'm aware of that. The problem is that I am not the one passing the variables from the cfg function into the run function so I'm not responsible for sending them as positional / key-word arguments

– bluesummers
Nov 22 '18 at 12:55





Yep, I'm aware of that. The problem is that I am not the one passing the variables from the cfg function into the run function so I'm not responsible for sending them as positional / key-word arguments

– bluesummers
Nov 22 '18 at 12:55












2 Answers
2






active

oldest

votes


















1














Yes, you can use the special value _config value for that:



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





share|improve this answer































    1














    Most elegant solution I could find



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





    share|improve this answer
























      Your Answer






      StackExchange.ifUsing("editor", function () {
      StackExchange.using("externalEditor", function () {
      StackExchange.using("snippets", function () {
      StackExchange.snippets.init();
      });
      });
      }, "code-snippets");

      StackExchange.ready(function() {
      var channelOptions = {
      tags: "".split(" "),
      id: "1"
      };
      initTagRenderer("".split(" "), "".split(" "), channelOptions);

      StackExchange.using("externalEditor", function() {
      // Have to fire editor after snippets, if snippets enabled
      if (StackExchange.settings.snippets.snippetsEnabled) {
      StackExchange.using("snippets", function() {
      createEditor();
      });
      }
      else {
      createEditor();
      }
      });

      function createEditor() {
      StackExchange.prepareEditor({
      heartbeatType: 'answer',
      autoActivateHeartbeat: false,
      convertImagesToLinks: true,
      noModals: true,
      showLowRepImageUploadWarning: true,
      reputationToPostImages: 10,
      bindNavPrevention: true,
      postfix: "",
      imageUploader: {
      brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
      contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
      allowUrls: true
      },
      onDemand: true,
      discardSelector: ".discard-answer"
      ,immediatelyShowMarkdownHelp:true
      });


      }
      });














      draft saved

      draft discarded


















      StackExchange.ready(
      function () {
      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53431283%2fsacred-pass-all-parameters-as-one%23new-answer', 'question_page');
      }
      );

      Post as a guest















      Required, but never shown

























      2 Answers
      2






      active

      oldest

      votes








      2 Answers
      2






      active

      oldest

      votes









      active

      oldest

      votes






      active

      oldest

      votes









      1














      Yes, you can use the special value _config value for that:



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





      share|improve this answer




























        1














        Yes, you can use the special value _config value for that:



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





        share|improve this answer


























          1












          1








          1







          Yes, you can use the special value _config value for that:



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





          share|improve this answer













          Yes, you can use the special value _config value for that:



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






          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Mar 4 at 11:44









          QlausQlaus

          739312




          739312

























              1














              Most elegant solution I could find



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





              share|improve this answer




























                1














                Most elegant solution I could find



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





                share|improve this answer


























                  1












                  1








                  1







                  Most elegant solution I could find



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





                  share|improve this answer













                  Most elegant solution I could find



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






                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered Dec 4 '18 at 17:17









                  bluesummersbluesummers

                  2,57612650




                  2,57612650






























                      draft saved

                      draft discarded




















































                      Thanks for contributing an answer to Stack Overflow!


                      • Please be sure to answer the question. Provide details and share your research!

                      But avoid



                      • Asking for help, clarification, or responding to other answers.

                      • Making statements based on opinion; back them up with references or personal experience.


                      To learn more, see our tips on writing great answers.




                      draft saved


                      draft discarded














                      StackExchange.ready(
                      function () {
                      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53431283%2fsacred-pass-all-parameters-as-one%23new-answer', 'question_page');
                      }
                      );

                      Post as a guest















                      Required, but never shown





















































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown

































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown







                      Popular posts from this blog

                      Guess what letter conforming each word

                      Port of Spain

                      Run scheduled task as local user group (not BUILTIN)