Пример #1
0
def train_nn(n_epochs=2, log_interval=10):
    df = pd.read_csv('./data/df_super.csv')
    train_df, val_df, test_df = data.data_split(data.create_nn_dataset(df))

    model = LSTM(output_size=64)

    model, history = train_loop(model,
                                train_df,
                                val_df,
                                n_epochs=n_epochs,
                                log_interval=log_interval)

    torch.save({'model_state_dict': model.state_dict()}, 'nn.hdf5')
Пример #2
0
def main():
    args = parser.parse_args()
    print args

    corpus_file = 'data/android/corpus.tsv.gz'
    dataset = AndroidDataset(corpus_file)
    corpus = dataset.get_corpus()

    if args.embedding == 'askubuntu':
        embedding_file = 'data/askubuntu/vector/vectors_pruned.200.txt.gz'
    else:
        embedding_file = 'data/glove/glove.pruned.txt.gz'

    embedding_iter = Embedding.iterator(embedding_file)
    embedding = Embedding(args.embed, embedding_iter)
    print 'Embeddings loaded.'

    corpus_ids = embedding.corpus_to_ids(corpus)
    padding_id = embedding.vocab_ids['<padding>']

    dev_pos_file = 'data/android/dev.pos.txt'
    dev_neg_file = 'data/android/dev.neg.txt'
    dev_data = dataset.read_annotations(dev_pos_file, dev_neg_file)

    test_pos_file = 'data/android/test.pos.txt'
    test_neg_file = 'data/android/test.neg.txt'
    test_data = dataset.read_annotations(test_pos_file, test_neg_file)

    dev_batches = batch_utils.generate_eval_batches(corpus_ids, dev_data,
                                                    padding_id)
    test_batches = batch_utils.generate_eval_batches(corpus_ids, test_data,
                                                     padding_id)

    if os.path.isfile(args.load):
        if args.model == 'lstm':
            model = LSTM(args.embed, args.hidden)
        else:
            model = CNN(args.embed, args.hidden)

        checkpoint = torch.load(args.load)
        model.load_state_dict(checkpoint['state_dict'])
    else:
        print 'No checkpoint found here.'

    print 'Evaluating on dev set.'
    train_utils.evaluate_auc(args, model, embedding, dev_batches, padding_id)

    print 'Evaluating on test set.'
    train_utils.evaluate_auc(args, model, embedding, test_batches, padding_id)
    return
Пример #3
0
 def __init__(self,
              Data,
              lstm_neurons,
              epochs,
              ax,
              gradient=0.9056,
              dense_neruons=3):
     self.lstm = LSTM(lstm_neurons, dense_neruons)
     self.lstm.create_model()
     self.lstm.fit_model(epochs, Data)
     self.lstm.print_stats()
     self.states = States(4000, 23000)
     self.states.create_unperturbed(self.lstm, Data)
     self.states.create_perturbed(self.lstm, Data)
     self.Lyapunov = Lyapunov(self.states)
     self.Lyapunov.plot_exponent(ax, gradient)
Пример #4
0
    def __init__(self, state_shape, action_shape, stats):
        # self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
        self.device = torch.device("cpu")

        self.state_shape = state_shape
        self.action_shape = action_shape

        self.stats = stats

        self.learn_rate = 3e-4
        self.num_epochs = 8

        self.entropy_weight = 0.001
        self.kl_clip = 0.1

        self.deterministic_test_mode = False

        self.hidden_state_size = 16
        self.lstm = LSTM(self.state_shape, self.hidden_state_size)
        self.actor = Actor(self.hidden_state_size,
                           self.action_shape).to(self.device)
        self.critic = Critic(self.hidden_state_size).to(self.device)

        self.optimizer = torch.optim.Adam(list(self.actor.parameters()) +
                                          list(self.critic.parameters()),
                                          lr=self.learn_rate)
Пример #5
0
 def init_model(self, hparams):
     if self.config.exp.model == 'xgboost':
         model = XGBoost(hparams)
     elif self.config.exp.model == 'lstm':
         model = LSTM(hparams)
     elif self.config.exp.model == 'transformer':
         model = TransformerNet(hparams)
     return model
Пример #6
0
def train(args):
    src_root = args.src_root
    sr = args.sample_rate
    dt = args.delta_time
    batch_size = args.batch_size
    model_type = args.model_type
    params = {'N_CLASSES': len(os.listdir(args.src_root)), 'SR': sr, 'DT': dt}
    models = {
        'conv1d': Conv1D(**params),
        'conv2d': Conv2D(**params),
        'lstm': LSTM(**params)
    }
    assert model_type in models.keys(), '{} not an available model'.format(
        model_type)
    csv_path = os.path.join('logs', '{}_history.csv'.format(model_type))

    wav_paths = glob('{}/**'.format(src_root), recursive=True)
    wav_paths = [x.replace(os.sep, '/') for x in wav_paths if '.wav' in x]
    classes = sorted(os.listdir(args.src_root))
    le = LabelEncoder()
    le.fit(classes)
    labels = [os.path.split(x)[0].split('/')[-1] for x in wav_paths]
    labels = le.transform(labels)

    wav_train, wav_val, label_train, label_val = train_test_split(
        wav_paths, labels, test_size=0.1, random_state=0)

    assert len(
        label_train
    ) >= args.batch_size, 'Anzahl der trainierten Dateien muss >= batch_size sein'

    tg = DataGenerator(wav_train,
                       label_train,
                       sr,
                       dt,
                       len(set(label_train)),
                       batch_size=batch_size)
    vg = DataGenerator(wav_val,
                       label_val,
                       sr,
                       dt,
                       len(set(label_val)),
                       batch_size=batch_size)

    model = models[model_type]
    cp = ModelCheckpoint('models/{}.h5'.format(model_type),
                         monitor='val_loss',
                         save_best_only=True,
                         save_weights_only=False,
                         mode='auto',
                         save_freq='epoch',
                         verbose=1)
    csv_logger = CSVLogger(csv_path, append=False)
    model.fit(tg,
              validation_data=vg,
              epochs=30,
              verbose=1,
              callbacks=[csv_logger, cp])
Пример #7
0
class Predict:
    def __init__(self, Data, lstm_neurons, epochs, dense_neurons=3):
        self.lstm = LSTM(Data, lstm_neurons, epochs)
        self.lstm.fit_model(False)
        self.PredStates()
        print(self.unperturbed.shape)

    def PredStates(self):
        old_state = tf.expand_dims(
            self.lstm.Data.datapoints[200000:200000 +
                                      self.lstm.Data.time_steps], 0)
        predicted_states = []
        for i in range(300):
            new_state = self.lstm.model.predict(
                old_state, batch_size=self.lstm.Data.batch_size) + old_state
            old_state = new_state
            predicted_states.append(np.squeeze(np.squeeze(old_state, 0), 0))
        self.unperturbed = np.array(predicted_states)
Пример #8
0
def main(data_dir):
    BATCH_SIZE = 16
    N_SAMPLES_IN = 40  # divide by 10 to get # hours the sequence covers
    N_SAMPLES_OUT = 5

    generator = MyData(
        data_dir,
        BATCH_SIZE,
        N_SAMPLES_IN,
        N_SAMPLES_OUT
    )

    lstm = LSTM(N_SAMPLES_IN, N_SAMPLES_OUT, 1, 1)
    lstm.build()
    lstm.compile()

    lstm.model.fit(generator,
                   epochs=6,
                   shuffle=True,
                   verbose=1,
                   steps_per_epoch=len(generator))

    lstm.model.save('models/lstm_%d_%d_%d.h5' % (
        BATCH_SIZE, N_SAMPLES_IN, N_SAMPLES_OUT
    ))
