forked from JointCloud/JCC-DeepOD
add DCdetector
This commit is contained in:
parent
0833c20010
commit
fb5711b08f
|
@ -20,6 +20,7 @@ from deepod.models.time_series.devnet import DevNetTS
|
|||
from deepod.models.time_series.dif import DeepIsolationForestTS
|
||||
from deepod.models.time_series.dsvdd import DeepSVDDTS
|
||||
|
||||
from deepod.models.time_series.dcdetector import DCdetector
|
||||
from deepod.models.time_series.timesnet import TimesNet
|
||||
from deepod.models.time_series.anomalytransformer import AnomalyTransformer
|
||||
from deepod.models.time_series.tranad import TranAD
|
||||
|
@ -31,7 +32,7 @@ from deepod.models.time_series.tcned import TcnED
|
|||
__all__ = [
|
||||
'RCA', 'DeepSVDD', 'GOAD', 'NeuTraL', 'RDP', 'ICL', 'SLAD', 'DeepIsolationForest',
|
||||
'DeepSAD', 'DevNet', 'PReNet', 'FeaWAD', 'REPEN', 'RoSAS',
|
||||
'TimesNet', 'AnomalyTransformer', 'TranAD', 'COUTA', 'USAD', 'TcnED',
|
||||
'DCdetector', 'TimesNet', 'AnomalyTransformer', 'TranAD', 'COUTA', 'USAD', 'TcnED',
|
||||
'DeepIsolationForestTS', 'DeepSVDDTS',
|
||||
'PReNetTS', 'DeepSADTS', 'DevNetTS'
|
||||
]
|
|
@ -28,7 +28,7 @@ class DCdetector(BaseDeepAD):
|
|||
verbose=verbose, random_state=random_state
|
||||
)
|
||||
if patch_size is None:
|
||||
self.patch_size = [5]
|
||||
self.patch_size = [5] # patch_size must be divisible by seq_len
|
||||
self.patch_size = patch_size
|
||||
self.n_heads = n_heads
|
||||
self.d_model = d_model
|
||||
|
@ -41,9 +41,9 @@ class DCdetector(BaseDeepAD):
|
|||
self.n_features = X.shape[1]
|
||||
|
||||
train_seqs = get_sub_seqs(X, seq_len=self.seq_len, stride=self.stride)
|
||||
self.model = DCdetector(win_size=self.seq_len, enc_in=self.n_features, c_out=self.n_features, n_heads=self.n_heads,
|
||||
self.model = DCdetectorModel(win_size=self.seq_len, enc_in=self.n_features, c_out=self.n_features, n_heads=self.n_heads,
|
||||
d_model=self.d_model, e_layers=self.e_layers, patch_size=self.patch_size,
|
||||
channel=self.n_features)
|
||||
channel=self.n_features).to(self.device)
|
||||
|
||||
dataloader = DataLoader(train_seqs, batch_size=self.batch_size,
|
||||
shuffle=True, pin_memory=True)
|
||||
|
@ -100,7 +100,7 @@ class DCdetector(BaseDeepAD):
|
|||
series[u].detach())) + torch.mean(
|
||||
my_kl_loss(series[u].detach(), (
|
||||
prior[u] / torch.unsqueeze(torch.sum(prior[u], dim=-1), dim=-1).repeat(1, 1, 1,
|
||||
self.win_size)))))
|
||||
self.seq_len)))))
|
||||
|
||||
series_loss = series_loss / len(prior)
|
||||
prior_loss = prior_loss / len(prior)
|
||||
|
@ -133,18 +133,18 @@ class DCdetector(BaseDeepAD):
|
|||
if u == 0:
|
||||
series_loss = my_kl_loss(series[u], (
|
||||
prior[u] / torch.unsqueeze(torch.sum(prior[u], dim=-1), dim=-1).repeat(1, 1, 1,
|
||||
self.win_size)).detach()) * temperature
|
||||
self.seq_len)).detach()) * temperature
|
||||
prior_loss = my_kl_loss(
|
||||
(prior[u] / torch.unsqueeze(torch.sum(prior[u], dim=-1), dim=-1).repeat(1, 1, 1,
|
||||
self.win_size)),
|
||||
self.seq_len)),
|
||||
series[u].detach()) * temperature
|
||||
else:
|
||||
series_loss += my_kl_loss(series[u], (
|
||||
prior[u] / torch.unsqueeze(torch.sum(prior[u], dim=-1), dim=-1).repeat(1, 1, 1,
|
||||
self.win_size)).detach()) * temperature
|
||||
self.seq_len)).detach()) * temperature
|
||||
prior_loss += my_kl_loss(
|
||||
(prior[u] / torch.unsqueeze(torch.sum(prior[u], dim=-1), dim=-1).repeat(1, 1, 1,
|
||||
self.win_size)),
|
||||
self.seq_len)),
|
||||
series[u].detach()) * temperature
|
||||
|
||||
metric = torch.softmax((-series_loss - prior_loss), dim=-1)
|
||||
|
@ -155,6 +155,22 @@ class DCdetector(BaseDeepAD):
|
|||
|
||||
return test_energy, preds # (n,d)
|
||||
|
||||
def training_forward(self, batch_x, net, criterion):
|
||||
"""define forward step in training"""
|
||||
return
|
||||
|
||||
def inference_forward(self, batch_x, net, criterion):
|
||||
"""define forward step in inference"""
|
||||
return
|
||||
|
||||
def training_prepare(self, X, y):
|
||||
"""define train_loader, net, and criterion"""
|
||||
return
|
||||
|
||||
def inference_prepare(self, X):
|
||||
"""define test_loader"""
|
||||
return
|
||||
|
||||
|
||||
# Proposed Model
|
||||
|
||||
|
@ -174,10 +190,10 @@ class Encoder(nn.Module):
|
|||
return series_list, prior_list
|
||||
|
||||
|
||||
class DCdetector(nn.Module):
|
||||
class DCdetectorModel(nn.Module):
|
||||
def __init__(self, win_size, enc_in, c_out, n_heads=1, d_model=256, e_layers=3, patch_size=[3, 5, 7], channel=55,
|
||||
d_ff=512, dropout=0.0, activation='gelu', output_attention=True):
|
||||
super(DCdetector, self).__init__()
|
||||
super(DCdetectorModel, self).__init__()
|
||||
self.output_attention = output_attention
|
||||
self.patch_size = patch_size
|
||||
self.channel = channel
|
||||
|
|
|
@ -62,3 +62,15 @@ RoSAS:
|
|||
alpha: 0.5
|
||||
margin: 1
|
||||
beta: 1
|
||||
|
||||
DCdetector:
|
||||
patch_size: [1,3,5]
|
||||
batch_size: 128
|
||||
epochs: 10
|
||||
lr: 0.0001
|
||||
n_heads: 1
|
||||
d_model: 256
|
||||
e_layers: 3
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -15,16 +15,19 @@ from utils import import_ts_data_unsupervised
|
|||
from deepod.metrics import ts_metrics, point_adjustment
|
||||
|
||||
|
||||
dataset_root = f'/home/{getpass.getuser()}/dataset/5-TSdata/_processed_data/'
|
||||
|
||||
# dataset_root = f'/home/{getpass.getuser()}/dataset/5-TSdata/_processed_data/'
|
||||
dataset_root = f'E:/NUDTCoding/PDL/DeepOD/data/'
|
||||
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("--runs", type=int, default=5,
|
||||
help="how many times we repeat the experiments to obtain the average performance")
|
||||
parser.add_argument("--output_dir", type=str, default='@records/',
|
||||
help="the output file path")
|
||||
# parser.add_argument("--dataset", type=str,
|
||||
# default='ASD,SMAP,MSL',
|
||||
# )
|
||||
parser.add_argument("--dataset", type=str,
|
||||
default='ASD,SMAP,MSL',
|
||||
default='ASD',
|
||||
)
|
||||
parser.add_argument("--entities", type=str,
|
||||
default='FULL',
|
||||
|
@ -32,7 +35,7 @@ parser.add_argument("--entities", type=str,
|
|||
'or a list of entity names split by comma'
|
||||
)
|
||||
parser.add_argument("--entity_combined", type=int, default=1)
|
||||
parser.add_argument("--model", type=str, default='TimesNet', help="")
|
||||
parser.add_argument("--model", type=str, default='DCdetector', help="")
|
||||
|
||||
parser.add_argument('--silent_header', action='store_true')
|
||||
parser.add_argument("--flag", type=str, default='')
|
||||
|
|
Loading…
Reference in New Issue