From b4a4a5b7a11ac1a6eeda5706bab9457c09984004 Mon Sep 17 00:00:00 2001 From: Arad Gast Date: Mon, 2 Dec 2024 18:10:07 +0200 Subject: [PATCH] fix 2 bugs - error in mean calculation, use eigh instead of eig --- .gitignore | 4 +++- main.py | 24 ++++++++++++------------ src/data_handler.py | 4 ++-- src/evaluation.py | 8 ++++---- src/models.py | 4 ++-- src/system_model.py | 2 +- 6 files changed, 24 insertions(+), 22 deletions(-) diff --git a/.gitignore b/.gitignore index a08c30e..6c7651b 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,6 @@ plot_style.txt plotting Figures src/__pycache__ -data \ No newline at end of file +data +.venv/ +.idea/ \ No newline at end of file diff --git a/main.py b/main.py index d9fc2ef..e263249 100644 --- a/main.py +++ b/main.py @@ -60,10 +60,10 @@ dt_string_for_save = now.strftime("%d_%m_%Y_%H_%M") # Operations commands commands = { - "SAVE_TO_FILE": True, # Saving results to file or present them over CMD - "CREATE_DATA": False, # Creating new dataset - "LOAD_DATA": True, # Loading data from exist dataset - "LOAD_MODEL": True, # Load specific model for training + "SAVE_TO_FILE": False, # Saving results to file or present them over CMD + "CREATE_DATA": True, # Creating new dataset + "LOAD_DATA": False, # Loading data from exist dataset + "LOAD_MODEL": False, # Load specific model for training "TRAIN_MODEL": True, # Applying training operation "SAVE_MODEL": False, # Saving tuned model "EVALUATE_MODE": True, # Evaluating desired algorithms @@ -78,13 +78,13 @@ system_model_params = ( SystemModelParams() .set_parameter("N", 8) - .set_parameter("M", 3) - .set_parameter("T", 200) + .set_parameter("M", 2) + .set_parameter("T", 100) .set_parameter("snr", 10) .set_parameter("signal_type", "NarrowBand") .set_parameter("signal_nature", "non-coherent") .set_parameter("eta", 0) - .set_parameter("bias", 0.05) + .set_parameter("bias", 0.0) .set_parameter("sv_noise_var", 0) ) # Generate model configuration @@ -96,8 +96,8 @@ .set_model(system_model_params) ) # Define samples size - samples_size = 100000 # Overall dateset size - train_test_ratio = 0.05 # training and testing datasets ratio + samples_size = 1024 # Overall dateset size + train_test_ratio = .1 # training and testing datasets ratio # Sets simulation filename simulation_filename = get_simulation_filename( system_model_params=system_model_params, model_config=model_config @@ -160,10 +160,10 @@ # Assign the training parameters object simulation_parameters = ( TrainingParams() - .set_batch_size(2048) - .set_epochs(80) + .set_batch_size(16) + .set_epochs(20) .set_model(model=model_config) - .set_optimizer(optimizer="Adam", learning_rate=0.00001, weight_decay=1e-9) + .set_optimizer(optimizer="Adam", learning_rate=0.001, weight_decay=1e-9) .set_training_dataset(train_dataset) .set_schedular(step_size=80, gamma=0.2) .set_criterion() diff --git a/src/data_handler.py b/src/data_handler.py index 8dd8f62..92e5f01 100644 --- a/src/data_handler.py +++ b/src/data_handler.py @@ -188,11 +188,11 @@ def autocorrelation_matrix(X: torch.Tensor, lag: int): """ Rx_lag = torch.zeros(X.shape[0], X.shape[0], dtype=torch.complex128).to(device) + meu = torch.mean(X, dim=-1, keepdim=False).to(device).unsqueeze(-1) for t in range(X.shape[1] - lag): - # meu = torch.mean(X,1) x1 = torch.unsqueeze(X[:, t], 1).to(device) x2 = torch.t(torch.unsqueeze(torch.conj(X[:, t + lag]), 1)).to(device) - Rx_lag += torch.matmul(x1 - torch.mean(X), x2 - torch.mean(X)).to(device) + Rx_lag += torch.matmul(x1 - meu, x2 - meu.transpose(0,1)).to(device) Rx_lag = Rx_lag / (X.shape[-1] - lag) Rx_lag = torch.cat((torch.real(Rx_lag), torch.imag(Rx_lag)), 0) return Rx_lag diff --git a/src/evaluation.py b/src/evaluation.py index aeee5b6..2b3404a 100644 --- a/src/evaluation.py +++ b/src/evaluation.py @@ -365,7 +365,6 @@ def add_random_predictions(M: int, predictions: np.ndarray, algorithm: str): def evaluate( - model: nn.Module, model_type: str, model_test_dataset: list, generic_test_dataset: list, @@ -373,6 +372,7 @@ def evaluate( subspace_criterion, system_model, figures: dict, + model: nn.Module = None, plot_spec: bool = True, augmented_methods: list = None, subspace_methods: list = None, @@ -402,8 +402,8 @@ def evaluate( if not isinstance(augmented_methods, list) and model_type.startswith("SubspaceNet"): augmented_methods = [ # "mvdr", - "r-music", - "esprit", + # "r-music", + # "esprit", # "music", ] # Set default model-based subspace methods @@ -411,7 +411,7 @@ def evaluate( subspace_methods = [ "esprit", # "music", - "r-music", + # "r-music", # "mvdr", # "sps-r-music", # "sps-esprit", diff --git a/src/models.py b/src/models.py index 208b551..0139ecf 100644 --- a/src/models.py +++ b/src/models.py @@ -717,7 +717,7 @@ def root_music(Rz: torch.Tensor, M: int, batch_size: int): for iter in range(batch_size): R = Bs_Rz[iter] # Extract eigenvalues and eigenvectors using EVD - eigenvalues, eigenvectors = torch.linalg.eig(R) + eigenvalues, eigenvectors = torch.linalg.eigh(R) # Assign noise subspace as the eigenvectors associated with M greatest eigenvalues Un = eigenvectors[:, torch.argsort(torch.abs(eigenvalues)).flip(0)][:, M:] # Generate hermitian noise subspace matrix @@ -774,7 +774,7 @@ def esprit(Rz: torch.Tensor, M: int, batch_size: int): for iter in range(batch_size): R = Bs_Rz[iter] # Extract eigenvalues and eigenvectors using EVD - eigenvalues, eigenvectors = torch.linalg.eig(R) + eigenvalues, eigenvectors = torch.linalg.eigh(R) # Get signal subspace Us = eigenvectors[:, torch.argsort(torch.abs(eigenvalues)).flip(0)][:, :M] diff --git a/src/system_model.py b/src/system_model.py index 474f7f1..b8be8d7 100644 --- a/src/system_model.py +++ b/src/system_model.py @@ -173,7 +173,7 @@ def steering_vec( ) # If calculation is applied through method (array mismatches are not known). else: - mis_distance, mis_geometry_noise = 0, 0 + mis_distance, mis_geometry_noise, uniform_bias = 0, 0, 0 return ( np.exp(