Пример #9
0
def train_model(data_pack, num_epochs, learning_rate, num_words, dim_embedding, num_classes, model_name):
    train_X, train_y, valid_X, valid_y, test_X, test_y = data_pack

    if model_name == "Baseline-BoW":
        model = Bag_of_Words(num_words, num_classes)
    elif model_name == "Baseline-AvEmbedding":
        model = Baseline(num_words, dim_embedding, num_classes)
    elif model_name == "Shallow-CNN":
        n_filters = [40, 40]
        model = CNN(num_words, dim_embedding, num_classes, n_filters)
    elif model_name == "Deep-CNN":
        n_filters = [40, 48, 72, 48]
        model = CNN_Deep(num_words, dim_embedding, num_classes, n_filters)
    elif model_name == "Shallow-LSTM":
        memory_size = 100
        model = LSTM(num_words, dim_embedding, num_classes, memory_size)
    elif model_name == "Deep-LSTM":
        memory_size = 100
        model = LSTM_Deep(num_words, dim_embedding, num_classes, memory_size)
    elif model_name == "Shallow-CNN-CE":
        n_filters = [40, 40]
        model = CE_CNN(dim_embedding, num_classes, n_filters)
    elif model_name == "Deep-CNN-CE":
        n_filters = [40, 48, 72, 48]
        model = CE_CNN_Deep(dim_embedding, num_classes, n_filters)
    elif model_name == "Block-CNN-CE":
        n_filters = [64, 128, 256, 512]
        model = CE_CNN_Block(dim_embedding, num_classes, n_filters)
    elif model_name == "ResNet-CE":
        n_filters = [64, 128, 256, 512]
        model = CE_ResNet(dim_embedding, num_classes, n_filters)
    model.cuda()
    # n_filters = [15, 20, 40]
    # model = CNN_Deep(num_words, dim_embedding, num_classes, n_filters)

    max_train, max_val, max_test = 0, 0, 0
    min_train, min_val, min_test = 10, 10, 10
    model = torch.load(model_name + ".pt")
    model.cuda()

    optimizer = optim.Adam(model.parameters(), lr=learning_rate)
    model.eval()
    criterion = torch.nn.CrossEntropyLoss()
    a = []
    batch_x_one = torch.FloatTensor(batch_size, test_X[0].shape[1], dim_embedding)

    t_acc, output_results = run_example_set(model, criterion, test_X, test_y, batch_x_one=batch_x_one)
    print(output_results)
    results = open("results/example_set_prediction.txt", "w")
    for e in output_results:
        results.write(str(e) + "\n")
    print(str(t_acc))  
Пример #10
0
def main(args):
    if args.model == 'LSTM':
        model = LSTM(input_dim=args.input_dim, lstm_hidden_dim=args.lstm_hidden_dim, time_step=args.time_step)
    else:
        raise ValueError
    model.cuda()

    if args.optim == 'SGD':
        optimizer = torch.optim.SGD(model.parameters(), lr=args.lr, weight_decay=args.weight_decay)
    elif args.optim == 'SGD_momentum':
        optimizer = torch.optim.SGD(model.parameters(), lr=args.lr, momentum=0.9, weight_decay=args.weight_decay)
    elif args.optim == 'Adagrad':
        optimizer = torch.optim.Adagrad(model.parameters(), lr=args.lr, weight_decay=args.weight_decay)
    elif args.optim == 'RMSprop':
        optimizer = torch.optim.RMSprop(model.parameters(), lr=args.lr, alpha=0.999, eps=1e-8, weight_decay=args.weight_decay)
    elif args.optim == 'Adam':
        optimizer = torch.optim.Adam(model.parameters(), lr=args.lr, betas=(0.9, 0.999), eps=1e-8, weight_decay=args.weight_decay)
    else:
        raise ValueError

    lr_scheduler = None
    if args.load_path:
        if args.recover:
            load_model(model, args.load_path, strict=True)
            print('load model state dict in {}'.format(args.load_path))

    map_file_path = 'divide.csv'
    data_file_path = 'processed_data.txt'
    social_economical_path = '2010-2016.csv'
    if args.dataset == 'NaiveDataset':
        train_set = NaiveDataset(data_file_path, map_file_path)
    elif args.dataset == 'AdvancedDataset':
        train_set = AdvancedDataset(data_file_path, map_file_path, social_economical_path)
    else:
        raise ValueError
    train_dataloader = DataLoader(train_set, batch_size=args.batch_size, 
                                  shuffle=True, num_workers=args.num_workers,
                                  pin_memory=True)

    if args.evaluate:
        validate(train_dataloader, model)
        return

    train(train_dataloader, train_dataloader, model, optimizer, lr_scheduler, args)
Пример #11
0
def evaluate(args):
    label_map = load_label_map(args.dataset)
    n_classes = 50
    if args.dataset == "include":
        n_classes = 263

    if args.use_cnn:
        dataset = FeaturesDatset(
            features_dir=os.path.join(args.data_dir,
                                      f"{args.dataset}_test_features"),
            label_map=label_map,
            mode="test",
        )

    else:
        dataset = KeypointsDataset(
            keypoints_dir=os.path.join(args.data_dir,
                                       f"{args.dataset}_test_keypoints"),
            use_augs=False,
            label_map=label_map,
            mode="test",
            max_frame_len=169,
        )

    dataloader = data.DataLoader(
        dataset,
        batch_size=args.batch_size,
        shuffle=False,
        num_workers=4,
        pin_memory=True,
    )

    if args.model == "lstm":
        config = LstmConfig()
        if args.use_cnn:
            config.input_size = CnnConfig.output_dim
        model = LSTM(config=config, n_classes=n_classes)
    else:
        config = TransformerConfig(size=args.transformer_size)
        if args.use_cnn:
            config.input_size = CnnConfig.output_dim
        model = Transformer(config=config, n_classes=n_classes)

    model = model.to(device)

    if args.use_pretrained == "evaluate":
        model, _, _ = load_pretrained(args, n_classes, model)
        print("### Model loaded ###")

    else:
        exp_name = get_experiment_name(args)
        model_path = os.path.join(args.save_path, exp_name) + ".pth"
        ckpt = torch.load(model_path)
        model.load_state_dict(ckpt["model"])
        print("### Model loaded ###")

    test_loss, test_acc = validate(dataloader, model, device)
    print("Evaluation Results:")
    print(f"Loss: {test_loss}, Accuracy: {test_acc}")
Пример #12
0
def create_model():
    if args.model_type == 'cnn_net':
        model = CNN(args.vocab_size, args.padding_size)
    elif args.model_type == 'bow_net':
        model = BOW(args.vocab_size, args.padding_size)
    elif args.model_type == 'lstm_net':
        model = LSTM(args.vocab_size, args.padding_size)
    elif args.model_type == 'gru_net':
        model = GRU(args.vocab_size, args.padding_size)
    elif args.model_type == 'bigru_net':
        model = BiGRU(args.vocab_size, args.batch_size, args.padding_size)
    else:
        raise ValueError("Unknown model type!")
    return model
Пример #13
0
    def __init__(self, window_size=3) -> None:
        self.window_size = window_size

        self.dataset = SupervisedDataset(mode='test',
                                         window_size=self.window_size,
                                         log_reg=False)
        self.loader = DataLoader(self.dataset, batch_size=64, shuffle=False)

        self.checkpoint_path = "./model_params/val/blstm_bs64_lr1e-3_ws40_hs128_nl2_dout50/val_lstm_epoch91_acc81.9593.pth"
        #self.checkpoint_path = "./model_params/logistic_regression/val/val_logreg_epoch100_acc35.8229.pth"
        self.checkpoint = torch.load(self.checkpoint_path)

        self.model = LSTM(input_size=78,
                          hidden_size=128,
                          num_classes=170,
                          n_layers=2).to(device=torch.device('cuda:0'))
        #self.model = LogisticRegression(num_keypoints=78, num_features=2, num_classes=170).to(device=torch.device('cuda:0'))
        self.model.load_state_dict(self.checkpoint, strict=True)
        self.model.eval()

        #self.criterion = nn.BCEWithLogitsLoss()     # Use this for Logistic Regression training
        self.criterion = nn.BCELoss(
        )  # Use this for LSTM training (with Softmax)
