From c74731bd4241316cf0b56b4dfd558c099ad8160c Mon Sep 17 00:00:00 2001 From: Haifeng Jin Date: Sun, 30 Sep 2018 20:17:09 -0500 Subject: [PATCH] 0.2.17 (#231) * delete * Print Information Changes for AutoKeras v0.3 (#229) resolves #224 * Update CONTRIBUTING.md * Develop (#187) * merge (#128) * 0.2.6 (#126) * 0.2.5 setup.py (#111) * [WIP] Attempts to Fix Memory Error (#112) * Add Website Badge in README.md, apply timeout in search function in search.py * Add timeout in maximize_acq function in search.py * Update unit test to allow timeout to raise TimeoutError * Add unit test for timeout resume * Remove TimeoutError from expectation * Check Timeout exception in search() in search.py * 0.2.5 setup.py (#110) * Prevent gpu memory copy to main process after train() finished * Cast loss from tensor to float * Add pass() in MockProcess * [MRG] Search Space limited to avoid out of memory (#121) * limited the search space * limited the search space * reduce search space * test added * [MRG]Pytorch mp (#124) * Change multiprcoessing to torch.multiprocessing * Replace multiprocessing.Pool with torch.multiprocessing.Pool in tests * 0.2.6 (#125) * new release * auto deploy * auto deploy of docs * fix the docs auto deploy * Create CNAME * deploy docs fixed * update * bug fix (#127) * setup.py * rm print * Issue#37 and Issue #79 Save keras model/autokeras model (#122) * Issue #37 Export Keras model * Issue #79 Save autokeras model * Issue #37 and Issue#79 Fixed comments * Issue #37 and Issue #79 * Issue #37 and Issue #79 * Issue #37 and Issue #79 Fixed pytests * Issue #37 and Issue #79 * quick fix test * Progbar (#143) * 0.2.6 (#126) * 0.2.5 setup.py (#111) * [WIP] Attempts to Fix Memory Error (#112) * Add Website Badge in README.md, apply timeout in search function in search.py * Add timeout in maximize_acq function in search.py * Update unit test to allow timeout to raise TimeoutError * Add unit test for timeout resume * Remove TimeoutError from expectation * Check Timeout exception in search() in search.py * 0.2.5 setup.py (#110) * Prevent gpu memory copy to main process after train() finished * Cast loss from tensor to float * Add pass() in MockProcess * [MRG] Search Space limited to avoid out of memory (#121) * limited the search space * limited the search space * reduce search space * test added * [MRG]Pytorch mp (#124) * Change multiprcoessing to torch.multiprocessing * Replace multiprocessing.Pool with torch.multiprocessing.Pool in tests * 0.2.6 (#125) * new release * auto deploy * auto deploy of docs * fix the docs auto deploy * Create CNAME * deploy docs fixed * update * bug fix (#127) * setup.py * contribute guide * Add Progress Bar * Update utils.py * Update search.py * update constant (#145) * [WIP] Issue #158 Imageregressor (#159) * Develop (#146) * merge (#128) * 0.2.6 (#126) * 0.2.5 setup.py (#111) * [WIP] Attempts to Fix Memory Error (#112) * Add Website Badge in README.md, apply timeout in search function in search.py * Add timeout in maximize_acq function in search.py * Update unit test to allow timeout to raise TimeoutError * Add unit test for timeout resume * Remove TimeoutError from expectation * Check Timeout exception in search() in search.py * 0.2.5 setup.py (#110) * Prevent gpu memory copy to main process after train() finished * Cast loss from tensor to float * Add pass() in MockProcess * [MRG] Search Space limited to avoid out of memory (#121) * limited the search space * limited the search space * reduce search space * test added * [MRG]Pytorch mp (#124) * Change multiprcoessing to torch.multiprocessing * Replace multiprocessing.Pool with torch.multiprocessing.Pool in tests * 0.2.6 (#125) * new release * auto deploy * auto deploy of docs * fix the docs auto deploy * Create CNAME * deploy docs fixed * update * bug fix (#127) * setup.py * rm print * Issue#37 and Issue #79 Save keras model/autokeras model (#122) * Issue #37 Export Keras model * Issue #79 Save autokeras model * Issue #37 and Issue#79 Fixed comments * Issue #37 and Issue #79 * Issue #37 and Issue #79 * Issue #37 and Issue #79 Fixed pytests * Issue #37 and Issue #79 * quick fix test * Progbar (#143) * 0.2.6 (#126) * 0.2.5 setup.py (#111) * [WIP] Attempts to Fix Memory Error (#112) * Add Website Badge in README.md, apply timeout in search function in search.py * Add timeout in maximize_acq function in search.py * Update unit test to allow timeout to raise TimeoutError * Add unit test for timeout resume * Remove TimeoutError from expectation * Check Timeout exception in search() in search.py * 0.2.5 setup.py (#110) * Prevent gpu memory copy to main process after train() finished * Cast loss from tensor to float * Add pass() in MockProcess * [MRG] Search Space limited to avoid out of memory (#121) * limited the search space * limited the search space * reduce search space * test added * [MRG]Pytorch mp (#124) * Change multiprcoessing to torch.multiprocessing * Replace multiprocessing.Pool with torch.multiprocessing.Pool in tests * 0.2.6 (#125) * new release * auto deploy * auto deploy of docs * fix the docs auto deploy * Create CNAME * deploy docs fixed * update * bug fix (#127) * setup.py * contribute guide * Add Progress Bar * Update utils.py * Update search.py * update constant (#145) * Update setup.py (#147) * Update setup.py * Update setup.py * Update setup.py (#155) * requirements * Issue #158 Export ImageRegressor model * Memory (#161) * aa * limit memory * refactor to_real_layer to member functions * bug fix (#166) * doc string changed for augment (#170) I added proper documentation for class ImageSupervised arg 'augment'. It is 'None' by default. However, if it is 'None', then it uses Constant.DATA_AUGMENTATION which is 'True'. This is misleading when trying things out. * Update constant.py * bug fix (#177) * memory limit dynamically (#180) * memory limit dynamically * test * test fixed * [MRG]Dcgan (#175) * Add Website Badge in README.md, apply timeout in search function in search.py * Add timeout in maximize_acq function in search.py * Update unit test to allow timeout to raise TimeoutError * Add unit test for timeout resume * Remove TimeoutError from expectation * Check Timeout exception in search() in search.py * finish workable version of gan * add unit test and small refactoring * add unsupervised super class * Fix test_dcgan ran too long issue, put default param in unsupervised::generate(input_sample=None) * remove examples/gan.py from repo * add missing import * correct model_trainer signature * fixed the bug in return value of train_model() * Update setup.py * [WIP]Update CONTRIBUTING.md (#190) * Update CONTRIBUTING.md * Update CONTRIBUTING.md * Update mkdocs.yml * code_reuse_example * Update CONTRIBUTING.md * update develop (#206) (#207) * Update CONTRIBUTING.md * Develop (#187) * merge (#128) * 0.2.6 (#126) * 0.2.5 setup.py (#111) * [WIP] Attempts to Fix Memory Error (#112) * Add Website Badge in README.md, apply timeout in search function in search.py * Add timeout in maximize_acq function in search.py * Update unit test to allow timeout to raise TimeoutError * Add unit test for timeout resume * Remove TimeoutError from expectation * Check Timeout exception in search() in search.py * 0.2.5 setup.py (#110) * Prevent gpu memory copy to main process after train() finished * Cast loss from tensor to float * Add pass() in MockProcess * [MRG] Search Space limited to avoid out of memory (#121) * limited the search space * limited the search space * reduce search space * test added * [MRG]Pytorch mp (#124) * Change multiprcoessing to torch.multiprocessing * Replace multiprocessing.Pool with torch.multiprocessing.Pool in tests * 0.2.6 (#125) * new release * auto deploy * auto deploy of docs * fix the docs auto deploy * Create CNAME * deploy docs fixed * update * bug fix (#127) * setup.py * rm print * Issue#37 and Issue #79 Save keras model/autokeras model (#122) * Issue #37 Export Keras model * Issue #79 Save autokeras model * Issue #37 and Issue#79 Fixed comments * Issue #37 and Issue #79 * Issue #37 and Issue #79 * Issue #37 and Issue #79 Fixed pytests * Issue #37 and Issue #79 * quick fix test * Progbar (#143) * 0.2.6 (#126) * 0.2.5 setup.py (#111) * [WIP] Attempts to Fix Memory Error (#112) * Add Website Badge in README.md, apply timeout in search function in search.py * Add timeout in maximize_acq function in search.py * Update unit test to allow timeout to raise TimeoutError * Add unit test for timeout resume * Remove TimeoutError from expectation * Check Timeout exception in search() in search.py * 0.2.5 setup.py (#110) * Prevent gpu memory copy to main process after train() finished * Cast loss from tensor to float * Add pass() in MockProcess * [MRG] Search Space limited to avoid out of memory (#121) * limited the search space * limited the search space * reduce search space * test added * [MRG]Pytorch mp (#124) * Change multiprcoessing to torch.multiprocessing * Replace multiprocessing.Pool with torch.multiprocessing.Pool in tests * 0.2.6 (#125) * new release * auto deploy * auto deploy of docs * fix the docs auto deploy * Create CNAME * deploy docs fixed * update * bug fix (#127) * setup.py * contribute guide * Add Progress Bar * Update utils.py * Update search.py * update constant (#145) * [WIP] Issue #158 Imageregressor (#159) * Develop (#146) * merge (#128) * 0.2.6 (#126) * 0.2.5 setup.py (#111) * [WIP] Attempts to Fix Memory Error (#112) * Add Website Badge in README.md, apply timeout in search function in search.py * Add timeout in maximize_acq function in search.py * Update unit test to allow timeout to raise TimeoutError * Add unit test for timeout resume * Remove TimeoutError from expectation * Check Timeout exception in search() in search.py * 0.2.5 setup.py (#110) * Prevent gpu memory copy to main process after train() finished * Cast loss from tensor to float * Add pass() in MockProcess * [MRG] Search Space limited to avoid out of memory (#121) * limited the search space * limited the search space * reduce search space * test added * [MRG]Pytorch mp (#124) * Change multiprcoessing to torch.multiprocessing * Replace multiprocessing.Pool with torch.multiprocessing.Pool in tests * 0.2.6 (#125) * new release * auto deploy * auto deploy of docs * fix the docs auto deploy * Create CNAME * deploy docs fixed * update * bug fix (#127) * setup.py * rm print * Issue#37 and Issue #79 Save keras model/autokeras model (#122) * Issue #37 Export Keras model * Issue #79 Save autokeras model * Issue #37 and Issue#79 Fixed comments * Issue #37 and Issue #79 * Issue #37 and Issue #79 * Issue #37 and Issue #79 Fixed pytests * Issue #37 and Issue #79 * quick fix test * Progbar (#143) * 0.2.6 (#126) * 0.2.5 setup.py (#111) * [WIP] Attempts to Fix Memory Error (#112) * Add Website Badge in README.md, apply timeout in search function in search.py * Add timeout in maximize_acq function in search.py * Update unit test to allow timeout to raise TimeoutError * Add unit test for timeout resume * Remove TimeoutError from expectation * Check Timeout exception in search() in search.py * 0.2.5 setup.py (#110) * Prevent gpu memory copy to main process after train() finished * Cast loss from tensor to float * Add pass() in MockProcess * [MRG] Search Space limited to avoid out of memory (#121) * limited the search space * limited the search space * reduce search space * test added * [MRG]Pytorch mp (#124) * Change multiprcoessing to torch.multiprocessing * Replace multiprocessing.Pool with torch.multiprocessing.Pool in tests * 0.2.6 (#125) * new release * auto deploy * auto deploy of docs * fix the docs auto deploy * Create CNAME * deploy docs fixed * update * bug fix (#127) * setup.py * contribute guide * Add Progress Bar * Update utils.py * Update search.py * update constant (#145) * Update setup.py (#147) * Update setup.py * Update setup.py * Update setup.py (#155) * requirements * Issue #158 Export ImageRegressor model * Memory (#161) * aa * limit memory * refactor to_real_layer to member functions * bug fix (#166) * doc string changed for augment (#170) I added proper documentation for class ImageSupervised arg 'augment'. It is 'None' by default. However, if it is 'None', then it uses Constant.DATA_AUGMENTATION which is 'True'. This is misleading when trying things out. * Update constant.py * bug fix (#177) * memory limit dynamically (#180) * memory limit dynamically * test * test fixed * [MRG]Dcgan (#175) * Add Website Badge in README.md, apply timeout in search function in search.py * Add timeout in maximize_acq function in search.py * Update unit test to allow timeout to raise TimeoutError * Add unit test for timeout resume * Remove TimeoutError from expectation * Check Timeout exception in search() in search.py * finish workable version of gan * add unit test and small refactoring * add unsupervised super class * Fix test_dcgan ran too long issue, put default param in unsupervised::generate(input_sample=None) * remove examples/gan.py from repo * add missing import * correct model_trainer signature * fixed the bug in return value of train_model() * Update setup.py * [WIP]Update CONTRIBUTING.md (#190) * Update CONTRIBUTING.md * Update CONTRIBUTING.md * Update mkdocs.yml * code_reuse_example * Update CONTRIBUTING.md * Update search.py * Develop (#215) * update develop (#206) * Update CONTRIBUTING.md * Develop (#187) * merge (#128) * 0.2.6 (#126) * 0.2.5 setup.py (#111) * [WIP] Attempts to Fix Memory Error (#112) * Add Website Badge in README.md, apply timeout in search function in search.py * Add timeout in maximize_acq function in search.py * Update unit test to allow timeout to raise TimeoutError * Add unit test for timeout resume * Remove TimeoutError from expectation * Check Timeout exception in search() in search.py * 0.2.5 setup.py (#110) * Prevent gpu memory copy to main process after train() finished * Cast loss from tensor to float * Add pass() in MockProcess * [MRG] Search Space limited to avoid out of memory (#121) * limited the search space * limited the search space * reduce search space * test added * [MRG]Pytorch mp (#124) * Change multiprcoessing to torch.multiprocessing * Replace multiprocessing.Pool with torch.multiprocessing.Pool in tests * 0.2.6 (#125) * new release * auto deploy * auto deploy of docs * fix the docs auto deploy * Create CNAME * deploy docs fixed * update * bug fix (#127) * setup.py * rm print * Issue#37 and Issue #79 Save keras model/autokeras model (#122) * Issue #37 Export Keras model * Issue #79 Save autokeras model * Issue #37 and Issue#79 Fixed comments * Issue #37 and Issue #79 * Issue #37 and Issue #79 * Issue #37 and Issue #79 Fixed pytests * Issue #37 and Issue #79 * quick fix test * Progbar (#143) * 0.2.6 (#126) * 0.2.5 setup.py (#111) * [WIP] Attempts to Fix Memory Error (#112) * Add Website Badge in README.md, apply timeout in search function in search.py * Add timeout in maximize_acq function in search.py * Update unit test to allow timeout to raise TimeoutError * Add unit test for timeout resume * Remove TimeoutError from expectation * Check Timeout exception in search() in search.py * 0.2.5 setup.py (#110) * Prevent gpu memory copy to main process after train() finished * Cast loss from tensor to float * Add pass() in MockProcess * [MRG] Search Space limited to avoid out of memory (#121) * limited the search space * limited the search space * reduce search space * test added * [MRG]Pytorch mp (#124) * Change multiprcoessing to torch.multiprocessing * Replace multiprocessing.Pool with torch.multiprocessing.Pool in tests * 0.2.6 (#125) * new release * auto deploy * auto deploy of docs * fix the docs auto deploy * Create CNAME * deploy docs fixed * update * bug fix (#127) * setup.py * contribute guide * Add Progress Bar * Update utils.py * Update search.py * update constant (#145) * [WIP] Issue #158 Imageregressor (#159) * Develop (#146) * merge (#128) * 0.2.6 (#126) * 0.2.5 setup.py (#111) * [WIP] Attempts to Fix Memory Error (#112) * Add Website Badge in README.md, apply timeout in search function in search.py * Add timeout in maximize_acq function in search.py * Update unit test to allow timeout to raise TimeoutError * Add unit test for timeout resume * Remove TimeoutError from expectation * Check Timeout exception in search() in search.py * 0.2.5 setup.py (#110) * Prevent gpu memory copy to main process after train() finished * Cast loss from tensor to float * Add pass() in MockProcess * [MRG] Search Space limited to avoid out of memory (#121) * limited the search space * limited the search space * reduce search space * test added * [MRG]Pytorch mp (#124) * Change multiprcoessing to torch.multiprocessing * Replace multiprocessing.Pool with torch.multiprocessing.Pool in tests * 0.2.6 (#125) * new release * auto deploy * auto deploy of docs * fix the docs auto deploy * Create CNAME * deploy docs fixed * update * bug fix (#127) * setup.py * rm print * Issue#37 and Issue #79 Save keras model/autokeras model (#122) * Issue #37 Export Keras model * Issue #79 Save autokeras model * Issue #37 and Issue#79 Fixed comments * Issue #37 and Issue #79 * Issue #37 and Issue #79 * Issue #37 and Issue #79 Fixed pytests * Issue #37 and Issue #79 * quick fix test * Progbar (#143) * 0.2.6 (#126) * 0.2.5 setup.py (#111) * [WIP] Attempts to Fix Memory Error (#112) * Add Website Badge in README.md, apply timeout in search function in search.py * Add timeout in maximize_acq function in search.py * Update unit test to allow timeout to raise TimeoutError * Add unit test for timeout resume * Remove TimeoutError from expectation * Check Timeout exception in search() in search.py * 0.2.5 setup.py (#110) * Prevent gpu memory copy to main process after train() finished * Cast loss from tensor to float * Add pass() in MockProcess * [MRG] Search Space limited to avoid out of memory (#121) * limited the search space * limited the search space * reduce search space * test added * [MRG]Pytorch mp (#124) * Change multiprcoessing to torch.multiprocessing * Replace multiprocessing.Pool with torch.multiprocessing.Pool in tests * 0.2.6 (#125) * new release * auto deploy * auto deploy of docs * fix the docs auto deploy * Create CNAME * deploy docs fixed * update * bug fix (#127) * setup.py * contribute guide * Add Progress Bar * Update utils.py * Update search.py * update constant (#145) * Update setup.py (#147) * Update setup.py * Update setup.py * Update setup.py (#155) * requirements * Issue #158 Export ImageRegressor model * Memory (#161) * aa * limit memory * refactor to_real_layer to member functions * bug fix (#166) * doc string changed for augment (#170) I added proper documentation for class ImageSupervised arg 'augment'. It is 'None' by default. However, if it is 'None', then it uses Constant.DATA_AUGMENTATION which is 'True'. This is misleading when trying things out. * Update constant.py * bug fix (#177) * memory limit dynamically (#180) * memory limit dynamically * test * test fixed * [MRG]Dcgan (#175) * Add Website Badge in README.md, apply timeout in search function in search.py * Add timeout in maximize_acq function in search.py * Update unit test to allow timeout to raise TimeoutError * Add unit test for timeout resume * Remove TimeoutError from expectation * Check Timeout exception in search() in search.py * finish workable version of gan * add unit test and small refactoring * add unsupervised super class * Fix test_dcgan ran too long issue, put default param in unsupervised::generate(input_sample=None) * remove examples/gan.py from repo * add missing import * correct model_trainer signature * fixed the bug in return value of train_model() * Update setup.py * [WIP]Update CONTRIBUTING.md (#190) * Update CONTRIBUTING.md * Update CONTRIBUTING.md * Update mkdocs.yml * code_reuse_example * Update CONTRIBUTING.md * bug_fix (#208) * bug_fix (#214) resolves #212 * Update CONTRIBUTING.md * Update setup.py * delete (#217) * Print Information Changes for AutoKeras v0.3 * 0.2.17 --- autokeras/image_supervised.py | 4 +++- autokeras/model_trainer.py | 32 ++++++-------------------------- autokeras/search.py | 6 ++++-- setup.py | 4 ++-- 4 files changed, 15 insertions(+), 31 deletions(-) diff --git a/autokeras/image_supervised.py b/autokeras/image_supervised.py index 8718902d8..cc76df9ae 100644 --- a/autokeras/image_supervised.py +++ b/autokeras/image_supervised.py @@ -248,7 +248,7 @@ def fit(self, x_train=None, y_train=None, time_limit=None): if len(self.load_searcher().history) == 0: raise TimeoutError("Search Time too short. No model was found during the search time.") elif self.verbose: - print('Time is out.') + print('\nTime limit for model search is reached. Ending the model search.') @abstractmethod def get_n_output_node(self): @@ -315,6 +315,8 @@ def final_fit(self, x_train, y_train, x_test, y_test, trainer_args=None, retrain searcher = self.load_searcher() graph = searcher.load_best_model() + if self.verbose: + print('\nLoading and training the best model recorded from the search.') if retrain: graph.weighted = False diff --git a/autokeras/model_trainer.py b/autokeras/model_trainer.py index 644ab0f22..14b838528 100644 --- a/autokeras/model_trainer.py +++ b/autokeras/model_trainer.py @@ -64,6 +64,8 @@ def __init__(self, model, **kwargs): self.model.to(self.device) self.optimizer = None self.early_stop = None + self.current_epoch = 0 + self.current_metric_value = 0 def train_model(self, max_iter_num=None, @@ -89,40 +91,17 @@ def train_model(self, test_loss_list = [] self.optimizer = torch.optim.Adam(self.model.parameters()) - progress_bar = None - if self.verbose: - progress_bar = tqdm(total=max_iter_num, - desc=' Model ', - file=sys.stdout, - leave=False, - ncols=75, - position=1, - unit=' epoch') - for epoch in range(max_iter_num): self._train() test_loss, metric_value = self._test() + self.current_metric_value = metric_value test_metric_value_list.append(metric_value) test_loss_list.append(test_loss) - if self.verbose: - progress_bar.update(1) - if epoch == 0: - header = ['Epoch', 'Loss', 'Accuracy'] - line = '|'.join(x.center(24) for x in header) - progress_bar.write('+' + '-' * len(line) + '+') - progress_bar.write('|' + line + '|') - progress_bar.write('+' + '-' * len(line) + '+') - r = [epoch + 1, test_loss, metric_value] - line = '|'.join(str(x).center(24) for x in r) - progress_bar.write('|' + line + '|') - progress_bar.write('+' + '-' * len(line) + '+') decreasing = self.early_stop.on_epoch_end(test_loss) if not decreasing: if self.verbose: print('\nNo loss decrease after {} epochs.\n'.format(max_no_improvement_num)) break - if self.verbose: - progress_bar.close() last_num = min(max_no_improvement_num, max_iter_num) return (sum(test_loss_list[-last_num:]) / last_num, sum(test_metric_value_list[-last_num:]) / last_num) @@ -130,14 +109,15 @@ def train_model(self, def _train(self): self.model.train() loader = self.train_loader + self.current_epoch += 1 cp_loader = deepcopy(loader) if self.verbose: progress_bar = tqdm(total=len(cp_loader), - desc='Current Epoch', + desc='Epoch-' + str(self.current_epoch) + ', Current Metric - ' + str(self.current_metric_value), file=sys.stdout, leave=False, - ncols=75, + ncols=100, position=0, unit=' batch') diff --git a/autokeras/search.py b/autokeras/search.py index 26006db0e..1dc7ef040 100644 --- a/autokeras/search.py +++ b/autokeras/search.py @@ -129,7 +129,9 @@ def add_model(self, metric_value, loss, graph, model_id): line = '|'.join(x.center(24) for x in header) print('+' + '-' * len(line) + '+') print('|' + line + '|') - for i, r in enumerate(self.history): + + if self.history: + r = self.history[-1] print('+' + '-' * len(line) + '+') line = '|'.join(str(r[x]).center(24) for x in idx) print('|' + line + '|') @@ -219,7 +221,7 @@ def search(self, train_data, test_data, timeout=60 * 60 * 24): if not re.search('out of memory', str(e)): raise e if self.verbose: - print('out of memory') + print('\nCurrent model size is too big. Discontinuing training this model to search for other models.') Constant.MAX_MODEL_SIZE = graph.size() - 1 return finally: diff --git a/setup.py b/setup.py index b03c57dc5..1317d5f8c 100644 --- a/setup.py +++ b/setup.py @@ -5,12 +5,12 @@ packages=['autokeras'], # this must be the same as the name above install_requires=['torch==0.4.1', 'torchvision==0.2.1', 'numpy>=1.14.5', 'keras==2.2.2', 'scikit-learn==0.19.1', 'tensorflow>=1.10.0', 'tqdm==4.25.0'], - version='0.2.15', + version='0.2.17', description='AutoML for deep learning', author='Haifeng Jin', author_email='jhfjhfj1@gmail.com', url='http://autokeras.com', - download_url='https://github.com/jhfjhfj1/autokeras/archive/0.2.15.tar.gz', + download_url='https://github.com/jhfjhfj1/autokeras/archive/0.2.17.tar.gz', keywords=['automl'], # arbitrary keywords classifiers=[] )