|
- import os
- import random
- import argparse
- import numpy as np
- import datetime
-
- from sklearn.preprocessing import MinMaxScaler
-
- import torch
- from torch.utils.data import TensorDataset, DataLoader
-
- from models import DNN, RNN, LSTM, GRU, AttentionalLSTM, CNN
- from utils import make_dirs, load_data, plot_full, data_loader, split_sequence_uni_step, split_sequence_multi_step
- from utils import get_lr_scheduler, mean_percentage_error, mean_absolute_percentage_error, plot_pred_test
- from utils import split_sequence
-
-
- # Reproducibility #
- torch.backends.cudnn.deterministic = True
- torch.backends.cudnn.benchmark = False
-
- # Device Configuration #
- device = 'cuda' if torch.cuda.is_available() else 'cpu'
-
-
- def main(args):
-
- # Fix Seed #
- random.seed(args.seed)
- np.random.seed(args.seed)
- torch.manual_seed(args.seed)
- torch.cuda.manual_seed(args.seed)
-
- # Weights and Plots Path #
- paths = [args.weights_path, args.plots_path, args.numpy_path]
- for path in paths:
- make_dirs(path)
-
- # Prepare Data #
- data = load_data(args.which_data)
- data = np.array(data)
-
- scaler = MinMaxScaler()
- data[0:, 0: -1] = scaler.fit_transform(data[0:, 0: -1])
-
- # Split the Dataset #
- copied_data = data.copy()
-
- if args.multi_step:
- X, y = split_sequence_multi_step(
- copied_data, args.seq_length, args.output_size)
- step = 'MultiStep'
- else:
- # X, y = split_sequence_uni_step(copied_data, args.seq_length)
- # step = 'SingleStep'
- X, y = split_sequence(copied_data)
- step = 'SingleStep'
-
- # Convert to Tensor #
- test_set = TensorDataset(torch.from_numpy(X), torch.from_numpy(y))
-
- # Data Loader #
- test_loader = DataLoader(test_set, batch_size=args.batch_size, shuffle=False)
-
- # Lists #
- pred_tests, labels = list(), list()
-
- # Prepare Network #
- if args.model == 'dnn':
- model = DNN(args.seq_length, args.hidden_size,
- args.output_size).to(device)
- elif args.model == 'cnn':
- model = CNN(args.seq_length, args.batch_size,
- args.output_size).to(device)
- elif args.model == 'rnn':
- model = RNN(args.input_size, args.hidden_size,
- args.num_layers, args.output_size).to(device)
- elif args.model == 'lstm':
- model = LSTM(args.input_size, args.hidden_size, args.num_layers,
- args.output_size, args.bidirectional).to(device)
- elif args.model == 'gru':
- model = GRU(args.input_size, args.hidden_size,
- args.num_layers, args.output_size).to(device)
- elif args.model == 'attentional':
- model = AttentionalLSTM(args.input_size, args.qkv, args.hidden_size,
- args.num_layers, args.output_size, args.bidirectional).to(device)
- else:
- raise NotImplementedError
-
- # Loss Function #
- criterion = torch.nn.MSELoss()
-
- # Optimizer #
- optim = torch.optim.Adam(
- model.parameters(), lr=args.lr, betas=(0.5, 0.999))
- optim_scheduler = get_lr_scheduler(args.lr_scheduler, optim)
-
- # Load the Model Weight #
- model.load_state_dict(torch.load(os.path.join(
- args.weights_path, 'BEST_{}_using_{}.pkl'.format(model.__class__.__name__, step))))
-
- # Test #
- with torch.no_grad():
- for i, (data, label) in enumerate(test_loader):
-
- # Prepare Data #
- data = data.to(device, dtype=torch.float32)
- label = label.to(device, dtype=torch.float32)
-
- # Forward Data #
- pred_test = model(data)
-
- # Convert to Original Value Range #
- pred_test, label = pred_test.detach().cpu().numpy(), label.detach().cpu().numpy()
-
- if args.multi_step:
- pred_test = np.mean(pred_test, axis=1)
- label = np.mean(label, axis=1)
-
- pred_tests += pred_test.tolist()
- labels += label.tolist()
-
- # Set threshold, organize labels
- for i in range(len(pred_tests)):
- for j in range(len(pred_tests[i])):
- if pred_tests[i][j] >= args.threshold:
- pred_tests[i][j] = 1.0
- else:
- pred_tests[i][j] = 0.0
-
- # Plot Figure #
- plot_pred_test(pred_tests[:args.time_plot], labels[:args.time_plot],
- args.plots_path, args.feature, model, step)
-
- print("[INFO]", str(datetime.datetime.now()), "inference", args.which_data, "done!")
- print("[INFO]", str(datetime.datetime.now()), "True label:", labels)
- print("[INFO]", str(datetime.datetime.now()), "Pred label:", pred_tests)
-
-
-
- if __name__ == "__main__":
- parser = argparse.ArgumentParser(" Univariate-Time-Series-Prediction-using-Deep-Learning")
-
- parser.add_argument('--seed', type=int, default=7777,
- help='seed for reproducibility')
- parser.add_argument('--feature', type=str, default='label',
- help='extract which feature for prediction')
- parser.add_argument('--threshold', type=float,
- default=0.5, help='threshold for label, contain threshold')
- parser.add_argument('--multi_step', type=bool,
- default=False, help='multi-step or not')
- parser.add_argument('--seq_length', type=int,
- default=1, help='window size')
- parser.add_argument('--batch_size', type=int,
- default=1, help='mini-batch size')
-
- parser.add_argument('--plot_full', type=bool,
- default=False, help='plot full graph or not')
- parser.add_argument('--mode', type=str, default='inference',
- choices=['train', 'test', 'inference'])
-
- parser.add_argument('--model', type=str, default='lstm',
- choices=['dnn', 'cnn', 'rnn', 'lstm', 'gru', 'attentional'])
- parser.add_argument('--input_size', type=int, default=1, help='input_size')
- parser.add_argument('--hidden_size', type=int,
- default=10, help='hidden_size')
- parser.add_argument('--num_layers', type=int, default=1, help='num_layers')
- parser.add_argument('--output_size', type=int,
- default=1, help='output_size')
- parser.add_argument('--bidirectional', type=bool,
- default=False, help='use bidirectional or not')
- parser.add_argument('--qkv', type=int, default=5,
- help='dimension for query, key and value')
-
- parser.add_argument('--which_data', type=str,
- default='./data/test.csv', help='which data to use')
- parser.add_argument('--weights_path', type=str,
- default='./results/weights/', help='weights path')
- parser.add_argument('--plots_path', type=str,
- default='./results/plots/', help='plots path')
- parser.add_argument('--numpy_path', type=str,
- default='./results/numpy/', help='numpy path')
-
- parser.add_argument('--train_split', type=float,
- default=0.8, help='train_split')
- parser.add_argument('--test_split', type=float,
- default=0.5, help='test_split')
-
- parser.add_argument('--time_plot', type=int, default=100,
- help='time stamp for plotting')
- parser.add_argument('--num_epochs', type=int,
- default=500, help='total epoch')
- parser.add_argument('--print_every', type=int, default=10,
- help='print statistics for every default epoch')
-
- parser.add_argument('--lr', type=float, default=1e-3, help='learning rate')
- parser.add_argument('--lr_scheduler', type=str, default='cosine',
- help='learning rate scheduler', choices=['step', 'plateau', 'cosine'])
-
- config = parser.parse_args()
-
- torch.cuda.empty_cache()
- main(config)
|