Пример #14
0
def train(args):
    src_root = args.src_root
    sr = args.sample_rate
    dt = args.delta_time
    batch_size = args.batch_size
    model_type = args.model_type
    models = {'conv1d': Conv1D(), 'conv2d': Conv2D(), 'lstm': LSTM()}
    assert model_type in models.keys(), '{} not an available model'.format(
        model_type)

    wav_paths = glob('{}/**'.format(src_root), recursive=True)
    wav_paths = [x for x in wav_paths if '.wav' in x]
    classes = sorted(os.listdir(args.src_root))
    le = LabelEncoder()
    le.fit(classes)
    labels = [get_class(x, src_root) for x in wav_paths]
    labels = le.transform(labels)

    wav_train, wav_val, label_train, label_val = train_test_split(
        wav_paths, labels, test_size=0.1, random_state=0)
    tg = DataGenerator(wav_train,
                       label_train,
                       sr,
                       dt,
                       len(set(label_train)),
                       batch_size=batch_size)
    vg = DataGenerator(wav_val,
                       label_val,
                       sr,
                       dt,
                       len(set(label_val)),
                       batch_size=batch_size)

    model = models[model_type]
    cp = ModelCheckpoint('models/{}.h5'.format(model_type),
                         monitor='val_loss',
                         save_best_only=True,
                         save_weights_only=False,
                         mode='auto',
                         save_freq='epoch',
                         verbose=1)
    csv_logger = CSVLogger(os.path.join('logs',
                                        '{}_history.csv'.format(model_type)),
                           append=True)
    model.fit(tg,
              validation_data=vg,
              epochs=30,
              verbose=1,
              callbacks=[csv_logger, cp])
Пример #15
0
def train(args):
    src_root = args.src_root
    sr = args.sample_rate
    dt = args.delta_time
    batch_size = args.batch_size
    model_type = args.model_type
    params = {'N_CLASSES':len(os.listdir(args.src_root)),
              'SR':sr,
              'DT':dt}
    models = {'conv1d':Conv1D(**params),
              'conv2d':Conv2D(**params),
              'lstm':  LSTM(**params),
              'transformer': Transformer(**params),
              'ViT': ViT(**params)}

    assert model_type in models.keys(), '{} not an available model'.format(model_type)
    csv_path = os.path.join('logs', '{}_history.csv'.format(model_type))

    wav_paths = glob('{}/**'.format(src_root), recursive=True)
    wav_paths = [x.replace(os.sep, '/') for x in wav_paths if '.wav' in x]
    classes = sorted(os.listdir(args.src_root))
    le = LabelEncoder()
    le.fit(classes)
    labels = [os.path.split(x)[0].split('/')[-1] for x in wav_paths]
    labels = le.transform(labels)
    wav_train, wav_val, label_train, label_val = train_test_split(wav_paths,
                                                                  labels,
                                                                  test_size=0.1,
                                                                  random_state=0)

    assert len(label_train) >= args.batch_size, 'Number of train samples must be >= batch_size'
    if len(set(label_train)) != params['N_CLASSES']:
        warnings.warn('Found {}/{} classes in training data. Increase data size or change random_state.'.format(len(set(label_train)), params['N_CLASSES']))
    if len(set(label_val)) != params['N_CLASSES']:
        warnings.warn('Found {}/{} classes in validation data. Increase data size or change random_state.'.format(len(set(label_val)), params['N_CLASSES']))

    tg = DataGenerator(wav_train, label_train, sr, dt,
                       params['N_CLASSES'], batch_size=batch_size)
    vg = DataGenerator(wav_val, label_val, sr, dt,
                       params['N_CLASSES'], batch_size=batch_size)
    model = models[model_type]
    model.summary()
    cp = ModelCheckpoint('models/{}.h5'.format(model_type), monitor='val_loss',
                         save_best_only=True, save_weights_only=False,
                         mode='auto', save_freq='epoch', verbose=1)
    csv_logger = CSVLogger(csv_path, append=False)
    model.fit(tg, validation_data=vg,
              epochs=40, verbose=1,
              callbacks=[csv_logger])
Пример #16
0
def run():
    if len(sys.argv) < 2:
        print("Usage: imitate.py <file>")
        return

    with open(sys.argv[1], "r") as f:
        data = f.buffer.read()
    charset = set(data)
    world = Bytes(data, max_steps=100, charset=charset)
    print("Charset size: %d" % len(charset))

    model = Input(len(charset))
    model = LSTM(model)
    model = Affine(model, len(charset))
    model = Softmax(model)

    train(world, model)

    for _ in range(10):
        world.render(model)
Пример #17
0
 def make_lstm(self,
               embedd_dim: int = None,
               hidden_size: int = None,
               clone=None):
     assert ((embedd_dim is not None) and
             (hidden_size is not None)) or (clone is not None)
     if clone is not None:
         model = LSTM(clone.embedding_dim,
                      clone.hidden_dim,
                      vocab_size=self.vocab_size,
                      tagset_size=self.vocab_size)
         model.load_state_dict(clone.state_dict())
     else:
         model = LSTM(embedd_dim,
                      hidden_size,
                      vocab_size=self.vocab_size,
                      tagset_size=self.vocab_size)
     model = model.to(self.device)
     return model
Пример #18
0
def main(args):
    word_dict = WordDict(args.train_file)
    train_set = DataSet(args.train_file, word_dict, sentence_len)
    train_loader = data.DataLoader(train_set, batch_size=128)

    test_set = DataSet(args.test_file, word_dict, sentence_len)
    test_loader = data.DataLoader(test_set, batch_size=128)
    print('finish loading the data')

    if args.model == 'fasttext':
        model = FastText(train_set.vocab_size(), embed_size, 14)
    elif args.model == 'cnn':
        model = CNN(train_set.vocab_size(), embed_size, 14)
    else:
        model = LSTM(train_set.vocab_size(), embed_size, 14)

    optimizer = optim.Adam(model.parameters())
    criterion = nn.CrossEntropyLoss().to(device)

    for epoch in range(epochs):
        print('Epoch ', epoch)
        train(model, optimizer, criterion, train_loader)
        test(model, test_loader)
