add DCdetector

This commit is contained in:
real-lhj 2023-09-06 20:57:24 +08:00
parent 0833c20010
commit fb5711b08f
4 changed files with 47 additions and 15 deletions

View File

@ -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'
]

View File

@ -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

View File

@ -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

View File

@ -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='')