aiops/ContraAD/main.py (121 lines of code) (raw):
import os
import argparse
import numpy as np
from torch.backends import cudnn
from utils.utils import *
from solver import Solver
import time
import warnings
import random
warnings.filterwarnings("ignore")
import sys
def setup_seed(seed):
torch.manual_seed(seed)
torch.cuda.manual_seed_all(seed)
np.random.seed(seed)
random.seed(seed)
class Logger(object):
def __init__(self, filename="default.log", add_flag=True, stream=sys.stdout):
self.terminal = stream
self.filename = filename
self.add_flag = add_flag
def write(self, message):
if self.add_flag:
with open(self.filename, "a+") as log:
self.terminal.write(message)
log.write(message)
else:
with open(self.filename, "w") as log:
self.terminal.write(message)
log.write(message)
def flush(self):
pass
def str2bool(v):
return v.lower() in ("true")
def find_nearest(array, value):
array = np.asarray(array)
idx = (np.abs(array - value)).argmin()
return int(array[idx - 1])
def main(config):
cudnn.benchmark = True
if not os.path.exists(config.model_save_path):
mkdir(config.model_save_path)
if not os.path.exists(config.model_save_path+f"/{config.dataset}"):
mkdir(config.model_save_path+f"/{config.dataset}")
config.model_save_path = f"{config.model_save_path}/{config.dataset}"
config.model_save_path = f"{config.model_save_path}/{config.dataset}"
solver = Solver(vars(config))
if config.mode == "train":
solver.train()
elif config.mode == "test":
solver.test()
return solver
if __name__ == "__main__":
parser = argparse.ArgumentParser()
# Alternative
parser.add_argument("--win_size", type=int, default=100)
parser.add_argument("--patch_size", type=list, default=[5])
parser.add_argument("--lr", type=float, default=1e-4)
parser.add_argument("--loss_fuc", type=str, default="MSE")
parser.add_argument("--n_heads", type=int, default=1)
parser.add_argument("--e_layers", type=int, default=3)
parser.add_argument("--d_model", type=int, default=256)
parser.add_argument("--rec_timeseries", action="store_true", default=True)
parser.add_argument("--use_gpu", type=bool, default=True, help="use gpu")
parser.add_argument("--gpu", type=int, default=0, help="gpu")
parser.add_argument(
"--use_multi_gpu", action="store_true", help="use multiple gpus", default=False
)
parser.add_argument(
"--devices", type=str, default="1", help="device ids of multile gpus"
)
# Default
parser.add_argument("--index", type=int, default=137)
parser.add_argument("--num_epochs", type=int, default=10)
parser.add_argument("--batch_size", type=int, default=128)
parser.add_argument("--input_c", type=int, default=9)
parser.add_argument("--output_c", type=int, default=9)
parser.add_argument("--k", type=int, default=3)
parser.add_argument("--dataset", type=str, default="credit")
parser.add_argument("--mode", type=str, default="train", choices=["train", "test"])
parser.add_argument("--data_path", type=str, default="./dataset/creditcard_ts.csv")
parser.add_argument("--model_save_path", type=str, default="checkpoints")
parser.add_argument("--anormly_ratio", type=float, default=4.00)
config = parser.parse_args()
args = vars(config)
config.patch_size = [int(patch_index) for patch_index in config.patch_size]
if config.dataset == "UCR":
batch_size_buffer = [2, 4, 8, 16, 32, 64, 128, 256]
data_len = np.load(
"dataset/" + config.data_path + "/UCR_" + str(config.index) + "_train.npy"
).shape[0]
config.batch_size = find_nearest(batch_size_buffer, data_len / config.win_size)
elif config.dataset == "UCR_AUG":
batch_size_buffer = [2, 4, 8, 16, 32, 64, 128, 256]
data_len = np.load(
"dataset/"
+ config.data_path
+ "/UCR_AUG_"
+ str(config.index)
+ "_train.npy"
).shape[0]
config.batch_size = find_nearest(batch_size_buffer, data_len / config.win_size)
elif config.dataset == "SMD_Ori":
batch_size_buffer = [2, 4, 8, 16, 32, 64, 128, 256, 512]
data_len = np.load(
"dataset/"
+ config.data_path
+ "/SMD_Ori_"
+ str(config.index)
+ "_train.npy"
).shape[0]
config.batch_size = find_nearest(batch_size_buffer, data_len / config.win_size)
config.use_gpu = True if torch.cuda.is_available() and config.use_gpu else False
# if config.use_gpu and config.use_multi_gpu:
# config.devices = config.devices.replace(" ", "")
# device_ids = config.devices.split(",")
# config.device_ids = [int(id_) for id_ in device_ids]
# config.gpu = config.device_ids[0]
# print(config.devices)
# config.gpu = config.devices
# os.environ['CUDA_VISIBLE_DEVICES']= config.devices #config.gpu
sys.stdout = Logger("result/" + config.data_path + ".log", sys.stdout)
if config.mode == "train":
print("\n\n")
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
print("================ Hyperparameters ===============")
for k, v in sorted(args.items()):
print("%s: %s" % (str(k), str(v)))
print("==================== Train ===================")
setup_seed(1)
main(config)