Пример #19
0
def fit(args):
    exp_name = get_experiment_name(args)
    logging_path = os.path.join(args.save_path, exp_name) + ".log"
    logging.basicConfig(filename=logging_path,
                        level=logging.INFO,
                        format="%(message)s")
    seed_everything(args.seed)
    label_map = load_label_map(args.dataset)

    if args.use_cnn:
        train_dataset = FeaturesDatset(
            features_dir=os.path.join(args.data_dir,
                                      f"{args.dataset}_train_features"),
            label_map=label_map,
            mode="train",
        )
        val_dataset = FeaturesDatset(
            features_dir=os.path.join(args.data_dir,
                                      f"{args.dataset}_val_features"),
            label_map=label_map,
            mode="val",
        )

    else:
        train_dataset = KeypointsDataset(
            keypoints_dir=os.path.join(args.data_dir,
                                       f"{args.dataset}_train_keypoints"),
            use_augs=args.use_augs,
            label_map=label_map,
            mode="train",
            max_frame_len=169,
        )
        val_dataset = KeypointsDataset(
            keypoints_dir=os.path.join(args.data_dir,
                                       f"{args.dataset}_val_keypoints"),
            use_augs=False,
            label_map=label_map,
            mode="val",
            max_frame_len=169,
        )

    train_dataloader = data.DataLoader(
        train_dataset,
        batch_size=args.batch_size,
        shuffle=True,
        num_workers=4,
        pin_memory=True,
    )
    val_dataloader = data.DataLoader(
        val_dataset,
        batch_size=args.batch_size,
        shuffle=False,
        num_workers=4,
        pin_memory=True,
    )

    n_classes = 50
    if args.dataset == "include":
        n_classes = 263

    if args.model == "lstm":
        config = LstmConfig()
        if args.use_cnn:
            config.input_size = CnnConfig.output_dim
        model = LSTM(config=config, n_classes=n_classes)
    else:
        config = TransformerConfig(size=args.transformer_size)
        if args.use_cnn:
            config.input_size = CnnConfig.output_dim
        model = Transformer(config=config, n_classes=n_classes)

    model = model.to(device)
    optimizer = torch.optim.AdamW(model.parameters(),
                                  lr=args.learning_rate,
                                  weight_decay=0.01)
    scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer,
                                                           mode="max",
                                                           factor=0.2)

    if args.use_pretrained == "resume_training":
        model, optimizer, scheduler = load_pretrained(args, n_classes, model,
                                                      optimizer, scheduler)

    model_path = os.path.join(args.save_path, exp_name) + ".pth"
    es = EarlyStopping(patience=15, mode="max")
    for epoch in range(args.epochs):
        print(f"Epoch: {epoch+1}/{args.epochs}")
        train_loss, train_acc = train(train_dataloader, model, optimizer,
                                      device)
        val_loss, val_acc = validate(val_dataloader, model, device)
        logging.info(
            "Epoch: {}, train loss: {}, train acc: {}, val loss: {}, val acc: {}"
            .format(epoch + 1, train_loss, train_acc, val_loss, val_acc))
        scheduler.step(val_acc)
        es(
            model_path=model_path,
            epoch_score=val_acc,
            model=model,
            optimizer=optimizer,
            scheduler=scheduler,
        )
        if es.early_stop:
            print("Early stopping")
            break

    print("### Training Complete ###")
Пример #20
0
def training(train_loader, test_loader, opt):
    net_list = [
        LSTM.LSTM(opt),
        BiLSTM.BiLSTM(opt),
        OriTextCNN.OriTextCNN(opt),
        DilaTextCNN.DilaTextCNN(opt),
        TextCNNInc.TextCNNInc(opt)
    ]
    net = net_list[4]
    best_acc = 0
    # best_top_accs   = []
    best_acc_loss = 0
    NUM_TRAIN = len(train_loader) * opt.BATCH_SIZE
    PRE_EPOCH = 0
    NUM_TRAIN_PER_EPOCH = len(train_loader)
    NET_PREFIX = opt.NET_SAVE_PATH + net.model_name + "/"
    print('==> Loading Model ...')
    temp_model_name = "temp_model.dat"
    model_name = "best_model.dat"
    if not os.path.exists(NET_PREFIX):
        os.mkdir(NET_PREFIX)
    if not os.path.exists('./source/log/' + net.model_name):
        os.mkdir('./source/log/' + net.model_name)
    if os.path.exists(NET_PREFIX + temp_model_name) and opt.RE_TRAIN == False:
        try:
            net, PRE_EPOCH, best_acc = net.load(NET_PREFIX + temp_model_name)
            print("Load existing model: %s" % (NET_PREFIX + temp_model_name))
        except:
            pass

    if opt.USE_CUDA: net.cuda()

    criterion = nn.CrossEntropyLoss()
    if opt.OPTIMIZER == 'Adam':
        optimizer = torch.optim.Adam(net.parameters(), lr=opt.LEARNING_RATE)
    elif opt.OPTIMIZER == 'SGD':
        optimizer = torch.optim.SGD(net.parameters(), lr=opt.LEARNING_RATE)
    elif opt.OPTIMIZER == 'RMSP':
        optimizer = torch.optim.RMSprop(net.parameters(), lr=opt.LEARNING_RATE)
    else:
        raise NameError("This optimizer isn't defined")

    train_recorder = {'loss': [], 'acc': []}
    test_recorder = {'loss': [], 'acc': []}

    t = datetime.datetime.now().strftime("%m%d_%H:%M:%S")
    log_file_name = "%s_%s.txt" % (net.model_name, t)

    for epoch in range(opt.NUM_EPOCHS):
        train_loss = 0
        train_acc = 0

        # Start training
        net.train()
        for i, data in tqdm(enumerate(train_loader),
                            desc="Training",
                            total=NUM_TRAIN_PER_EPOCH,
                            leave=False,
                            unit='b'):
            inputs, labels, sent = data
            if opt.USE_CUDA:
                inputs, labels = Variable(inputs.cuda()), Variable(
                    labels.cuda())
            else:
                inputs, labels = Variable(inputs), Variable(labels)

            # zero the parameter gradients
            optimizer.zero_grad()

            # forward + backward + optimize
            outputs = net(inputs)
            loss = criterion(outputs, labels)
            loss.backward()
            optimizer.step()

            # Do statistics for training
            train_loss += loss.data[0]
            _, predicts = torch.max(outputs, 1)
            num_correct = (predicts == labels).sum()
            train_acc += num_correct.data[0]

        # Start testing
        ave_test_loss, ave_test_acc, topnacc = testing(test_loader, net, opt)
        ave_train_loss = float(train_loss) / NUM_TRAIN
        ave_train_acc = float(train_acc) / NUM_TRAIN

        # Do recording for each epoch
        train_recorder['loss'].append(ave_train_loss)
        train_recorder['acc'].append(ave_train_acc)
        test_recorder['loss'].append(ave_test_loss)
        test_recorder['acc'].append(ave_test_acc)

        # Write log to files
        with open('./source/log/' + net.model_name + '/' + log_file_name,
                  'w+') as fp:
            json.dump(
                {
                    'train_recorder': train_recorder,
                    'test_recorder': test_recorder
                }, fp)

        # Output results
        print(
            'Epoch [%d/%d], Train Loss: %.4f, Train Acc: %.4f, Test Loss: %.4f, Test Acc: %.4f'
            % (epoch + 1 + PRE_EPOCH, opt.NUM_EPOCHS + PRE_EPOCH,
               ave_train_loss, ave_train_acc, ave_test_loss, ave_test_acc))
        if ave_test_acc > best_acc:
            best_acc = ave_test_acc
            best_top_accs = topnacc
            best_acc_loss = ave_test_loss
            net.save((epoch + PRE_EPOCH), best_acc, model_name)

        # Save a temp model
        net.save((epoch + PRE_EPOCH), best_acc, temp_model_name)

    summary_info = {
        'total_epoch': (epoch + PRE_EPOCH),
        'best_acc': best_acc,
        'best_acc_loss': best_acc_loss,
        'ave_test_acc': ave_test_acc,
        'ave_test_loss': ave_test_loss,
        'ave_train_acc': ave_train_acc,
        'ave_train_loss': ave_train_loss,
        'best_top_accs': best_top_accs
    }
    write_summary(net, opt, summary_info)
    print(
        '==> Training Finished. Current model is %s. The highest test acc is %.4f'
        % (net.model_name, best_acc))
    return net
Пример #21
0
        i = i.strip()
        i = i.split("\t")
        vocab[i[0]] = int(i[1])
    vocab[unk_string] = len(vocab)
    return vocab


assert args.ngrams == 0
assert args.share_vocab == 1

data = h5py.File(args.data_file, 'r')
data = data['data']
vocab = load_vocab(args.vocab_file)
vocab_fr = None

if args.load_file is not None:
    model, epoch = load_model(data, args)
    print("Loaded model at epoch {0} and resuming training.".format(epoch))
    model.train_epochs(start_epoch=epoch)
