def test_case_1(self): args = { "epochs": 3, "batch_size": 8, "validate": True, "use_cuda": True, "pickle_path": "./save/", "save_best_dev": True, "model_name": "default_model_name.pkl", "loss": Loss(None), "optimizer": Optimizer("Adam", lr=0.001, weight_decay=0), "vocab_size": 20, "word_emb_dim": 100, "rnn_hidden_units": 100, "num_classes": 3 } trainer = SeqLabelTrainer() train_data = [ [[1, 2, 3, 4, 5, 6], [1, 0, 1, 0, 1, 2]], [[2, 3, 4, 5, 1, 6], [0, 1, 0, 1, 0, 2]], [[1, 4, 1, 4, 1, 6], [1, 0, 1, 0, 1, 2]], [[1, 2, 3, 4, 5, 6], [1, 0, 1, 0, 1, 2]], [[2, 3, 4, 5, 1, 6], [0, 1, 0, 1, 0, 2]], [[1, 4, 1, 4, 1, 6], [1, 0, 1, 0, 1, 2]], ] dev_data = train_data model = SeqLabeling(args) trainer.train(network=model, train_data=train_data, dev_data=dev_data)
def test_case_1(self): args = { "epochs": 3, "batch_size": 2, "validate": False, "use_cuda": False, "pickle_path": "./save/", "save_best_dev": True, "model_name": "default_model_name.pkl", "loss": Loss("cross_entropy"), "optimizer": Optimizer("Adam", lr=0.001, weight_decay=0), "vocab_size": 10, "word_emb_dim": 100, "rnn_hidden_units": 100, "num_classes": 5, "evaluator": SeqLabelEvaluator() } trainer = SeqLabelTrainer(**args) train_data = [ [['a', 'b', 'c', 'd', 'e'], ['a', '@', 'c', 'd', 'e']], [['a', '@', 'c', 'd', 'e'], ['a', '@', 'c', 'd', 'e']], [['a', 'b', '#', 'd', 'e'], ['a', '@', 'c', 'd', 'e']], [['a', 'b', 'c', '?', 'e'], ['a', '@', 'c', 'd', 'e']], [['a', 'b', 'c', 'd', '$'], ['a', '@', 'c', 'd', 'e']], [['!', 'b', 'c', 'd', 'e'], ['a', '@', 'c', 'd', 'e']], ] vocab = { 'a': 0, 'b': 1, 'c': 2, 'd': 3, 'e': 4, '!': 5, '@': 6, '#': 7, '$': 8, '?': 9 } label_vocab = {'a': 0, '@': 1, 'c': 2, 'd': 3, 'e': 4} data_set = DataSet() for example in train_data: text, label = example[0], example[1] x = TextField(text, False) x_len = LabelField(len(text), is_target=False) y = TextField(label, is_target=False) ins = Instance(word_seq=x, truth=y, word_seq_origin_len=x_len) data_set.append(ins) data_set.index_field("word_seq", vocab) data_set.index_field("truth", label_vocab) model = SeqLabeling(args) trainer.train(network=model, train_data=data_set, dev_data=data_set) # If this can run, everything is OK. os.system("rm -rf save") print("pickle path deleted")
def train(): loader = LMDataSetLoader() train_data = loader.load() pre = Preprocessor(label_is_seq=True, share_vocab=True) train_set = pre.run(train_data, pickle_path=PICKLE) model = CharLM(50, 50, pre.vocab_size, pre.char_vocab_size) trainer = Trainer(task="language_model", loss=Loss("cross_entropy")) trainer.train(model, train_set)
def train(): train_args, model_args = ConfigSection(), ConfigSection() ConfigLoader.load_config(config_dir, {"text_class": train_args}) # load dataset print("Loading data...") ds_loader = ClassDatasetLoader(train_data_dir) data = ds_loader.load() print(data[0]) # pre-process data pre = ClassPreprocess() data_train = pre.run(data, pickle_path=save_dir) print("vocabulary size:", pre.vocab_size) print("number of classes:", pre.num_classes) model_args["num_classes"] = pre.num_classes model_args["vocab_size"] = pre.vocab_size # construct model print("Building model...") model = CNNText(model_args) # ConfigSaver().save_config(config_dir, {"text_class_model": model_args}) # train print("Training...") # 1 # trainer = ClassificationTrainer(train_args) # 2 trainer = ClassificationTrainer(epochs=train_args["epochs"], batch_size=train_args["batch_size"], validate=train_args["validate"], use_cuda=train_args["use_cuda"], pickle_path=save_dir, save_best_dev=train_args["save_best_dev"], model_name=model_name, loss=Loss("cross_entropy"), optimizer=Optimizer("SGD", lr=0.001, momentum=0.9)) trainer.train(model, data_train) print("Training finished!") saver = ModelSaver(os.path.join(save_dir, model_name)) saver.save_pytorch(model) print("Model saved!")
def train(): train_args, model_args = ConfigSection(), ConfigSection() ConfigLoader.load_config(config_dir, {"text_class": train_args}) # load dataset print("Loading data...") data = TextClassifyDataSet(load_func=ClassDataSetLoader.load) data.load(train_data_dir) print("vocabulary size:", len(data.word_vocab)) print("number of classes:", len(data.label_vocab)) save_pickle(data.word_vocab, save_dir, "word2id.pkl") save_pickle(data.label_vocab, save_dir, "label2id.pkl") model_args["num_classes"] = len(data.label_vocab) model_args["vocab_size"] = len(data.word_vocab) # construct model print("Building model...") model = CNNText(model_args) # train print("Training...") trainer = ClassificationTrainer(epochs=train_args["epochs"], batch_size=train_args["batch_size"], validate=train_args["validate"], use_cuda=train_args["use_cuda"], pickle_path=save_dir, save_best_dev=train_args["save_best_dev"], model_name=model_name, loss=Loss("cross_entropy"), optimizer=Optimizer("SGD", lr=0.001, momentum=0.9)) trainer.train(model, data) print("Training finished!") saver = ModelSaver(os.path.join(save_dir, model_name)) saver.save_pytorch(model) print("Model saved!")
def __init__(self, **kwargs): """ :param kwargs: dict of (key, value), or dict-like object. key is str. The base trainer requires the following keys: - epochs: int, the number of epochs in training - validate: bool, whether or not to validate on dev set - batch_size: int - pickle_path: str, the path to pickle files for pre-processing """ super(BaseTrainer, self).__init__() """ "default_args" provides default value for important settings. The initialization arguments "kwargs" with the same key (name) will override the default value. "kwargs" must have the same type as "default_args" on corresponding keys. Otherwise, error will raise. """ default_args = { "epochs": 3, "batch_size": 8, "validate": True, "use_cuda": True, "pickle_path": "./save/", "save_best_dev": True, "model_name": "default_model_name.pkl", "print_every_step": 1, "loss": Loss(None), # used to pass type check "optimizer": Optimizer("Adam", lr=0.001, weight_decay=0) } """ "required_args" is the collection of arguments that users must pass to Trainer explicitly. This is used to warn users of essential settings in the training. Specially, "required_args" does not have default value, so they have nothing to do with "default_args". """ required_args = { "task" # one of ("seq_label", "text_classify") } for req_key in required_args: if req_key not in kwargs: logger.error("Trainer lacks argument {}".format(req_key)) raise ValueError("Trainer lacks argument {}".format(req_key)) self._task = kwargs["task"] for key in default_args: if key in kwargs: if isinstance(kwargs[key], type(default_args[key])): default_args[key] = kwargs[key] else: msg = "Argument %s type mismatch: expected %s while get %s" % ( key, type(default_args[key]), type(kwargs[key])) logger.error(msg) raise ValueError(msg) else: # BaseTrainer doesn't care about extra arguments pass print(default_args) self.n_epochs = default_args["epochs"] self.batch_size = default_args["batch_size"] self.pickle_path = default_args["pickle_path"] self.validate = default_args["validate"] self.save_best_dev = default_args["save_best_dev"] self.use_cuda = default_args["use_cuda"] self.model_name = default_args["model_name"] self.print_every_step = default_args["print_every_step"] self._model = None self._loss_func = default_args["loss"].get( ) # return a pytorch loss function or None self._optimizer = None self._optimizer_proto = default_args["optimizer"] self._summary_writer = SummaryWriter(self.pickle_path + 'tensorboard_logs') self._graph_summaried = False self._best_accuracy = 0.0
# construct model model_args = { 'num_classes': n_classes, 'vocab_size': vocab_size } model = ClassificationModel(num_classes=n_classes, vocab_size=vocab_size) # construct trainer train_args = { "epochs": 3, "batch_size": 16, "pickle_path": data_dir, "validate": False, "save_best_dev": False, "model_saved_path": None, "use_cuda": True, "loss": Loss("cross_entropy"), "optimizer": Optimizer("Adam", lr=0.001) } trainer = ClassificationTrainer(**train_args) # start training trainer.train(model, train_data=train_set, dev_data=dev_set) # predict using model data_infer = [x[0] for x in data] infer = ClassificationInfer(data_dir) labels_pred = infer.predict(model.cpu(), data_infer) print(labels_pred)