else:
    if args.model == "avg":
        model = Averaging(data, args, vocab, vocab_fr)
    elif args.model == "lstm":
        model = LSTM(data, args, vocab, vocab_fr)

    print(" ".join(sys.argv))
    print("Num examples:", len(data))
    print("Num words:", len(vocab))

    model.train_epochs()
Пример #22
0
    num_layers  = 1
    init_forget_bias = 1
    lr = 0.00016654418947982137
    weight_decay = 7.040822706204121e-05
    dropout = 0.18404592540409914
    clip = 4389.748805208904

# モデルのインスタンス作成
if model_name == 'sru':
    model = SRU(input_size, phi_size, r_size, cell_out_size, output_size, dropout=dropout, gpu=gpu)
    model.initWeight()
elif model_name == 'gru':
    model = GRU(input_size, hidden_size, output_size, num_layers, dropout, gpu=gpu)
    model.initWeight(init_forget_bias)
elif model_name == 'lstm':
    model = LSTM(input_size, hidden_size, output_size, num_layers, dropout, gpu=gpu)
    model.initWeight(init_forget_bias)
if gpu == True:
    model.cuda()

# loss, optimizerの定義
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=lr, weight_decay=weight_decay)


''' 訓練 '''

n_epochs = 400
n_batches = train_X.shape[0]//batch_size
n_batches_test = test_X.shape[0]//batch_size
all_acc = []
Пример #23
0
class SupervisedTest:
    def __init__(self, window_size=3) -> None:
        self.window_size = window_size

        self.dataset = SupervisedDataset(mode='test',
                                         window_size=self.window_size,
                                         log_reg=False)
        self.loader = DataLoader(self.dataset, batch_size=64, shuffle=False)

        self.checkpoint_path = "./model_params/val/blstm_bs64_lr1e-3_ws40_hs128_nl2_dout50/val_lstm_epoch91_acc81.9593.pth"
        #self.checkpoint_path = "./model_params/logistic_regression/val/val_logreg_epoch100_acc35.8229.pth"
        self.checkpoint = torch.load(self.checkpoint_path)

        self.model = LSTM(input_size=78,
                          hidden_size=128,
                          num_classes=170,
                          n_layers=2).to(device=torch.device('cuda:0'))
        #self.model = LogisticRegression(num_keypoints=78, num_features=2, num_classes=170).to(device=torch.device('cuda:0'))
        self.model.load_state_dict(self.checkpoint, strict=True)
        self.model.eval()

        #self.criterion = nn.BCEWithLogitsLoss()     # Use this for Logistic Regression training
        self.criterion = nn.BCELoss(
        )  # Use this for LSTM training (with Softmax)

        #self.writer_text = SummaryWriter('./Tensorboard/test_text/')
        #self.writer_avg_test_loss = SummaryWriter('./Tensorboard/test_loss/')
        #self.writer_hparams = SummaryWriter('./Tensorboard/test_hparams/')

    def _start_batch_test(self) -> None:
        current_iter = 0
        running_loss = 0.0
        average_loss = 0.0

        num_data = 0

        running_correct_preds = 0
        running_correct_classwise_preds = [0] * 170
        running_false_classwise_preds = [0] * 170
        running_all_classwise_gt_labels = [0] * 170

        with torch.no_grad():
            for batch_window, batch_label in self.loader:
                current_iter += 1

                outs = self.model(batch_window)

                loss = self.criterion(outs, batch_label)

                running_loss += loss.item()
                average_loss = running_loss / current_iter

                pred_confidence, pred_index = torch.max(outs, dim=1)
                gt_confidence, gt_index = torch.max(batch_label, dim=1)

                #batch_correct_preds = torch.eq(pred_index, gt_index).long().sum().item()
                #batch_accuracy = (batch_correct_preds / batch_window.shape[0]) * 100

                num_data += batch_window.shape[0]

                batch_accuracy, batch_correct_preds, classwise_correct_preds, classwise_false_preds, classwise_gt_labels = self._calculate_batch_accuracy(
                    outs, batch_label)
                running_correct_preds += batch_correct_preds
                running_correct_classwise_preds = self._add_lists_elementwise(
                    running_correct_classwise_preds, classwise_correct_preds)
                running_false_classwise_preds = self._add_lists_elementwise(
                    running_false_classwise_preds, classwise_false_preds)
                running_all_classwise_gt_labels = self._add_lists_elementwise(
                    running_all_classwise_gt_labels, classwise_gt_labels)

                if current_iter % 1 == 0:
                    print(
                        f"\nITER#{current_iter} BATCH TEST ACCURACY: {batch_accuracy:.4f}, RUNNING TEST LOSS: {loss.item():.8f}"
                    )
                    print(f"Predicted / GT index:\n{pred_index}\n{gt_index}\n")

            #epoch_accuracy = (running_correct_preds / num_data) * 100
            epoch_accuracy, classwise_accuracy = self._calculate_epoch_accuracy(
                running_correct_preds, running_correct_classwise_preds,
                running_all_classwise_gt_labels, num_data)
            print(
                f"\n\nTEST WINDOW-WISE ACCURACY: {epoch_accuracy:.4f}, AVERAGE TEST LOSS: {average_loss:.8f}\n\n"
            )

            correct_vid = 0
            false_vid = 0
            for i in range(len(running_correct_classwise_preds)):
                print(
                    f"Person{i:03d} | Number of correct/all predictions: {running_correct_classwise_preds[i]:<3d}/{running_all_classwise_gt_labels[i]:<5d} | Accuracy: {classwise_accuracy[i]:.2f}%"
                )
                if (running_correct_classwise_preds[i] +
                        running_false_classwise_preds[i]) != 0:
                    if classwise_accuracy[i] >= 50:
                        correct_vid += 1
                    else:
                        false_vid += 1

            videowise_accuracy = (correct_vid /
                                  (correct_vid + false_vid)) * 100
            print(
                f"\n\nTEST VIDEO-WISE ACCURACY: {videowise_accuracy:.4f}%\n\n")

    def start(self, mode="batch") -> None:
        if mode == "batch":
            self._start_batch_test()

    def _calculate_batch_accuracy(self, predictions, annotations):

        pred_confidence, pred_index = torch.max(predictions, dim=1)
        gt_confidence, gt_index = torch.max(annotations, dim=1)

        person1 = 1
        if gt_index[0] == 0:
            person1 += gt_index.shape[0]

        batch_correct_preds = torch.eq(pred_index,
                                       gt_index).long().sum().item()

        batch_accuracy = (batch_correct_preds / predictions.shape[0]) * 100

        # Calculating number of classwise correct/false predictions
        classwise_correct_preds = torch.zeros(170).long()
        classwise_false_preds = torch.zeros(170).long()
        classwise_gt_labels = torch.zeros(170).long()

        correct_preds_class = pred_index[torch.eq(pred_index, gt_index)].long()
        false_preds_class = pred_index[torch.ne(pred_index, gt_index)].long()

        for element in correct_preds_class:
            classwise_correct_preds[element] += 1

        for element in false_preds_class:
            classwise_false_preds[element] += 1

        for element in gt_index:
            classwise_gt_labels[element] += 1

        classwise_correct_preds = classwise_correct_preds.tolist()
        classwise_false_preds = classwise_false_preds.tolist()

        return batch_accuracy, batch_correct_preds, classwise_correct_preds, classwise_false_preds, classwise_gt_labels

    def _add_lists_elementwise(self, list1, list2):
        array1 = np.array(list1)
        array2 = np.array(list2)

        sum_list = (array1 + array2).tolist()

        return sum_list

    def _calculate_epoch_accuracy(self, running_correct_preds,
                                  running_correct_classwise_preds,
                                  running_all_classwise_gt_labels, num_data):
        epoch_accuracy = (running_correct_preds / num_data) * 100

        classwise_accuracy = [
            0
        ] * 170  #(((np.array(running_correct_classwise_preds) / (running_correct_classwise_preds + running_false_classwise_preds))) * 100).tolist()
        for i in range(len(running_correct_classwise_preds)):
            if (running_all_classwise_gt_labels[i]) == 0:
                classwise_accuracy[i] = 0
            else:
                classwise_accuracy[i] = (
                    running_correct_classwise_preds[i] /
                    running_all_classwise_gt_labels[i]) * 100

        return epoch_accuracy, classwise_accuracy
Пример #24
0
                   shuffle = True, random_seed = random_seed)

    inputs, labels = next(iter(train_dataloader))
    [batch_size, type_size, step_size, fea_size] = inputs.size()

    importlib.reload(utils)
    from utils import TrainModel, TestModel

    # LSTM
    importlib.reload(models)
    from models import LSTM
    importlib.reload(utils)
    from utils import TrainModel, TestModel
    model_name = 'LSTM'
    print(model_name)
    model = LSTM(A.shape[0])
    model, train_result = TrainModel(model,
                                     train_dataloader,
                                     valid_dataloader,
                                     learning_rate=learning_rate,
                                     patience=5)
    test_result = TestModel(model, test_dataloader, max_speed)
    StoreData(result_dict, model_name, train_result, test_result, directory,
              model, random_seed, save_model)

    # LSTM-I
    importlib.reload(models)
    from models import LSTM
    importlib.reload(utils)
    from utils import TrainModel, TestModel
    model_name = 'LSTMI'
Пример #25
0
def main():
    torch.manual_seed(42)

    # Random
    #params = {'batch_size': 32, 'dropout': 0, 'hidden_dim': 128, 'learning_rate': 0.01, 'num_epochs': 5, 'num_layers': 2, 'oversample': False, 'soft_labels': False}
    # Glove
    params = {
        'batch_size': 32,
        'dropout': 0,
        'hidden_dim': 128,
        'learning_rate': 0.001,
        'num_epochs': 5,
        'num_layers': 2,
        'oversample': False,
        'soft_labels': False
    }
    # Random
    #params = {'batch_size': 32, 'dropout': 0, 'hidden_dim': 256, 'learning_rate': 0.0001, 'num_epochs': 5, 'num_layers': 3, 'oversample': False, 'soft_labels': False}

    #some params
    experiment_number = 1
    test_percentage = 0.1
    val_percentage = 0.2
    batch_size = params["batch_size"]
    num_epochs = 5  #params["num_epochs"]
    dropout = params["dropout"]
    embedding_dim = 300
    model_name = "CNN"  #'Bert' #"CNN" #"LSTM"
    unsupervised = True
    embedding = "Glove"  #"Random" ##"Glove" # "Both" #
    soft_labels = False
    combine = embedding == "Both"

    # LSTM parameters
    if model_name == "LSTM":
        hidden_dim = params["hidden_dim"]
        num_layers = params["num_layers"]

    # Bert parameter
    num_warmup_steps = 100
    num_total_steps = 1000
    if model_name == "Bert":
        embedding = "None"
    if embedding == "Both":
        combine = True
        embedding = "Random"
    else:
        combine = False
    learning_rate = params["learning_rate"]  #5e-5, 3e-5, 2e-5
    oversample_bool = False
    weighted_loss = True
    # load data
    dataset = Dataset("../data/cleaned_tweets_orig.csv",
                      use_embedding=embedding,
                      embedd_dim=embedding_dim,
                      combine=combine,
                      for_bert=(model_name == "Bert"))

    #dataset.oversample()
    train_data, val_test_data = split_dataset(dataset,
                                              test_percentage + val_percentage)
    val_data, test_data = split_dataset(
        val_test_data, test_percentage / (test_percentage + val_percentage))

    # print(len(train_data))
    #save_data(train_data, 'train')
    #save_data(test_data, 'test')

    #define loaders
    if oversample_bool:
        weights, targets = get_loss_weights(train_data, return_targets=True)
        class_sample_count = [
            1024 / 20, 13426, 2898 / 2
        ]  # dataset has 10 class-1 samples, 1 class-2 samples, etc.
        oversample_weights = 1 / torch.Tensor(class_sample_count)
        oversample_weights = oversample_weights[targets]
        # oversample_weights = torch.tensor([0.9414, 0.2242, 0.8344]) #torch.ones((3))-
        sampler = torch.utils.data.sampler.WeightedRandomSampler(
            oversample_weights, len(oversample_weights))
        train_loader = torch.utils.data.DataLoader(train_data,
                                                   batch_size=batch_size,
                                                   collate_fn=my_collate,
                                                   sampler=sampler)
    else:
        train_loader = torch.utils.data.DataLoader(train_data,
                                                   batch_size=batch_size,
                                                   collate_fn=my_collate)
    val_loader = torch.utils.data.DataLoader(val_data,
                                             batch_size=batch_size,
                                             collate_fn=my_collate)

    #define model
    if model_name == "CNN":
        vocab_size = len(dataset.vocab)
        model = CNN(vocab_size, embedding_dim, combine=combine)
    elif model_name == "LSTM":
        vocab_size = len(dataset.vocab)
        model = LSTM(vocab_size,
                     embedding_dim,
                     batch_size=batch_size,
                     hidden_dim=hidden_dim,
                     lstm_num_layers=num_layers,
                     combine=combine,
                     dropout=dropout)

    elif model_name == "Bert":
        model = BertForSequenceClassification.from_pretrained(
            "bert-base-uncased", num_labels=3)
        train_loader = torch.utils.data.DataLoader(train_data,
                                                   batch_size=batch_size,
                                                   collate_fn=bert_collate)
        val_loader = torch.utils.data.DataLoader(val_data,
                                                 batch_size=batch_size,
                                                 collate_fn=bert_collate)

    #device
    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    #LOSS : weighted cross entropy loss, by class counts of other classess
    if weighted_loss:
        weights = torch.tensor([0.9414, 0.2242, 0.8344], device=device)
    else:
        weights = torch.ones(3, device=device)
    #weights = torch.tensor([1.0, 1.0, 1.0], device = device) #get_loss_weights(train_data).to(device) # not to run again
    criterion = nn.CrossEntropyLoss(weight=weights)
    if soft_labels:
        criterion = weighted_soft_cross_entropy
    #latent model
    if unsupervised:
        vocab_size = len(dataset.vocab)
        criterion = nn.CrossEntropyLoss(weight=weights, reduction='none')
        model = Rationalisation_model(vocab_size,
                                      embedding_dim=embedding_dim,
                                      model=model_name,
                                      batch_size=batch_size,
                                      combine=combine,
                                      criterion=criterion)

    if not model_name == "Bert":
        model.embedding.weight.data.copy_(dataset.vocab.vectors)
        if combine:
            model.embedding_glove.weight.data.copy_(dataset.glove.vectors)

    #model to device
    model.to(device)

    #optimiser
    optimizer = optim.Adam(model.parameters(), lr=learning_rate)

    if model_name == "Bert":
        optimizer = AdamW(model.parameters(),
                          lr=learning_rate,
                          correct_bias=False)
        # Linear scheduler for adaptive lr
        scheduler = WarmupLinearSchedule(optimizer,
                                         warmup_steps=num_warmup_steps,
                                         t_total=num_total_steps)
    else:
        scheduler = None

    plot_log = defaultdict(list)
    for epoch in range(num_epochs):
        #train and validate
        epoch_loss, epoch_acc = train_epoch(model,
                                            train_loader,
                                            optimizer,
                                            criterion,
                                            device,
                                            soft_labels=soft_labels,
                                            weights=weights,
                                            scheduler=scheduler,
                                            unsupervised=unsupervised)
        val_loss, val_acc = evaluate_epoch(model,
                                           val_loader,
                                           criterion,
                                           device,
                                           soft_labels=soft_labels,
                                           weights=weights,
                                           unsupervised=unsupervised)
        #save for plotting
        for name, point in zip(
            ["train_loss", "train_accuracy", "val_loss", "val_accuracy"],
            [epoch_loss, epoch_acc, val_loss, val_acc]):
            plot_log[f'{name}'] = point
        #realtime feel
        print(f'Epoch: {epoch+1}')
        print(
            f'\tTrain Loss: {epoch_loss:.5f} | Train Acc: {epoch_acc*100:.2f}%'
        )
        print(f'\t Val. Loss: {val_loss:.5f} |  Val. Acc: {val_acc*100:.2f}%')
    sample_sentences_and_z(model, train_loader, device, dataset.vocab)
    #save plot
    results_directory = f'plots/{experiment_number}'
    os.makedirs(results_directory, exist_ok=True)
    for name, data in plot_log.items():
        save_plot(data, name, results_directory)
    #save model
    torch.save(model, os.path.join(results_directory, 'model_cnn.pth'))
    #confusion matrix and all that fun
    loss, acc, predictions, ground_truth = evaluate_epoch(
        model,
        val_loader,
        criterion,
        device,
        is_final=True,
        soft_labels=soft_labels,
        weights=weights,
        unsupervised=unsupervised)
    conf_matrix = confusion_matrix(ground_truth, predictions)
    class_report = classification_report(ground_truth, predictions)
    print('\nFinal Loss and Accuracy\n----------------\n')
    print(f'\t Val. Loss: {loss:.5f} |  Val. Acc: {acc*100:.2f}%')
    print('\nCONFUSION MATRIX\n----------------\n')
    print(conf_matrix)
    print('\nCLASSSIFICATION REPORT\n----------------------\n')
    print(class_report)

    plot_confusion_matrix(ground_truth,
                          predictions,
                          classes=["Hate speech", "Offensive", "Neither"],
                          normalize=False,
                          title='Confusion matrix')
    plt.show()
Пример #26
0
for audio, lbl in train_ds:
    train_ct += 1

val_ct = 0
for audio, lbl in val_ds:
    val_ct += 1

test_ct = 0
for audio, lbl in test_ds:
    test_ct += 1

train_ds.repeat(None)
val_ds.repeat(None)
test_ds.repeat(None)

model = LSTM()
model.compile(optimizer="adam",
              loss="categorical_crossentropy",
              metrics=["accuracy"])

cp_path = "training_2/cp-{epoch:04d}.h5py"
cp_dir = os.path.dirname(cp_path)

# Create a callback that saves the model's weights
cp_callback = tf.keras.callbacks.ModelCheckpoint(filepath=cp_path,
                                                 verbose=1,
                                                 save_weights_only=True,
                                                 period=1)
log_dir = "./runs"
tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir)
Пример #27
0
            outputs=critic_model.get_layer('q_outputs').output)

        ones = np.ones(shape=(len(test_seg), num_actions))
        pred = predict(actor_q_model, (input_validation, ones))
        print('On validate data: ')
        metrics(y_test, pred)

        ones_tr = np.ones(shape=(len(train_seg), num_actions))
        pred_tr = predict(actor_q_model, (input_train, ones_tr))
        print('On train data: ')
        metrics(y_train, pred_tr)

    elif MODEL == 'LSTM':

        class_nums = 2
        lstm = LSTM(class_nums, embeddings_matrix, maxlen=maxlen)
        _ = lstm(inputs=inputs)
        adam = tf.keras.optimizers.Adam(lr=0.001,
                                        beta_1=0.9,
                                        beta_2=0.999,
                                        epsilon=1e-08)
        rmsprop = tf.keras.optimizers.RMSprop(lr=0.001, rho=0.9, epsilon=1e-06)
        lstm.compile(loss='categorical_crossentropy', optimizer=adam)
        if MODE == 'train':
            lstm.fit(input_train,
                     tr_one_hot,
                     batch_size=32,
                     epochs=20,
                     verbose=1,
                     shuffle=True)
Пример #28
0
def main(args):
    with open(args.config, 'r') as f:
        config = json.load(f)

    if config['optimizer'] == 'SGD':
        optimizer = SGD(lr=config['learning_rate'],
                        decay=config['learning_rate'] / config['epochs'],
                        momentum=config['momentum'])
    else:
        raise Exception('Unsupported optimizer: {}.'.format(
            config['optimizer']))

    model_name = str.lower(config['model'])
    if model_name == 'lstm':
        model = LSTM(config['input_length'], 2)
    elif model_name == 'conv1d':
        model = Conv1D(config['input_length'], 2)
    elif model_name == 'conv2d':
        model = Conv2D(config['input_length'], 2)
    else:
        raise Exception('Unsupported model: {}.'.format(config['model']))

    model.compile(loss='binary_crossentropy',
                  optimizer=optimizer,
                  metrics=['accuracy'])

    wav_paths = glob('{}/**'.format(args.data_dir), recursive=True)
    wav_paths = [x for x in wav_paths if '.wav' in x]
    classes = sorted(os.listdir(args.data_dir))
    le = LabelEncoder()
    le.fit(classes)
    labels = [get_class(x, args.data_dir) for x in wav_paths]
    labels = le.transform(labels)

    print('CLASSES: ', list(le.classes_))
    print(le.transform(list(le.classes_)))

    wav_train, wav_val, label_train, label_val = train_test_split(
        wav_paths,
        labels,
        test_size=config['validation_split'],
        random_state=0)
    tg = DataGenerator(wav_train,
                       label_train,
                       config['input_length'],
                       len(set(label_train)),
                       batch_size=config['batch_size'])
    vg = DataGenerator(wav_val,
                       label_val,
                       config['input_length'],
                       len(set(label_val)),
                       batch_size=config['batch_size'])

    output_sub_dir = os.path.join(args.output_dir, model_name,
                                  datetime.now().strftime('%Y%m%d_%H%M%S'))
    os.makedirs(output_sub_dir)

    callbacks = [
        EarlyStopping(monitor='val_loss',
                      patience=config['patience'],
                      restore_best_weights=True,
                      verbose=1),
        ModelCheckpoint(filepath=os.path.join(
            output_sub_dir, 'model.{epoch:02d}-{val_loss:.4f}.h5'),
                        monitor='val_loss',
                        save_best_only=True,
                        verbose=1),
        CSVLogger(os.path.join(output_sub_dir, 'epochs.csv'))
    ]

    model.fit(tg,
              validation_data=vg,
              epochs=config['epochs'],
              verbose=1,
              callbacks=callbacks)
Пример #29
0
def main():
    #print the config args
    print(config.transfer_learning)
    print(config.mode)
    print(config.input_size)

    # Fix Seed for Reproducibility #
    random.seed(config.seed)
    np.random.seed(config.seed)
    torch.manual_seed(config.seed)
    if torch.cuda.is_available():
        torch.cuda.manual_seed(config.seed)

    # Samples, Weights, and Plots Path #
    paths = [config.weights_path, config.plots_path, config.numpy_path]
    for path in paths:
        make_dirs(path)

    # Prepare Data #
    data = load_data(config.combined_path, config.which_data, config.preprocess, config.resample)
    # id = config.which_data.split('_')[0]
    id = 12 #BOON added
    print("Data of {} is successfully Loaded!".format(config.which_data))
    print(type(data))
    print(data.shape)

    # Plot Time-series Data #
    if config.plot:
        plot_full(config.plots_path, data, id, config.feature)
        plot_split(config.plots_path, data, id, config.valid_start, config.test_start, config.feature)

    # Min-Max Scaler #
    scaler = MinMaxScaler()
    data.iloc[:,:] = scaler.fit_transform(data)
    print(type(data))

    # Split the Dataset #
    train_X, train_Y, val_X, val_Y, test_X, test_Y, test_shifted = \
        get_time_series_data_(data, config.valid_start, config.test_start, config.feature, config.label, config.window)

    print(train_X.shape)
    print(train_Y.shape)

    # Get Data Loader #
    train_loader, val_loader, test_loader = \
        get_data_loader(train_X, train_Y, val_X, val_Y, test_X, test_Y, config.batch_size)

    # Constants #
    best_val_loss = 100
    best_val_improv = 0

    # Lists #
    train_losses, val_losses = list(), list()
    val_maes, val_mses, val_rmses, val_mapes, val_mpes, val_r2s = list(), list(), list(), list(), list(), list()

    # Prepare Network #
    if config.network == 'dnn':
        model = DNN(config.window, config.hidden_size, config.output_size).to(device)
    elif config.network == 'cnn':
        model = CNN(config.window, config.hidden_size, config.output_size).to(device)
    elif config.network == 'rnn':
        model = RNN(config.input_size, config.hidden_size, config.num_layers, config.output_size).to(device)
    elif config.network == 'lstm':
        model = LSTM(config.input_size, config.hidden_size, config.num_layers, config.output_size, config.bidirectional).to(device)
    elif config.network == 'gru':
        model = GRU(config.input_size, config.hidden_size, config.num_layers, config.output_size).to(device)
    elif config.network == 'recursive':
        model = RecursiveLSTM(config.input_size, config.hidden_size, config.num_layers, config.output_size).to(device)
    elif config.network == 'attentional':
        model = AttentionalLSTM(config.input_size, config.key, config.query, config.value, config.hidden_size, config.num_layers, config.output_size, config.bidirectional).to(device)
    else:
        raise NotImplementedError

    if config.mode == 'train':

        # If fine-tuning #
        print('config.TL = {}'.format(config.transfer_learning))
        if config.transfer_learning:
            print('config.TL = {}'.format(config.transfer_learning))
            print('TL: True')
            model.load_state_dict(torch.load(os.path.join(config.weights_path, 'BEST_{}_Device_ID_12.pkl'.format(config.network))))

            for param in model.parameters():
                param.requires_grad = True

        # Loss Function #
        criterion = torch.nn.MSELoss()

        # Optimizer #
        optimizer = torch.optim.Adam(model.parameters(), lr=config.lr, betas=(0.5, 0.999))
        optimizer_scheduler = get_lr_scheduler(config.lr_scheduler, optimizer, config)

        # Train and Validation #
        print("Training {} started with total epoch of {} using Driver ID of {}.".format(config.network, config.num_epochs, id))
        for epoch in range(config.num_epochs):

            # Train #
            for i, (data, label) in enumerate(train_loader):

                # Data Preparation #
                data = data.to(device, dtype=torch.float32)
                label = label.to(device, dtype=torch.float32)

                # Forward Data #
                pred = model(data)

                # Calculate Loss #
                train_loss = criterion(pred, label)

                # Back Propagation and Update #
                optimizer.zero_grad()
                train_loss.backward()
                optimizer.step()

                # Add items to Lists #
                train_losses.append(train_loss.item())

            print("Epoch [{}/{}]".format(epoch+1, config.num_epochs))
            print("Train")
            print("Loss : {:.4f}".format(np.average(train_losses)))

            optimizer_scheduler.step()

            # Validation #
            with torch.no_grad():
                for i, (data, label) in enumerate(val_loader):

                    # Data Preparation #
                    data = data.to(device, dtype=torch.float32)
                    label = label.to(device, dtype=torch.float32)

                    # Forward Data #
                    pred_val = model(data)

                    # Calculate Loss #
                    val_loss = criterion(pred_val, label)
                    val_mae = mean_absolute_error(label.cpu(), pred_val.cpu())
                    val_mse = mean_squared_error(label.cpu(), pred_val.cpu(), squared=True)
                    val_rmse = mean_squared_error(label.cpu(), pred_val.cpu(), squared=False)
                    val_mpe = mean_percentage_error(label.cpu(), pred_val.cpu())
                    val_mape = mean_absolute_percentage_error(label.cpu(), pred_val.cpu())
                    val_r2 = r2_score(label.cpu(), pred_val.cpu())

                    # Add item to Lists #
                    val_losses.append(val_loss.item())
                    val_maes.append(val_mae.item())
                    val_mses.append(val_mse.item())
                    val_rmses.append(val_rmse.item())
                    val_mpes.append(val_mpe.item())
                    val_mapes.append(val_mape.item())
                    val_r2s.append(val_r2.item())

                # Print Statistics #
                print("Validation")
                print("Loss : {:.4f}".format(np.average(val_losses)))
                print(" MAE : {:.4f}".format(np.average(val_maes)))
                print(" MSE : {:.4f}".format(np.average(val_mses)))
                print("RMSE : {:.4f}".format(np.average(val_rmses)))
                print(" MPE : {:.4f}".format(np.average(val_mpes)))
                print("MAPE : {:.4f}".format(np.average(val_mapes)))
                print(" R^2 : {:.4f}".format(np.average(val_r2s)))

                # Save the model only if validation loss decreased #
                curr_val_loss = np.average(val_losses)

                if curr_val_loss < best_val_loss:
                    best_val_loss = min(curr_val_loss, best_val_loss)

                    # if config.transfer_learning:
                    #     torch.save(model.state_dict(), os.path.join(config.weights_path, 'BEST_{}_Device_ID_{}_transfer.pkl'.format(config.network, id)))
                    # else:
                    #     torch.save(model.state_dict(), os.path.join(config.weights_path, 'BEST_{}_Device_ID_{}.pkl'.format(config.network, id)))

                    if config.transfer_learning:
                        torch.save(model.state_dict(), os.path.join(config.weights_path, 'BEST_{}_Device_ID_{}_transfer_BOON_reshaped.pkl'.format(config.network, id)))
                    else:
                        torch.save(model.state_dict(), os.path.join(config.weights_path, 'BEST_{}_Device_ID_{}_BOON_reshaped.pkl'.format(config.network, id)))

                    print("Best model is saved!\n")
                    best_val_improv = 0

                elif curr_val_loss >= best_val_loss:
                    best_val_improv += 1
                    print("Best Validation has not improved for {} epochs.\n".format(best_val_improv))

                    if best_val_improv == 10:
                        break

    elif config.mode == 'test':

        # Prepare Network #
        if config.transfer_learning:
            model.load_state_dict(torch.load(os.path.join(config.weights_path, 'BEST_{}_Device_ID_{}_transfer_BOON_reshaped.pkl'.format(config.network, id))))
        else:
            model.load_state_dict(torch.load(os.path.join(config.weights_path, 'BEST_{}_Device_ID_{}_BOON_reshaped.pkl'.format(config.network, id))))

        print("{} for Device ID {} is successfully loaded!".format((config.network).upper(), id))

        with torch.no_grad():

            pred_test, labels = list(), list()

            for i, (data, label) in enumerate(test_loader):

                # Data Preparation #
                data = data.to(device, dtype=torch.float32)
                label = label.to(device, dtype=torch.float32)

                # Forward Data #
                pred = model(data)

                # Add items to Lists #
                pred_test += pred
                labels += label

            # Derive Metric and Plot #
            if config.transfer_learning:
                pred, actual = test(config.plots_path, id, config.network, scaler, pred_test, labels, test_shifted, transfer_learning=True)
            else:
                pred, actual = test(config.plots_path, id, config.network, scaler, pred_test, labels, test_shifted)
Пример #30
0
 def __init__(self, Data, lstm_neurons, epochs, dense_neurons=3):
     self.lstm = LSTM(Data, lstm_neurons, epochs)
     self.lstm.fit_model(False)
     self.PredStates()
     print(self.unperturbed.shape)