diff --git a/models/Final_Model/dataset/dataset_builder.py b/models/Final_Model/dataset/dataset_builder.py new file mode 100644 index 0000000..1f38b84 --- /dev/null +++ b/models/Final_Model/dataset/dataset_builder.py @@ -0,0 +1,260 @@ +import torch +import torch.nn as nn +import cv2 +import json +import os +import numpy as np +from tqdm import tqdm +import sys +import os + + +# ============================================================================== +# CONFIGURAÇÃO DE IMPORTS +# ============================================================================== + +current_dir = os.path.dirname(os.path.abspath(__file__)) +models_root = os.path.abspath(os.path.join(current_dir, "..", "..")) +vae_path = os.path.join(models_root, "VAE") +text_path = os.path.join(models_root, "Text_Encoder") + +# Adiciona ao sistema +sys.path.append(vae_path) +sys.path.append(text_path) +sys.path.append(models_root) + +try: + from vae_video import VAE + from Text_Encoder import TextEncoder, encoding_function + from latent_fusion import SpatialBroadcastFuser + + print("OK: Sem erros de importação") + +except ImportError as e: + print(f"\nERRO DE IMPORTAÇÃO: {e}") + sys.exit() + + +# ============================================================================== +# CONFIGURAÇÕES +# ============================================================================== + +# Caminhos +BASE_DIR = current_dir +PROJECT_ROOT = os.path.abspath(os.path.join(current_dir, "..", "..", "..")) +DATASET_ROOT = os.path.join(PROJECT_ROOT, "dataset", "scenario1") +INPUT_FOLDER_JSON = os.path.join(DATASET_ROOT, "inputs") +INPUT_FOLDER_VIDEO = os.path.join(DATASET_ROOT, "videos") +OUTPUT_FOLDER = os.path.join(BASE_DIR, "dataset_processado") + +# Caminho dos pesos +VAE_WEIGHTS = os.path.join(vae_path, "vae_weights.pth") +TEXT_WEIGHTS = os.path.join(text_path, "text_encoder_weights.pth") + +TARGET_FPS = 60.0 +DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu") +print(f"Usando dispositivo {DEVICE}") + + +# ============================================================================== +# FUNÇÕES AUXILIARES +# ============================================================================== + +def load_models(): + """Carrega VAE, TextEncoder e Fuser com pesos pré-treinados.""" + + # 1. VAE + vae = VAE().to(DEVICE) + if os.path.exists(VAE_WEIGHTS): + vae.load_state_dict(torch.load(VAE_WEIGHTS, map_location=DEVICE)) + print("Pesos VAE carregados") + else: + print(f"AVISO: Pesos VAE não encontrados em {VAE_WEIGHTS}") + sys.exit() + vae.eval() + + # 2. Text Encoder + text_enc = TextEncoder().to(DEVICE) + if os.path.exists(TEXT_WEIGHTS): + text_enc.load_state_dict(torch.load(TEXT_WEIGHTS, map_location=DEVICE)) + print("Pesos Text Encoder carregados.") + else: + print(f"AVISO: Pesos Text Encoder não encontrados em {TEXT_WEIGHTS}") + sys.exit() + text_enc.eval() + + # 3. Fuser + fuser = SpatialBroadcastFuser(height=8, width=8).to(DEVICE) + + return vae, text_enc, fuser + + +def map_actions_to_frames(json_path, fps): + """ + Lê o JSON e cria um dicionário {frame_index: action_data}. + """ + with open(json_path, 'r') as f: + actions_list = json.load(f) + + action_map = {} + for action in actions_list: + frame_idx = int(action['time'] * fps) + action_map[frame_idx] = action + + return action_map + + +def preprocess_frame(frame): + """Prepara frame para passar como entrada do VAE (64x64, Grayscale, Tensor).""" + + frame = cv2.resize(frame, (64, 64)) + if len(frame.shape) == 3: + frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) + + # Normalizar [0, 1] + frame = frame.astype(np.float32) / 255.0 + + # Tensor (Batch=1, Channel=1, H, W) + tensor = torch.from_numpy(frame).unsqueeze(0).unsqueeze(0) + return tensor.to(DEVICE) + + +def process_step(frame_curr, frame_next, action_data, models): + """ + Recebe frames brutos e dados da ação. + Retorna: + - Input X: Latente Fundido (24, 8, 8) + - Target Y: Latente Visual Futuro (8, 8, 8) + """ + vae, text_enc, fuser = models + + # Preparar Tensores de Imagem + t_curr = preprocess_frame(frame_curr) + t_next = preprocess_frame(frame_next) + + # Preparar Tensor de Ação + # Chama encoding_function, do encoder de texto + vec_action = encoding_function(action_data).unsqueeze(0).to(DEVICE) + + with torch.no_grad(): + # Codificar Visual Atual (t) no VAE + mu_curr, _ = vae.encode(t_curr) + + # Codificar Visual Futuro (t+1), o alvo + mu_next, _ = vae.encode(t_next) + + # Codificar Texto/Ação + emb_action = text_enc(vec_action) + + # Fusão (Spatial Broadcast) + z_fused = fuser(mu_curr, emb_action) + + return z_fused.squeeze(0).cpu(), mu_next.squeeze(0).cpu() + + +def process_video_sequence(video_path, json_path, models): + """ + Itera sobre todos os frames do vídeo, chama process_step e empilha os resultados. + """ + # Carregar Mapa de Ações + action_map = map_actions_to_frames(json_path, TARGET_FPS) + + # Abrir Vídeo + cap = cv2.VideoCapture(video_path) + if not cap.isOpened(): + return None + + inputs_list = [] + targets_list = [] + + frame_idx = 0 + ret, frame_curr = cap.read() + + if not ret: + cap.release() + return None + + # Loop Frame a Frame + while True: + ret, frame_next = cap.read() + if not ret: + break # Fim do vídeo + + # Pega a ação correspondente a este frame (ou None) + current_action = action_map.get(frame_idx, None) + + # Processa o passo individual chamando a função auxiliar + x, y = process_step(frame_curr, frame_next, current_action, models) + + inputs_list.append(x) + targets_list.append(y) + + # Avança + frame_curr = frame_next + frame_idx += 1 + + cap.release() + + if len(inputs_list) == 0: + return None + + # Empilha tudo em um tensor grande (Time, Channels, H, W) + return { + 'x': torch.stack(inputs_list), + 'y': torch.stack(targets_list) + } + + +# ============================================================================== +# LOOP PRINCIPAL (MAIN) +# ============================================================================== + +def main(): + # Carregar Modelos + models = load_models() + + os.makedirs(OUTPUT_FOLDER, exist_ok=True) + + # Listar Arquivos + if not os.path.exists(INPUT_FOLDER_JSON): + print(f"Pasta não encontrada: {INPUT_FOLDER_JSON}") + return + + json_files = [f for f in os.listdir(INPUT_FOLDER_JSON) if f.endswith('.json')] + print(f"Iniciando processamento de {len(json_files)} simulações...") + + count = 0 + + for json_file in tqdm(json_files): + # Encontra o vídeo correspondente + prefix = json_file.replace('.json', '') + video_file = None + for v in os.listdir(INPUT_FOLDER_VIDEO): + if v.startswith(prefix) and v.endswith('.mp4'): + video_file = v + break + + if not video_file: + continue + + full_video_path = os.path.join(INPUT_FOLDER_VIDEO, video_file) + full_json_path = os.path.join(INPUT_FOLDER_JSON, json_file) + + # Processar Vídeo + try: + dataset_tensors = process_video_sequence(full_video_path, full_json_path, models) + except Exception as e: + print(f"Erro processando {json_file}: {e}") + continue + + if dataset_tensors: + # Salvar Resultado + save_name = json_file.replace('.json', '.pt') + torch.save(dataset_tensors, os.path.join(OUTPUT_FOLDER, save_name)) + count += 1 + + print(f"Sucesso! {count} arquivos .pt gerados em {OUTPUT_FOLDER}") + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_01.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_01.pt new file mode 100644 index 0000000..6438285 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_01.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_02.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_02.pt new file mode 100644 index 0000000..c40f4ff Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_02.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_03.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_03.pt new file mode 100644 index 0000000..a5621d8 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_03.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_04.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_04.pt new file mode 100644 index 0000000..ce76508 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_04.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_05.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_05.pt new file mode 100644 index 0000000..c45035c Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_05.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_06.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_06.pt new file mode 100644 index 0000000..fa43c22 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_06.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_07.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_07.pt new file mode 100644 index 0000000..1ff3c77 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_07.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_08.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_08.pt new file mode 100644 index 0000000..5f5bebd Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_08.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_09.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_09.pt new file mode 100644 index 0000000..03e8847 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_09.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_10.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_10.pt new file mode 100644 index 0000000..388034a Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_10.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_11.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_11.pt new file mode 100644 index 0000000..24c142e Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_11.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_12.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_12.pt new file mode 100644 index 0000000..3cef9c9 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_12.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_13.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_13.pt new file mode 100644 index 0000000..c59f668 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_13.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_14.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_14.pt new file mode 100644 index 0000000..050f1a6 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_14.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_15.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_15.pt new file mode 100644 index 0000000..d1f1873 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_15.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_16.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_16.pt new file mode 100644 index 0000000..cc04233 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_16.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_17.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_17.pt new file mode 100644 index 0000000..11b3032 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_17.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_18.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_18.pt new file mode 100644 index 0000000..fc968dc Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_18.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_19.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_19.pt new file mode 100644 index 0000000..2e9fd6b Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_19.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_20.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_20.pt new file mode 100644 index 0000000..31953d9 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_20.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_21.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_21.pt new file mode 100644 index 0000000..a27ad9a Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_21.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_22.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_22.pt new file mode 100644 index 0000000..c417727 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_22.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_23.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_23.pt new file mode 100644 index 0000000..6682d0b Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_23.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_24.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_24.pt new file mode 100644 index 0000000..cbee856 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_24.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_25.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_25.pt new file mode 100644 index 0000000..df72f00 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_25.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_26.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_26.pt new file mode 100644 index 0000000..620d7e4 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_26.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_27.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_27.pt new file mode 100644 index 0000000..bc26b7c Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_27.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_28.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_28.pt new file mode 100644 index 0000000..8351e6a Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_28.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_29.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_29.pt new file mode 100644 index 0000000..272a31b Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_29.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_30.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_30.pt new file mode 100644 index 0000000..fa9104b Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_30.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_31.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_31.pt new file mode 100644 index 0000000..228786e Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_31.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_32.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_32.pt new file mode 100644 index 0000000..e0b8893 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_32.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_33.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_33.pt new file mode 100644 index 0000000..7ae2d4c Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_33.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_34.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_34.pt new file mode 100644 index 0000000..b460f04 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_34.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_35.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_35.pt new file mode 100644 index 0000000..ec44a87 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_35.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_36.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_36.pt new file mode 100644 index 0000000..4f509db Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_36.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_37.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_37.pt new file mode 100644 index 0000000..e3096d9 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_37.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_38.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_38.pt new file mode 100644 index 0000000..779a606 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_38.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_39.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_39.pt new file mode 100644 index 0000000..d30db34 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_39.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_40.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_40.pt new file mode 100644 index 0000000..547f9cf Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_40.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_41.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_41.pt new file mode 100644 index 0000000..9ec841d Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_41.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_42.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_42.pt new file mode 100644 index 0000000..b9a0d04 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_42.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_43.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_43.pt new file mode 100644 index 0000000..b81bc4c Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_43.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_44.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_44.pt new file mode 100644 index 0000000..597f48f Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_44.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_45.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_45.pt new file mode 100644 index 0000000..d7fe6dc Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_45.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_46.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_46.pt new file mode 100644 index 0000000..7dbfd95 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_46.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_47.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_47.pt new file mode 100644 index 0000000..736d412 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_47.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_48.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_48.pt new file mode 100644 index 0000000..f691c11 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_48.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_49.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_49.pt new file mode 100644 index 0000000..4bfc1d6 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_49.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_50.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_50.pt new file mode 100644 index 0000000..ec927bf Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_50.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_51.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_51.pt new file mode 100644 index 0000000..2b39877 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_51.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_52.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_52.pt new file mode 100644 index 0000000..2e9cc91 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_52.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_53.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_53.pt new file mode 100644 index 0000000..0f383f1 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_53.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_54.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_54.pt new file mode 100644 index 0000000..4eb6792 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_54.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_55.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_55.pt new file mode 100644 index 0000000..e6cae04 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_55.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_56.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_56.pt new file mode 100644 index 0000000..4e38edb Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_56.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_57.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_57.pt new file mode 100644 index 0000000..a4d0977 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_57.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_58.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_58.pt new file mode 100644 index 0000000..248bf89 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_58.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_59.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_59.pt new file mode 100644 index 0000000..fdef05a Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_59.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_60.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_60.pt new file mode 100644 index 0000000..5ee1b3b Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_60.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_61.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_61.pt new file mode 100644 index 0000000..02bfdc6 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_61.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_62.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_62.pt new file mode 100644 index 0000000..07cd11e Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_62.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_63.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_63.pt new file mode 100644 index 0000000..7c0b9c2 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_63.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_64.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_64.pt new file mode 100644 index 0000000..90f45ec Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161830_64.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_100.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_100.pt new file mode 100644 index 0000000..c388d43 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_100.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_101.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_101.pt new file mode 100644 index 0000000..ec25520 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_101.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_102.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_102.pt new file mode 100644 index 0000000..e42ff44 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_102.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_103.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_103.pt new file mode 100644 index 0000000..c06854d Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_103.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_104.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_104.pt new file mode 100644 index 0000000..2204b58 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_104.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_105.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_105.pt new file mode 100644 index 0000000..7ed9786 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_105.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_106.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_106.pt new file mode 100644 index 0000000..2ceea0c Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_106.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_107.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_107.pt new file mode 100644 index 0000000..8df553d Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_107.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_108.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_108.pt new file mode 100644 index 0000000..0966518 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_108.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_109.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_109.pt new file mode 100644 index 0000000..e0b6e41 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_109.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_110.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_110.pt new file mode 100644 index 0000000..f1ba914 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_110.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_111.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_111.pt new file mode 100644 index 0000000..dc46392 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_111.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_112.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_112.pt new file mode 100644 index 0000000..3846750 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_112.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_113.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_113.pt new file mode 100644 index 0000000..46cb730 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_113.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_114.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_114.pt new file mode 100644 index 0000000..2962211 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_114.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_115.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_115.pt new file mode 100644 index 0000000..24e90b2 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_115.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_116.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_116.pt new file mode 100644 index 0000000..55473eb Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_116.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_117.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_117.pt new file mode 100644 index 0000000..cbb8904 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_117.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_118.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_118.pt new file mode 100644 index 0000000..b9d49b8 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_118.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_119.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_119.pt new file mode 100644 index 0000000..d51f0d6 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_119.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_120.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_120.pt new file mode 100644 index 0000000..1a144d1 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_120.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_121.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_121.pt new file mode 100644 index 0000000..bd4049e Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_121.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_122.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_122.pt new file mode 100644 index 0000000..a6444ad Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_122.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_123.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_123.pt new file mode 100644 index 0000000..d3bb527 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_123.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_124.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_124.pt new file mode 100644 index 0000000..0074723 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_124.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_125.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_125.pt new file mode 100644 index 0000000..ea5b4a1 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_125.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_126.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_126.pt new file mode 100644 index 0000000..832854e Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_126.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_127.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_127.pt new file mode 100644 index 0000000..558439c Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_127.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_128.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_128.pt new file mode 100644 index 0000000..cdd40cc Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_128.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_129.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_129.pt new file mode 100644 index 0000000..bb20989 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_129.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_130.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_130.pt new file mode 100644 index 0000000..9b42c9c Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_130.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_131.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_131.pt new file mode 100644 index 0000000..59d2e02 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_131.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_132.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_132.pt new file mode 100644 index 0000000..16a2ee7 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_132.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_133.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_133.pt new file mode 100644 index 0000000..9ea70b8 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_133.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_134.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_134.pt new file mode 100644 index 0000000..af0cf5a Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_134.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_135.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_135.pt new file mode 100644 index 0000000..ba43f17 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_135.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_136.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_136.pt new file mode 100644 index 0000000..f4143e4 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_136.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_137.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_137.pt new file mode 100644 index 0000000..9ee413c Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_137.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_138.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_138.pt new file mode 100644 index 0000000..d9d6e59 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_138.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_139.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_139.pt new file mode 100644 index 0000000..f8f8c09 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_139.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_140.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_140.pt new file mode 100644 index 0000000..05ce27a Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_140.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_141.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_141.pt new file mode 100644 index 0000000..d25bf07 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_141.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_142.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_142.pt new file mode 100644 index 0000000..15f702d Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_142.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_143.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_143.pt new file mode 100644 index 0000000..d283845 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_143.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_144.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_144.pt new file mode 100644 index 0000000..4a90550 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_144.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_145.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_145.pt new file mode 100644 index 0000000..714cdfc Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_145.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_146.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_146.pt new file mode 100644 index 0000000..86b92d5 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_146.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_147.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_147.pt new file mode 100644 index 0000000..49d317b Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_147.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_148.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_148.pt new file mode 100644 index 0000000..ab4d372 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_148.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_149.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_149.pt new file mode 100644 index 0000000..e45322a Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_149.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_150.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_150.pt new file mode 100644 index 0000000..9355c8f Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_150.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_151.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_151.pt new file mode 100644 index 0000000..79b0075 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_151.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_152.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_152.pt new file mode 100644 index 0000000..b50251a Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_152.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_153.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_153.pt new file mode 100644 index 0000000..55a1ba3 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_153.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_154.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_154.pt new file mode 100644 index 0000000..b3a92ae Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_154.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_155.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_155.pt new file mode 100644 index 0000000..4f7504a Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_155.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_156.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_156.pt new file mode 100644 index 0000000..4a9a980 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_156.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_157.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_157.pt new file mode 100644 index 0000000..39d5056 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_157.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_158.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_158.pt new file mode 100644 index 0000000..32394d1 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_158.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_159.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_159.pt new file mode 100644 index 0000000..43d91d8 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_159.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_160.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_160.pt new file mode 100644 index 0000000..75527e4 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_160.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_161.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_161.pt new file mode 100644 index 0000000..1d0de54 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_161.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_162.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_162.pt new file mode 100644 index 0000000..5ace438 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_162.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_163.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_163.pt new file mode 100644 index 0000000..a6c7bea Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_163.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_164.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_164.pt new file mode 100644 index 0000000..3510d4c Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_164.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_165.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_165.pt new file mode 100644 index 0000000..5dc779f Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_165.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_166.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_166.pt new file mode 100644 index 0000000..76ae830 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_166.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_167.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_167.pt new file mode 100644 index 0000000..6c6e559 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_167.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_168.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_168.pt new file mode 100644 index 0000000..2bd9714 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_168.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_169.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_169.pt new file mode 100644 index 0000000..37e9fa0 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_169.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_170.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_170.pt new file mode 100644 index 0000000..a396279 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_170.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_171.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_171.pt new file mode 100644 index 0000000..f5f1a57 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_171.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_172.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_172.pt new file mode 100644 index 0000000..bc5b505 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_172.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_173.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_173.pt new file mode 100644 index 0000000..02b6f1f Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_173.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_174.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_174.pt new file mode 100644 index 0000000..c1475e7 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_174.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_175.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_175.pt new file mode 100644 index 0000000..862771d Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_175.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_176.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_176.pt new file mode 100644 index 0000000..489f9e8 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_176.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_177.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_177.pt new file mode 100644 index 0000000..07b5486 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_177.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_178.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_178.pt new file mode 100644 index 0000000..8602c75 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_178.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_179.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_179.pt new file mode 100644 index 0000000..619c8eb Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_179.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_180.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_180.pt new file mode 100644 index 0000000..3b70919 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_180.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_181.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_181.pt new file mode 100644 index 0000000..d9d491c Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_181.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_182.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_182.pt new file mode 100644 index 0000000..5cb8246 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_182.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_183.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_183.pt new file mode 100644 index 0000000..29152ea Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_183.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_184.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_184.pt new file mode 100644 index 0000000..2627e4c Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_184.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_185.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_185.pt new file mode 100644 index 0000000..1b7ec2d Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_185.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_186.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_186.pt new file mode 100644 index 0000000..39e7113 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_186.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_187.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_187.pt new file mode 100644 index 0000000..6816b65 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_187.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_188.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_188.pt new file mode 100644 index 0000000..a45cdc9 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_188.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_189.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_189.pt new file mode 100644 index 0000000..bbd2e53 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_189.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_190.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_190.pt new file mode 100644 index 0000000..f69eec0 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_190.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_191.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_191.pt new file mode 100644 index 0000000..eeebb73 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_191.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_192.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_192.pt new file mode 100644 index 0000000..5ba6035 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_192.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_193.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_193.pt new file mode 100644 index 0000000..a328529 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_193.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_194.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_194.pt new file mode 100644 index 0000000..1bc281b Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_194.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_195.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_195.pt new file mode 100644 index 0000000..09c4bfe Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_195.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_196.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_196.pt new file mode 100644 index 0000000..554249e Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_196.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_197.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_197.pt new file mode 100644 index 0000000..baa10d6 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_197.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_198.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_198.pt new file mode 100644 index 0000000..bed6e0a Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_198.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_199.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_199.pt new file mode 100644 index 0000000..c9ea09e Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_199.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_200.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_200.pt new file mode 100644 index 0000000..6e5d6f2 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_200.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_65.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_65.pt new file mode 100644 index 0000000..069e6db Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_65.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_66.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_66.pt new file mode 100644 index 0000000..626c85b Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_66.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_67.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_67.pt new file mode 100644 index 0000000..5f2daab Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_67.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_68.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_68.pt new file mode 100644 index 0000000..70d74bc Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_68.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_69.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_69.pt new file mode 100644 index 0000000..537a9f9 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_69.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_70.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_70.pt new file mode 100644 index 0000000..a548139 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_70.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_71.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_71.pt new file mode 100644 index 0000000..ec75bf7 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_71.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_72.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_72.pt new file mode 100644 index 0000000..e52b530 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_72.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_73.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_73.pt new file mode 100644 index 0000000..b9b1fb5 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_73.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_74.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_74.pt new file mode 100644 index 0000000..2f6d5a8 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_74.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_75.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_75.pt new file mode 100644 index 0000000..7e9db36 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_75.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_76.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_76.pt new file mode 100644 index 0000000..fc85b98 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_76.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_77.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_77.pt new file mode 100644 index 0000000..6124b5e Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_77.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_78.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_78.pt new file mode 100644 index 0000000..e7fb0e7 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_78.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_79.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_79.pt new file mode 100644 index 0000000..7283b51 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_79.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_80.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_80.pt new file mode 100644 index 0000000..4e6b960 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_80.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_81.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_81.pt new file mode 100644 index 0000000..d9beb09 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_81.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_82.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_82.pt new file mode 100644 index 0000000..890d711 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_82.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_83.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_83.pt new file mode 100644 index 0000000..f54dbec Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_83.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_84.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_84.pt new file mode 100644 index 0000000..32f321c Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_84.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_85.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_85.pt new file mode 100644 index 0000000..b80e6d2 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_85.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_86.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_86.pt new file mode 100644 index 0000000..259a78e Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_86.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_87.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_87.pt new file mode 100644 index 0000000..6bbf87e Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_87.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_88.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_88.pt new file mode 100644 index 0000000..12e034a Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_88.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_89.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_89.pt new file mode 100644 index 0000000..07852ed Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_89.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_90.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_90.pt new file mode 100644 index 0000000..cec8984 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_90.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_91.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_91.pt new file mode 100644 index 0000000..7a5fc0b Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_91.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_92.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_92.pt new file mode 100644 index 0000000..f62416c Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_92.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_93.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_93.pt new file mode 100644 index 0000000..98cf547 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_93.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_94.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_94.pt new file mode 100644 index 0000000..c27e779 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_94.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_95.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_95.pt new file mode 100644 index 0000000..ce46f88 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_95.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_96.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_96.pt new file mode 100644 index 0000000..0d3ed0e Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_96.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_97.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_97.pt new file mode 100644 index 0000000..f7a3ab1 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_97.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_98.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_98.pt new file mode 100644 index 0000000..32c3893 Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_98.pt differ diff --git a/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_99.pt b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_99.pt new file mode 100644 index 0000000..fca5eab Binary files /dev/null and b/models/Final_Model/dataset/dataset_processado/random_input_20251005161831_99.pt differ diff --git a/models/Text_Encoder.ipynb b/models/Text_Encoder.ipynb deleted file mode 100644 index 5621c49..0000000 --- a/models/Text_Encoder.ipynb +++ /dev/null @@ -1,795 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "id": "hxYwMDg5G7Oz" - }, - "source": [ - "# Implementação do Encoder e Decoder Determinístico de Ação\n", - "\n", - "\n", - "Seguindo o modelo conceitual definido pela arquitetura, em que o World Model opera com pares instantâneos `(St​,at​)`, este notebook irá construir e testar a arquitetura básica de codificação de uma única ação em um instante de tempo `t`. O modelo do enconder traduz o objeto JSON que representa a ação da simulação em um vetor latente compacto `za` e o decoder o reconstrói, a fim de testar a corretude do encoder.\n", - "\n", - "Cada ação tem:\n", - "- `time`: timestamp em segundos\n", - "- `type`: tipo de ação (mouse_down)\n", - "- `object`: objeto afetado (ball)\n", - "- `pos`: [x, y] coordenadas da ação\n", - "\n", - "Note que o encoder não codifica o campo `time`, assume-se que a ação e o frame estarão casados temporalmente na etapa do WFM" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "ZIdMiQqrG_H6" - }, - "source": [ - "## 1. Dependências" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "Sdx_icDB2Vdb", - "outputId": "3d0728ea-c642-4a6b-e818-0e84a42c927c" - }, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "" - ] - }, - "metadata": {}, - "execution_count": 26 - } - ], - "source": [ - "# Importações necessárias\n", - "import torch\n", - "import torch.nn as nn\n", - "import numpy as np\n", - "import json\n", - "import random\n", - "import torch.optim as optim\n", - "from torch.utils.data import TensorDataset, DataLoader\n", - "import matplotlib.pyplot as plt\n", - "\n", - "# Garante a reprodutibilidade\n", - "torch.manual_seed(42)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "cdpGn7BkHDxr" - }, - "source": [ - "## 2. Definições do Cenário e Codificação\n", - "\n", - "A primeira etapa consiste em codificar uma ação em um tensor do Pytorch. A ausência de ação corresponde à um tensor nulo." - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": { - "id": "8GiQ-3UBIFqz" - }, - "outputs": [], - "source": [ - "# Dimensões da tela do cenário 1\n", - "SCREEN_WIDTH = 800\n", - "SCREEN_HEIGHT = 600\n", - "\n", - "# Codificação One-Hot\n", - "TYPE_ENCODING = {\n", - " 'mouse_down': [1.0], # Ação presente\n", - " 'none': [0.0] # Ação ausente\n", - "}\n", - "\n", - "OBJECT_ENCODING = {\n", - " 'ball': [1.0], # Cenário 1 só tem bolas\n", - " 'none': [0.0] # Falta de ação, 0 para que o vetor final da falta de ação seja nulo\n", - "}\n", - "\n", - "# Dimensão do vetor de entrada: [type(1)] + [object(1)] + [x_norm(1)] + [y_norm(1)]\n", - "INPUT_VECTOR_DIM = 4\n", - "\n", - "LATENT_ACTION_DIM = 16 # Za: Dimensão do Espaço Latente da Ação" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": { - "id": "WyiQULmkJKEz" - }, - "outputs": [], - "source": [ - "# Função de codificação\n", - "def encoding_function(action_data: dict = None) -> torch.Tensor:\n", - " \"\"\"\n", - " Converte um dicionário de ação ou um sinal de 'ausência de ação' em um tensor\n", - "\n", - " Args:\n", - " action_data: Dicionário de ação (JSON) ou None na ausência dela\n", - "\n", - " Returns:\n", - " Um tensor PyTorch de dimensão [INPUT_VECTOR_DIM]\n", - " \"\"\"\n", - "\n", - " # Caso de ausencia de ação\n", - " if action_data is None:\n", - " type_vector = TYPE_ENCODING['none']\n", - " object_vector = OBJECT_ENCODING['none']\n", - " x_norm = 0.0\n", - " y_norm = 0.0\n", - "\n", - " # Ação positiva (mouse_down)\n", - " elif action_data:\n", - " type_vector = TYPE_ENCODING['mouse_down']\n", - " object_vector = OBJECT_ENCODING.get(action_data['object'], [0.0]) # Pega o vetor da ball\n", - " pos_x = action_data['pos'][0]\n", - " pos_y = action_data['pos'][1]\n", - "\n", - " # Normaliza as coordenadas da tela para o intervalo [0, 1]\n", - " x_norm = pos_x / SCREEN_WIDTH\n", - " y_norm = pos_y / SCREEN_HEIGHT\n", - "\n", - " input_list = type_vector + object_vector + [x_norm, y_norm]\n", - "\n", - " if len(input_list) != INPUT_VECTOR_DIM:\n", - " raise ValueError(f\"Dimensão do vetor inválida: {len(input_list)}\")\n", - "\n", - " return torch.tensor(input_list, dtype=torch.float32)" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "bTmDJytpTMzP", - "outputId": "753ab7be-8f89-473b-853e-c495e4385d31" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Ação presente (mouse_down): [1.0, 1.0, 0.5, 0.5]\n", - "Ausência de ação: [0.0, 0.0, 0.0, 0.0]\n" - ] - } - ], - "source": [ - "# Exemplo de ação mouse_down\n", - "exemplo_acao = {\n", - " \"time\": 9.40,\n", - " \"type\": \"mouse_down\",\n", - " \"object\": \"ball\",\n", - " \"pos\": [400, 300]\n", - "}\n", - "\n", - "# Testando codificação de ação presente\n", - "vetor_acao = encoding_function(exemplo_acao)\n", - "print(\"Ação presente (mouse_down):\", vetor_acao.tolist())\n", - "\n", - "# Testando codificação de ausência de ação (No-Op)\n", - "vetor_none = encoding_function(None)\n", - "print(\"Ausência de ação:\", vetor_none.tolist())\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "dUEH1ACJV0Rz" - }, - "source": [ - "## 3. Criando o Encoder e Decoder\n", - "\n", - "Agora vamos criar uma rede neural simples que transforma esses 4 features em um embedding mais rico. Depois, vamos fazer o mesmo só que para o movimento contrário. Optou-se por uma rede simples inicialmente, para fins de teste." - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": { - "id": "skhXNuOlP1uw" - }, - "outputs": [], - "source": [ - "class TextEncoder(nn.Module):\n", - " \"\"\"\n", - " Encoder determinístico (embedding)\n", - " Mapeia o vetor de entrada para o espaço latente de 16 dimensões\n", - " \"\"\"\n", - "\n", - " def __init__(self, input_dim=INPUT_VECTOR_DIM, latent_dim=LATENT_ACTION_DIM):\n", - " super().__init__()\n", - "\n", - " self.latent_dim = latent_dim\n", - "\n", - " self.net = nn.Sequential(\n", - " nn.Linear(input_dim, 16),\n", - " nn.ReLU(),\n", - " nn.Linear(16, latent_dim)\n", - " )\n", - "\n", - " def forward(self, x):\n", - " return self.net(x)" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": { - "id": "tio4iMccYTiB" - }, - "outputs": [], - "source": [ - "class TextDecoder(nn.Module):\n", - " \"\"\"\n", - " Decoder determinístico (reconstrução)\n", - " Mapeia o vetor latente de volta para o espaço da ação original\n", - " \"\"\"\n", - "\n", - " def __init__(self, latent_dim=LATENT_ACTION_DIM, output_dim=INPUT_VECTOR_DIM):\n", - " super().__init__()\n", - "\n", - " self.net = nn.Sequential(\n", - " nn.Linear(latent_dim, 16),\n", - " nn.ReLU(),\n", - " nn.Linear(16, output_dim)\n", - " )\n", - "\n", - " def forward(self, z):\n", - " x = self.net(z)\n", - " return torch.sigmoid(x)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "qBlYqqB9cBYA" - }, - "source": [ - "## 4. Geração de um dataset sintético simples\n", - "\n", - "Como a estrutura das ações é muito simples, é mais vantajoso montar um dataset sintético com mais ações do que usar o dataset real com as 200 simulações. Note que na simulação real, menos de 1% dos frames terão uma ação correspondente. Mesmo assim, opta-se por fazer um split de 50/50 em dados com ação positiva e nula. Isso se deve principalmente porque caso a divisão que espelha o comportamento real fosse usada, o modelo não teria incentivos para minimizar a perda das ações com clique, e focaria apenas em minimizar ao máximo o erro da ausência de ação, ignorando o outro caso." - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": { - "id": "ORoCvrBVceZp" - }, - "outputs": [], - "source": [ - "NUM_SAMPLES = 2000\n", - "BATCH_SIZE = 64\n", - "\n", - "synthetic_inputs = []\n", - "\n", - "# Gerar amostras de clique\n", - "for _ in range(1000): # 50% de 2000\n", - "\n", - " pos_x = random.randint(50, 750)\n", - " pos_y = random.randint(50, 500)\n", - "\n", - " # Monta a estrutura de dados\n", - " action_data = {\n", - " \"type\": \"mouse_down\",\n", - " \"object\": \"ball\",\n", - " \"pos\": [pos_x, pos_y]\n", - " }\n", - "\n", - " # Codifica e armazena\n", - " synthetic_inputs.append(encoding_function(action_data))\n", - "\n", - "\n", - "# Gerar amostras de Ausência de Ação\n", - "for _ in range(1000): # 50% de 2000\n", - " # Quando não tem ação, passa um None à função de encoding\n", - " synthetic_inputs.append(encoding_function(None))" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "7r3PyF72R1LK", - "outputId": "6f38085c-7097-4cb7-c834-2789c8dd27fd" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Dataset Sintético Gerado: 2000 amostras.\n", - "Shape de um Batch: torch.Size([64, 4])\n" - ] - } - ], - "source": [ - "full_tensor = torch.stack(synthetic_inputs)\n", - "\n", - "# Note que como queremos reconstruir a entrada, ela é a mesma coisa que a saída\n", - "dataset = TensorDataset(full_tensor, full_tensor)\n", - "dataloader = DataLoader(dataset, batch_size=BATCH_SIZE, shuffle=True)\n", - "\n", - "print(f\"Dataset Sintético Gerado: {len(full_tensor)} amostras.\")\n", - "print(f\"Shape de um Batch: {next(iter(dataloader))[0].shape}\")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "U1CNwmw9eGeo" - }, - "source": [ - "## 5. Treinamento e validação\n", - "\n", - "O treinamento e validação são realizados nas células abaixo" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": { - "id": "j2N-9JrVTVBm" - }, - "outputs": [], - "source": [ - "# Iniciação dos modelos e otimizador\n", - "text_encoder = TextEncoder()\n", - "text_decoder = TextDecoder()\n", - "\n", - "# Vamos combinar os parâmetros dos dois modelos em uma única lista de parâmetros e otimizá-los de uma vez\n", - "params = list(text_encoder.parameters()) + list(text_decoder.parameters())\n", - "optimizer = optim.Adam(params, lr=1e-3)\n", - "\n", - "# Função de Perda é a MSE\n", - "loss_function = nn.MSELoss()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "5M8q7ijBJFob" - }, - "source": [ - "#### Construindo a base de dados para validação\n", - "\n", - "Para a validação, definiu-se que 20% do dataset estaria destinado para a validação dos resultados, enquanto que os restantes 80% estariam dedicados para o treinamento do modelo." - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": { - "id": "1kiV2KC3JFoc" - }, - "outputs": [], - "source": [ - "### Separando dados para validação\n", - "from torch.utils.data import random_split,DataLoader\n", - "\n", - "##Definindo-se os tamanhos de cada dataset\n", - "VAL_RATIO = 0.2 # 20% é destinado para validação\n", - "val_size = int(len(dataset) * VAL_RATIO) #Calculado o tamanho do dataset de validação\n", - "train_size = len(dataset) -val_size #Calculado o tamanho de dataset de treinamento\n", - "\n", - "train_dataset, val_dataset = random_split(dataset,[train_size,val_size]) #random_split é executado no dataset a fim de criar cada um dos datasets\n", - "#para a respectivo propósito através do random_split\n", - "\n", - "train_dataloader = DataLoader(train_dataset,batch_size=32,shuffle=True) #Train_dataloader é incializado chamando-se o DataLoader do pytorch e passando o dataset adequado\n", - "val_dataloader = DataLoader(val_dataset,batch_size=32,shuffle=False)\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "BCrX5bDwUOau", - "outputId": "a3c5b769-1791-4596-b311-ddfb0a3058db" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Iniciando treinamento\n", - "Epoch [5/20], Loss de Reconstrução: 0.014194\n", - "Epoch [5/20] | Train Loss: 0.014194 | Val Loss: 0.015762\n", - "Epoch [10/20], Loss de Reconstrução: 0.003613\n", - "Epoch [10/20] | Train Loss: 0.003613 | Val Loss: 0.005375\n", - "Epoch [15/20], Loss de Reconstrução: 0.000926\n", - "Epoch [15/20] | Train Loss: 0.000926 | Val Loss: 0.000958\n", - "Epoch [20/20], Loss de Reconstrução: 0.000083\n", - "Epoch [20/20] | Train Loss: 0.000083 | Val Loss: 0.000128\n" - ] - } - ], - "source": [ - "NUM_EPOCHS = 20\n", - "print(\"Iniciando treinamento\")\n", - "\n", - "train_losses = [] # Perdas de treinamento para plotar depois\n", - "val_losses = [] # Perdas de validação que serão usadas para plotar depois os resultados\n", - "\n", - "for epoch in range(NUM_EPOCHS):\n", - " #Treinamento\n", - " text_decoder.train()\n", - " text_decoder.train()\n", - " total_loss = 0 # Acumula a perda total de cada época\n", - "\n", - " # Loop dos batches\n", - " for data, _ in dataloader:\n", - " optimizer.zero_grad()\n", - "\n", - " # Forward pass, codifica na representação latente\n", - " z_a = text_encoder(data)\n", - "\n", - " # Forward pass, decodifica a representação latente\n", - " reconstruction = text_decoder(z_a)\n", - "\n", - " # Calcula a perda entre a reconstrução e os dados originais\n", - " loss = loss_function(reconstruction, data)\n", - "\n", - " loss.backward() # Backpropagation\n", - " optimizer.step() # Atualiza os pesos do modelo com base nos gradientes\n", - "\n", - " total_loss += loss.item()\n", - "\n", - " avg_train_loss = total_loss/ len(train_dataloader)\n", - " #avg_loss = total_loss / len(dataloader)\n", - " train_losses.append(avg_train_loss)\n", - "\n", - " #Iniciada a validação do treinamento\n", - " #Validação\n", - " text_encoder.eval()\n", - " text_decoder.eval()\n", - " val_loss_total = 0\n", - "\n", - " with torch.no_grad():\n", - " for data,_ in val_dataloader:\n", - " z_a = text_encoder(data)\n", - " reconstruction = text_decoder(z_a)\n", - " val_loss = loss_function(reconstruction,data)\n", - " val_loss_total += val_loss.item()\n", - "\n", - " avg_val_loss = val_loss_total / len(val_dataloader)\n", - " val_losses.append(avg_val_loss)\n", - "\n", - " # Mostra a perda a cada 5 épocas\n", - " if (epoch + 1) % 5 == 0:\n", - " print(f\"Epoch [{epoch+1}/{NUM_EPOCHS}], Loss de Reconstrução: {avg_train_loss:.6f}\")\n", - " print(f\"Epoch [{epoch+1}/{NUM_EPOCHS}] | Train Loss: {avg_train_loss:.6f} | Val Loss: {avg_val_loss:.6f}\")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "8KFGgY8MJFoe" - }, - "source": [ - "## Plotagem dos resultados de treinamento e validação\n", - "Uma vez que o modelo tenha sido devidamente treinado e validado, faz-se importante realizar a representação visual dos dados ao longo do tempo, de tal maneira a representar assim as percas obtidas ao longo do tempo.\n", - "A imagem abaixo representa as perdas totais de validação e treinamento." - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": { - "id": "SP1kpFdKJFoe", - "outputId": "30792517-8e7d-4722-872b-d1f0f2524986", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 488 - } - }, - "outputs": [ - { - "output_type": "display_data", - "data": { - "text/plain": [ - "
" - ], - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAsQAAAHXCAYAAAC7/0wrAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAuUtJREFUeJzs3XlclFX///HXNQMDIouCC4gogiaiuC9plpYWZptpm2WamZZlZX5bf5VmVlp5e9tudVfabrZYtljmVrmHaQpCroECoiCLItvM9fuDmBjWA84wM/B5Ph48wjNnrjnnfV0znbk417k0Xdd1hBBCCCGEaKIMzm6AEEIIIYQQziQDYiGEEEII0aTJgFgIIYQQQjRpMiAWQgghhBBNmgyIhRBCCCFEkyYDYiGEEEII0aTJgFgIIYQQQjRpMiAWQgghhBBNmgyIhRBCCCFEkyYDYiHEOdM0jaeeesqhr3HTTTfh5+fHgw8+yKlTp2jRogXZ2dkOfU2ApUuXomkaR44ccfhrNZQjR46gaRpLly516Ots2LABTdPYsGGDQ19H2E9RURHDhw+nZcuWvPDCC6SkpNCiRQtnN0sIh5MBsRCNRNnArbqfrVu3OruJ9ZaQkMCGDRuYO3cu33zzDUFBQYwcOVL+Ry0aleeee46VK1c6tQ0///wz6enpPProoyxevJiOHTtyxx13OLVNQjQED2c3QAhhX08//TSdOnWqVN65c2cntMY+IiIiiIuLIzQ0lJkzZ5Kenk5ISIizmyWEXT333HNcd911jBkzxmltuPDCC/nll19o06YNs2bNIjMzk+DgYKe1R4iGIgNiIRqZyy+/nP79+zu7GXbl7e1NaGgoAAaDgXbt2jm5Ra4vPz8fHx8fZzfD4QoKCjCZTBgMTesPnmfOnKF58+Z2366fnx9+fn4AeHp6ymBYNBlN6xNEiCauuLiYwMBAJk+eXOmx3NxcvL29efDBB61lGRkZTJkyhbZt2+Lt7U2vXr1YtmxZra9z2223ER4eXqn8qaeeQtO0SuUffvghAwcOxMfHh5YtW3LRRRfx008/WR//6quvGD16NO3atcPLy4vIyEjmzZuH2WyutK0VK1bQr18/mjVrRqtWrZgwYQLHjh2rtc0A8fHxXHLJJTRr1oz27dvzzDPPYLFYKtX7+uuvueKKK5TaU10GiYmJ3HDDDfj7+xMUFMT9999PQUFBldmU9ScwMJCbbrqJlJQUmzrDhw+nR48exMXFcdFFF+Hj48P/+3//D4Ds7Gxuu+02AgICaNGiBZMmTapy7vWff/7JbbfdRkREBN7e3gQHB3P77beTmZmplN3Ro0cZM2YMzZs3p02bNjzwwAMUFhZWWXfbtm2MGjWKgIAAfHx8GDZsGJs2bar1NcrmJH/66ac88cQThIaG4uPjQ25ubp22e+zYMaZMmWLdf506dWL69OkUFRVZ6xw6dIjrr7+ewMBAfHx8OP/88/nuu++qbM9nn33Gs88+S/v27fH29mbEiBEcOHDApu7+/fsZN24cwcHBeHt70759e2666SZycnKA0nn4Z86cYdmyZdZpTrfddhvw7zGTkJDAzTffTMuWLRk6dChQuu+HDx9eqY9VvQctFgsvvfQSMTExeHt707p1a0aNGsXvv/9urfPOO+9wySWX0KZNG7y8vIiOjuaNN96ocn+8/vrrdO/eHS8vL9q1a8c999zTIPP6hXAEOUMsRCOTk5PDyZMnbco0TSMoKAhPT0+uvfZavvzyS958801MJpO1zsqVKyksLOSmm24C4OzZswwfPpwDBw4wY8YMOnXqxIoVK7jtttvIzs7m/vvvt0t7586dy1NPPcWQIUN4+umnMZlMbNu2jXXr1nHZZZcB8O677+Ln58esWbNo3rw569evZ/bs2eTm5vLiiy9at7V06VImT57MgAEDmD9/PsePH+ell15i06ZN/PHHHzXOOU5PT+fiiy+mpKSERx99lObNm/PWW2/RrFmzSnWXLl2Kr68vs2bNwtfXl3Xr1lXZnprccMMNhIeHM3/+fLZu3crLL7/MqVOneP/99611nn32WZ588kluuOEG7rjjDk6cOMErr7zCRRddVKk/mZmZXH755dx0001MmDCBtm3bous611xzDb/99ht33XUX3bp146uvvmLSpEmV2rNmzRoOHTrE5MmTCQ4OJj4+nrfeeov4+Hi2bt1a5ReZMmfPnmXEiBEkJydz33330a5dOz744APWrVtXqe66deu4/PLL6devH3PmzMFgMPDee+9xySWX8OuvvzJw4MBas5s3bx4mk4kHH3yQwsJCTCaT8nZTU1MZOHAg2dnZTJs2jaioKI4dO8bnn39Ofn4+JpOJ48ePM2TIEPLz87nvvvsICgpi2bJlXH311Xz++edce+21Nu1Z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jEYjO3LkCDty5AgDwN5++2125MgR5+wIf/3rX1lUVBTbsmUL++WXX9i4ceNYWloaq66udq7j3nvvZStXrnQ+93aMa48ai5PVamUPP/wwS05OZkePHnU5ZlksFuc66sfJ2/e3PWosTkajkc2bN4/l5+ezgoICtn37djZo0CCWnp7OzGazcx3B3p5qlJeXs5CQELZ69Wq36wiG9tRSKCFuQ1auXMlSU1OZRqNhQ4YMYT/88IPzteHDh7OpU6e6lP/8889Zr169mEajYf3792dbt25t5Rq3LgBubx988IGzTP04zZ492xnT+Ph4NmbMGHb48OHWr3wrmjhxIuvSpQvTaDQsKSmJTZw4kZ07d875OrUlV99++y0DwE6fPt3gtWBtT7t27XL7XauJhSRJbOHChSw+Pp5ptVp23333NYhf165d2aJFi1yWNXaMa48ai1NBQYHHY9auXbuc66gfJ2/f3/aosTiZTCb2wAMPsM6dOzO1Ws26du3Kpk+f3iCxDfb2VOPdd99ler2eGQwGt+sIhvbUUjjGGGvRLmhCCCGEEELaMBpDTAghhBBCgholxIQQQgghJKhRQkwIIYQQQoIaJcSEEEIIISSoUUJMCCGEEEKCGiXEhBBCCCEkqFFCTAghhBBCgholxIQQ0oEsX74c+fn5ga4GIYS0K5QQE0JIB7F06VJ89dVXGDRoUKCrQggh7Yoq0BUghBDSfPv27cPHH3+M3bt3Q6vVBro6hBDSrtClmwkhhBBCSFCjIROEENKOSZKExYsXIy0tDXq9HpmZmfjiiy8AALt37wbHcdi6dSsGDBgAnU6HO++8E8ePH3dZx5dffon+/ftDq9WiW7duWLp0qcvrFosF8+fPR0pKCrRaLXr27In3338fACCKIp566inn9nv37o3ly5e3zs4TQoif0JAJQghpxxYvXoz169djzZo1SE9Px969e/HYY4+hc+fOzjIvvPACli9fjoSEBCxYsAAPPfQQzpw5A7VajUOHDmHChAl49dVXMXHiROzfvx/PPvssYmJiMG3aNADA448/jvz8fKxYsQKZmZkoKChASUkJADkhT05OxsaNGxETE4P9+/djxowZ6NKlCyZMmBCIkBBCiM9oyAQhhLRTFosF0dHR2L59O3JycpzLn376aZhMJsyYMQMjRozAhg0bMHHiRABAaWkpkpOTsW7dOkyYMAFTpkzBzZs38d133znf/+KLL2Lr1q04ceIEzpw5g969eyMvLw+5ubmK6jVr1iwUFRU5e6oJIaStox5iQghpp86dOweTyYT777/fZbnVasXAgQOdz+smy9HR0ejduzdOnToFADh16hTGjRvn8v5hw4Zh2bJlEEURR48ehSAIGD58uMd6rFq1CmvXrkVhYSGqq6thtVqRlZXlhz0khJDWQQkxIYS0U5WVlQCArVu3IikpyeU1rVaL8+fPN3sber2+0dc3bNiAefPmYenSpcjJyUF4eDiWLFmCAwcONHvbhBDSWighJoSQdqpfv37QarUoLCx024NbkxD/8MMPSE1NBQCUlZXhzJkz6Nu3LwCgb9++2Ldvn8v79u3bh169ekEQBGRkZECSJOzZs8ftkIl9+/Zh6NChePbZZxtslxBC2gtKiAkhpJ0KDw/HvHnz8Ic//AGSJOGuu+5CeXk59u3bh4iICHTt2hUA8Oc//xkxMTGIj4/Hn/70J8TGxmL8+PEAgLlz5+KOO+7A66+/jokTJyI/Px/vvPMO/va3vwEAunXrhqlTp+LJJ590nlR36dIlFBcXY8KECUhPT8dHH32Eb7/9Fmlpafj4449x8OBBpKWlBSoshBDiMzqpjhBC2jHGGFasWIHVq1fjwoULiIqKwqBBg7BgwQJIkoQRI0bg66+/xksvvYSzZ88iKysL7733HgYMGOBcx5dffolXXnkFZ8+eRZcuXfDcc89h3rx5ztfNZjMWLFiADRs24NatW0hNTcWCBQvwxBNPwGKx4Pe//z02bdoEjuMwefJkREZG4t///jeOHj0agIgQQojvKCEmhJAOavfu3RgxYgTKysoQFRUV6OoQQkibRRfmIIQQQgghQY0SYkIIIYQQEtRoyAQhhBBCCAlq1ENMCCGEEEKCGiXEhBBCCCEkqFFCTAghhBBCgholxIQQQgghJKhRQkwIIYQQQoIaJcSEEEIIISSoUUJMCCGEEEKCGiXEhBBCCCEkqFFCTAghhBBCgtr/BxcVo+a2Iq9dAAAAAElFTkSuQmCC\n" - }, - "metadata": {} - } - ], - "source": [ - "plt.figure(figsize=(8,5))\n", - "plt.plot(train_losses,label=\"Treinamento\",marker='o')\n", - "plt.plot(val_losses,label=\"Validação\",marker='s')\n", - "plt.title(\"Evolução da perda de reconstrução\")\n", - "plt.xlabel(\"época\")\n", - "plt.ylabel(\"Loss (MSE)\")\n", - "plt.grid(True,linestyle='--',alpha=0.6)\n", - "plt.legend()\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "UzlyAaeCJFof" - }, - "source": [ - "É possível observar através da imagem que o gráfico está caindo constantemente e que não apresenta indícios de overfitting" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "FUY7agyBJFof" - }, - "source": [ - "## Feedbacks adicionais quanto ao treinamento" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": { - "id": "kCXbelSPJFog", - "outputId": "4c1fb895-570f-4071-e9e7-2817b1242755", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 490 - } - }, - "outputs": [ - { - "output_type": "display_data", - "data": { - "text/plain": [ - "
" - ], - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAsQAAAHZCAYAAACB9S1bAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAxLlJREFUeJzs3XlcVPX+x/HXOQMDsovIIqiA4kKauKdWalpopZlW2nI1M+2W1jXr3up3K7XNFvPaYnlbNG9lmS2WLbZYlqlpuVSuIeKCLIoIKMo25/z+ICZHti86MDP4eT4ePITvfOfM9/s+M+N3znzP92imaZoIIYQQQghxjtJd3QAhhBBCCCFcSQbEQgghhBDinCYDYiGEEEIIcU6TAbEQQgghhDinyYBYCCGEEEKc02RALIQQQgghzmkyIBZCCCGEEOc0GRALIYQQQohzmgyIhRBCiAZSWlrKk08+yfLly13dFCHEKWRALIRwqb1796JpGm+88Ua9Ps6qVavQNI1Vq1bV6+MI5ykpKWHAgAE0bdqUp59+mgMHDhASEuLqZp2V+++/n9dee40LLrjA1U0RQpxCBsRCnOPeeOMNNE2z//j6+tKuXTumTJlCdna2q5snXOSJJ55g2bJlLm3DN998Q1ZWFvfffz9z586ldevW3HrrrS5t09n4+OOPeeutt1ixYgXNmzd3dXOEEKfwcnUDhBDu4ZFHHiEuLo6ioiJ+/PFHXn75ZT7//HO2bt2Kn5+fq5snGtgTTzzBNddcw4gRI1zWhosuuogffviB8PBwpk2bxpEjR4iMjHRZe87W3r17+eKLL2jbtq2rmyKEOI0MiIUQAAwdOpQePXoAcOutt9KsWTPmzJnDxx9/zPXXX39W2z5x4sQ5MaguKirCarWi6+fWl2+FhYX4+/s7fbuBgYEEBgYC4O3t7dGDYYB//OMfrm6CEKIa59a7thBC2SWXXAJAWlqaveytt96ie/fuNGnShNDQUMaMGcOBAwcc7jdgwAA6derExo0bufjii/Hz8+P//u//AMjLy+Pmm28mODiYkJAQxo0bR15eXqXH/u2337j55puJj4/H19eXyMhIbrnlFo4cOaLU9vT0dEaMGIG/vz/h4eHcfffdFBcXV1l3/fr1DBkyhODgYPz8/Ojfvz9r1qyp9TEq5iS/++67PPjgg0RHR+Pn50dBQUGdtnvw4EEmTJhAixYt8PHxIS4ujttvv52SkhJ7nT179nDttdcSGhqKn58fF1xwAZ999lmV7Xnvvfd4/PHHiYmJwdfXl0GDBrF7926HuikpKYwaNYrIyEh8fX2JiYlhzJgx5OfnA6BpGoWFhSxatMg+lebmm28GYMaMGWiaxvbt27nhhhto2rQpF154IVC+7wcMGFCpjzfffDOxsbEOZYZh8Nxzz9G5c2d8fX1p3rw5Q4YM4ZdffrHXef3117nkkksIDw/Hx8eHxMREXn755Sr3x0svvcR5552Hj48PLVq0YPLkyVU+t071/vvvo2ka33//faXb/vvf/6JpGlu3bgUgKyuL8ePHExMTg4+PD1FRUVx11VXs3bu3xscA2LlzJ9dccw2hoaH4+vrSo0cPPvnkE4c6FVOXfvjhB2677TaaNWtGUFAQY8eO5ejRo2fc3/Xr13P55ZfTtGlT/P39Of/883nuuefst5/ta02IxkKOEAshqpSamgpAs2bNAHj88cd56KGHuO6667j11ls5fPgwL7zwAhdffDGbN292ONnpyJEjDB06lDFjxnDTTTcRERGBaZpcddVV/Pjjj/z973+nY8eOfPTRR4wbN67SY3/99dfs2bOH8ePHExkZybZt23jllVfYtm0bP/30E5qmVdvukydPMmjQIPbv389dd91FixYtePPNN/n2228r1f32228ZOnQo3bt3Z/r06ei6zsKFC7nkkktYvXo1vXr1qjWnRx99FKvVyr333ktxcTFWq1V5uxkZGfTq1Yu8vDwmTZpEhw4dOHjwIO+//z4nTpzAarWSnZ1N3759OXHiBHfddRfNmjVj0aJFDB8+nPfff5+rr77aoT1PPvkkuq5z7733kp+fz9NPP82NN97I+vXrgfIT1ZKTkykuLubOO+8kMjKSgwcP8umnn5KXl0dwcDBvvvkmt956K7169WLSpEkAtGnTxuFxrr32WhISEnjiiScwTbPWnE43YcIE3njjDYYOHcqtt95KWVkZq1ev5qeffrJ/U/HSSy/RpUsXhg8fjpeXF8uXL+eOO+7AMAwmT55s39aMGTOYOXMmgwcP5vbbb2fXrl28/PLL/Pzzz6xZswZvb+8q23DFFVcQEBDAe++9R//+/R1uW7JkCeeddx6dOnUCYNSoUWzbto0777yT2NhYDh06xNdff83+/fsrDfZPtW3bNvr160d0dDT3338//v7+vPfee4wYMYIPPvig0v6bMmUKISEhzJgxw96Pffv22T/w1KW/X3/9NVdeeSVRUVH84x//IDIykh07dvDpp5/aj1afzWtNiEbFFEKc0xYuXGgC5jfffGMePnzYPHDggPnuu++azZo1M5s0aWKmp6ebe/fuNS0Wi/n444873Pf33383vby8HMr79+9vAub8+fMd6i5btswEzKefftpeVlZWZl500UUmYC5cuNBefuLEiUrtfOedd0zA/OGHH2rsz9y5c03AfO+99+xlhYWFZtu2bU3A/O6770zTNE3DMMyEhAQzOTnZNAzD4bHj4uLMSy+9tMbH+e6770zAjI+Pd2hvXbY7duxYU9d18+eff660/Yr7Tp061QTM1atX2287duyYGRcXZ8bGxpo2m82hPR07djSLi4vtdZ977jkTMH///XfTNE1z8+bNJmAuXbq0xv75+/ub48aNq1Q+ffp0EzCvv/76Srf179/f7N+/f6XycePGma1bt7b//e2335qAedddd1Xbb9Ms32+nS05ONuPj4+1/Hzp0yLRareZll11mz8I0TfPFF180AXPBggXVddE0TdO8/vrrzfDwcLOsrMxelpmZaeq6bj7yyCOmaZrm0aNHTcB85plnatxWVQYNGmR27tzZLCoqcuhj3759zYSEBHtZxeuwe/fuZklJib386aefNgHz448/rlN/y8rKzLi4OLN169bm0aNHHdp0+vPydKqvNSEaE5kyIYQAYPDgwTRv3pyWLVsyZswYAgIC+Oijj4iOjubDDz/EMAyuu+46cnJy7D+RkZEkJCTw3XffOWzLx8eH8ePHO5R9/vnneHl5cfvtt9vLLBYLd955Z6W2NGnSxP57UVEROTk59mWqNm3aVGM/Pv/8c6KiorjmmmvsZX5+fvYjnRW2bNlCSkoKN9xwA0eOHLH3qbCwkEGDBvHDDz9gGEYtqcG4ceMc2qu6XcMwWLZsGcOGDbMfET1VxZG5zz//nF69etmnJQAEBAQwadIk9u7dy/bt2x3uN378eKxWq/3viy66CCifdgEQHBwMwJdffsmJEydq7V91/v73v5/xfT/44AM0TWP69OmVbjv1iOSp887z8/PJycmhf//+7Nmzxz6945tvvqGkpISpU6c6zN2eOHEiQUFBlaaWnG706NEcOnTIYTm+999/H8MwGD16NFD+fLRaraxa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\n" - }, - "metadata": {} - } - ], - "source": [ - "best_epoch = int(np.argmin(val_losses))\n", - "plt.figure(figsize=(8,5))\n", - "plt.plot(train_losses, label=\"Treino\", marker='o')\n", - "plt.plot(val_losses, label=\"Validação\", marker='s')\n", - "plt.axvline(best_epoch, linestyle='--', alpha=0.6, label=f\"Best @ {best_epoch}\")\n", - "plt.title(\"Perda de reconstrução vs época\")\n", - "plt.xlabel(\"Época\"); plt.ylabel(\"Loss (MSE)\"); plt.grid(True, ls='--', alpha=0.5); plt.legend(); plt.show()\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "6C5sQBSjJFoh" - }, - "source": [ - "### Exportação de métricas por época (CSV)" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": { - "id": "27Jx-MNwJFoh", - "outputId": "525cb3e6-7731-4068-a34e-512d015d422e", - "colab": { - "base_uri": "https://localhost:8080/" - } - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Valores salvos em training_history.csv\n" - ] - } - ], - "source": [ - "import pandas as pd\n", - "history = pd.DataFrame({\"epoch\":list(range(1,len(train_losses)+1)),\n", - " \"train_loss\": train_losses, \"val_loss\":val_losses})\n", - "history.to_csv(\"training_history.csv\",index=False)\n", - "print(\"Valores salvos em training_history.csv\")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "BwU9QILdJFoi" - }, - "source": [ - "### Erro por dimensão (quais campos erram mais?)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "jaXgbkzXJFoi" - }, - "source": [ - "MAE => Mean Absolute Error (erro médio de reconstrução em cada campo do vetor de entrada)\n", - "\n", - "[type, object, x , y]\n", - "tipo de ação,\n", - "object => objeto afetado,\n", - "x => Posição x,\n", - "y => Posição y;\n" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": { - "id": "BvF3AZF8JFoi", - "outputId": "849acd56-1418-4440-856f-891884081b18", - "colab": { - "base_uri": "https://localhost:8080/" - } - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "MAE por dimensão: [0.00555877 0.00672707 0.0130372 0.00728562]\n" - ] - } - ], - "source": [ - "import torch\n", - "text_encoder.eval(); text_decoder.eval()\n", - "per_dim_mae = torch.zeros(data.shape[1])\n", - "n = 0\n", - "with torch.no_grad():\n", - " for data, _ in val_dataloader:\n", - " rec = text_decoder(text_encoder(data))\n", - " per_dim_mae += (rec - data).abs().mean(dim=0)\n", - " n += 1\n", - "per_dim_mae /= n\n", - "print(\"MAE por dimensão:\", per_dim_mae.detach().cpu().numpy())\n" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Avaliação simples numérica" - ], - "metadata": { - "id": "YJ71zxnuLTpA" - } - }, - { - "cell_type": "code", - "source": [ - "# Avaliação simples\n", - "with torch.no_grad():\n", - " # Teste 1 — Ação Nula (No-Op)\n", - "\n", - " # Vetor que representa ausência de ação\n", - " v_none_original = encoding_function(None)\n", - "\n", - " # Passa pelo encoder e depois pelo decoder\n", - " z_none = text_encoder(v_none_original.unsqueeze(0))\n", - " reconstruction_none = text_decoder(z_none).squeeze(0)\n", - "\n", - " print(\"Teste 1: Reconstrução da ação nula\")\n", - " print(f\"Original: {v_none_original.tolist()}\")\n", - " print(f\"Reconstruído: {[round(x, 4) for x in reconstruction_none.tolist()]}\")\n", - " print()\n", - "\n", - " # Teste 2 — Ação Positiva (Mouse Down)\n", - " pos_x, pos_y = 640, 120\n", - "\n", - " test_action = {\n", - " \"type\": \"mouse_down\",\n", - " \"object\": \"ball\",\n", - " \"pos\": [pos_x, pos_y]\n", - " }\n", - "\n", - " v_down_original = encoding_function(test_action)\n", - "\n", - " # Codifica e decodifica\n", - " z_down = text_encoder(v_down_original.unsqueeze(0))\n", - " reconstruction_down = text_decoder(z_down).squeeze(0)\n", - "\n", - " # Coordenadas normalizadas esperadas\n", - " x_expected = pos_x / SCREEN_WIDTH\n", - " y_expected = pos_y / SCREEN_HEIGHT\n", - "\n", - " print(\"Teste 2: Reconstrução de ação mouse_down\")\n", - " print(f\"Original: {v_down_original.tolist()}\")\n", - " print(f\"Reconstruído: {[round(x, 4) for x in reconstruction_down.tolist()]}\")\n", - " print()\n", - "\n", - " # Análise das posições normalizadas\n", - " print(\"Componentes de posição (normalizados):\")\n", - " print(f\"Original: x={x_expected:.4f}, y={y_expected:.4f}\")\n", - " print(f\"Reconstruído: x={reconstruction_down[2]:.4f}, y={reconstruction_down[3]:.4f}\")\n", - "\n", - " # Erro máximo absoluto\n", - " max_error = torch.abs(reconstruction_down - v_down_original).max().item()\n", - " print(f\"\\nErro máximo absoluto: {max_error:.6f}\")\n" - ], - "metadata": { - "id": "Gy4obUfoJpoU", - "outputId": "0f629391-f1c9-4d2d-db23-bfcadbfb7e86", - "colab": { - "base_uri": "https://localhost:8080/" - } - }, - "execution_count": 41, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Teste 1: Reconstrução da ação nula\n", - "Original: [0.0, 0.0, 0.0, 0.0]\n", - "Reconstruído: [0.0067, 0.0086, 0.01, 0.0034]\n", - "\n", - "Teste 2: Reconstrução de ação mouse_down\n", - "Original: [1.0, 1.0, 0.800000011920929, 0.20000000298023224]\n", - "Reconstruído: [0.9996, 0.9998, 0.8038, 0.206]\n", - "\n", - "Componentes de posição (normalizados):\n", - "Original: x=0.8000, y=0.2000\n", - "Reconstruído: x=0.8038, y=0.2060\n", - "\n", - "Erro máximo absoluto: 0.005991\n" - ] - } - ] - } - ], - "metadata": { - "colab": { - "provenance": [] - }, - "kernelspec": { - "display_name": "torch251", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.12.12" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} \ No newline at end of file diff --git a/models/Text_Encoder/Text_Encoder.ipynb b/models/Text_Encoder/Text_Encoder.ipynb new file mode 100644 index 0000000..f488b57 --- /dev/null +++ b/models/Text_Encoder/Text_Encoder.ipynb @@ -0,0 +1,803 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "hxYwMDg5G7Oz" + }, + "source": [ + "# Implementação do Encoder e Decoder Determinístico de Ação\n", + "\n", + "\n", + "Seguindo o modelo conceitual definido pela arquitetura, em que o World Model opera com pares instantâneos `(St​,at​)`, este notebook irá construir e testar a arquitetura básica de codificação de uma única ação em um instante de tempo `t`. O modelo do enconder traduz o objeto JSON que representa a ação da simulação em um vetor latente compacto `za` e o decoder o reconstrói, a fim de testar a corretude do encoder.\n", + "\n", + "Cada ação tem:\n", + "- `time`: timestamp em segundos\n", + "- `type`: tipo de ação (mouse_down)\n", + "- `object`: objeto afetado (ball)\n", + "- `pos`: [x, y] coordenadas da ação\n", + "\n", + "Note que o encoder não codifica o campo `time`, assume-se que a ação e o frame estarão casados temporalmente na etapa do WFM" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ZIdMiQqrG_H6" + }, + "source": [ + "## 1. Dependências" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Sdx_icDB2Vdb", + "outputId": "3d0728ea-c642-4a6b-e818-0e84a42c927c" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Importações necessárias\n", + "import torch\n", + "import torch.nn as nn\n", + "import numpy as np\n", + "import json\n", + "import random\n", + "import torch.optim as optim\n", + "from torch.utils.data import TensorDataset, DataLoader\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# Garante a reprodutibilidade\n", + "torch.manual_seed(42)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "cdpGn7BkHDxr" + }, + "source": [ + "## 2. Definições do Cenário e Codificação\n", + "\n", + "A primeira etapa consiste em codificar uma ação em um tensor do Pytorch. A ausência de ação corresponde à um tensor nulo." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "id": "8GiQ-3UBIFqz" + }, + "outputs": [], + "source": [ + "# Dimensões da tela do cenário 1\n", + "SCREEN_WIDTH = 800\n", + "SCREEN_HEIGHT = 600\n", + "\n", + "# Codificação One-Hot\n", + "TYPE_ENCODING = {\n", + " 'mouse_down': [1.0], # Ação presente\n", + " 'none': [0.0] # Ação ausente\n", + "}\n", + "\n", + "OBJECT_ENCODING = {\n", + " 'ball': [1.0], # Cenário 1 só tem bolas\n", + " 'none': [0.0] # Falta de ação, 0 para que o vetor final da falta de ação seja nulo\n", + "}\n", + "\n", + "# Dimensão do vetor de entrada: [type(1)] + [object(1)] + [x_norm(1)] + [y_norm(1)]\n", + "INPUT_VECTOR_DIM = 4\n", + "\n", + "LATENT_ACTION_DIM = 16 # Za: Dimensão do Espaço Latente da Ação" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "id": "WyiQULmkJKEz" + }, + "outputs": [], + "source": [ + "# Função de codificação\n", + "def encoding_function(action_data: dict = None) -> torch.Tensor:\n", + " \"\"\"\n", + " Converte um dicionário de ação ou um sinal de 'ausência de ação' em um tensor\n", + "\n", + " Args:\n", + " action_data: Dicionário de ação (JSON) ou None na ausência dela\n", + "\n", + " Returns:\n", + " Um tensor PyTorch de dimensão [INPUT_VECTOR_DIM]\n", + " \"\"\"\n", + "\n", + " # Caso de ausencia de ação\n", + " if action_data is None:\n", + " type_vector = TYPE_ENCODING['none']\n", + " object_vector = OBJECT_ENCODING['none']\n", + " x_norm = 0.0\n", + " y_norm = 0.0\n", + "\n", + " # Ação positiva (mouse_down)\n", + " elif action_data:\n", + " type_vector = TYPE_ENCODING['mouse_down']\n", + " object_vector = OBJECT_ENCODING.get(action_data['object'], [0.0]) # Pega o vetor da ball\n", + " pos_x = action_data['pos'][0]\n", + " pos_y = action_data['pos'][1]\n", + "\n", + " # Normaliza as coordenadas da tela para o intervalo [0, 1]\n", + " x_norm = pos_x / SCREEN_WIDTH\n", + " y_norm = pos_y / SCREEN_HEIGHT\n", + "\n", + " input_list = type_vector + object_vector + [x_norm, y_norm]\n", + "\n", + " if len(input_list) != INPUT_VECTOR_DIM:\n", + " raise ValueError(f\"Dimensão do vetor inválida: {len(input_list)}\")\n", + "\n", + " return torch.tensor(input_list, dtype=torch.float32)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "bTmDJytpTMzP", + "outputId": "753ab7be-8f89-473b-853e-c495e4385d31" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Ação presente (mouse_down): [1.0, 1.0, 0.5, 0.5]\n", + "Ausência de ação: [0.0, 0.0, 0.0, 0.0]\n" + ] + } + ], + "source": [ + "# Exemplo de ação mouse_down\n", + "exemplo_acao = {\n", + " \"time\": 9.40,\n", + " \"type\": \"mouse_down\",\n", + " \"object\": \"ball\",\n", + " \"pos\": [400, 300]\n", + "}\n", + "\n", + "# Testando codificação de ação presente\n", + "vetor_acao = encoding_function(exemplo_acao)\n", + "print(\"Ação presente (mouse_down):\", vetor_acao.tolist())\n", + "\n", + "# Testando codificação de ausência de ação (No-Op)\n", + "vetor_none = encoding_function(None)\n", + "print(\"Ausência de ação:\", vetor_none.tolist())\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "dUEH1ACJV0Rz" + }, + "source": [ + "## 3. Criando o Encoder e Decoder\n", + "\n", + "Agora vamos criar uma rede neural simples que transforma esses 4 features em um embedding mais rico. Depois, vamos fazer o mesmo só que para o movimento contrário. Optou-se por uma rede simples inicialmente, para fins de teste." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "id": "skhXNuOlP1uw" + }, + "outputs": [], + "source": [ + "class TextEncoder(nn.Module):\n", + " \"\"\"\n", + " Encoder determinístico (embedding)\n", + " Mapeia o vetor de entrada para o espaço latente de 16 dimensões\n", + " \"\"\"\n", + "\n", + " def __init__(self, input_dim=INPUT_VECTOR_DIM, latent_dim=LATENT_ACTION_DIM):\n", + " super().__init__()\n", + "\n", + " self.latent_dim = latent_dim\n", + "\n", + " self.net = nn.Sequential(\n", + " nn.Linear(input_dim, 16),\n", + " nn.ReLU(),\n", + " nn.Linear(16, latent_dim)\n", + " )\n", + "\n", + " def forward(self, x):\n", + " return self.net(x)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "id": "tio4iMccYTiB" + }, + "outputs": [], + "source": [ + "class TextDecoder(nn.Module):\n", + " \"\"\"\n", + " Decoder determinístico (reconstrução)\n", + " Mapeia o vetor latente de volta para o espaço da ação original\n", + " \"\"\"\n", + "\n", + " def __init__(self, latent_dim=LATENT_ACTION_DIM, output_dim=INPUT_VECTOR_DIM):\n", + " super().__init__()\n", + "\n", + " self.net = nn.Sequential(\n", + " nn.Linear(latent_dim, 16),\n", + " nn.ReLU(),\n", + " nn.Linear(16, output_dim)\n", + " )\n", + "\n", + " def forward(self, z):\n", + " x = self.net(z)\n", + " return torch.sigmoid(x)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "qBlYqqB9cBYA" + }, + "source": [ + "## 4. Geração de um dataset sintético simples\n", + "\n", + "Como a estrutura das ações é muito simples, é mais vantajoso montar um dataset sintético com mais ações do que usar o dataset real com as 200 simulações. Note que na simulação real, menos de 1% dos frames terão uma ação correspondente. Mesmo assim, opta-se por fazer um split de 50/50 em dados com ação positiva e nula. Isso se deve principalmente porque caso a divisão que espelha o comportamento real fosse usada, o modelo não teria incentivos para minimizar a perda das ações com clique, e focaria apenas em minimizar ao máximo o erro da ausência de ação, ignorando o outro caso." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "id": "ORoCvrBVceZp" + }, + "outputs": [], + "source": [ + "NUM_SAMPLES = 2000\n", + "BATCH_SIZE = 64\n", + "\n", + "synthetic_inputs = []\n", + "\n", + "# Gerar amostras de clique\n", + "for _ in range(1000): # 50% de 2000\n", + "\n", + " pos_x = random.randint(50, 750)\n", + " pos_y = random.randint(50, 500)\n", + "\n", + " # Monta a estrutura de dados\n", + " action_data = {\n", + " \"type\": \"mouse_down\",\n", + " \"object\": \"ball\",\n", + " \"pos\": [pos_x, pos_y]\n", + " }\n", + "\n", + " # Codifica e armazena\n", + " synthetic_inputs.append(encoding_function(action_data))\n", + "\n", + "\n", + "# Gerar amostras de Ausência de Ação\n", + "for _ in range(1000): # 50% de 2000\n", + " # Quando não tem ação, passa um None à função de encoding\n", + " synthetic_inputs.append(encoding_function(None))" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "7r3PyF72R1LK", + "outputId": "6f38085c-7097-4cb7-c834-2789c8dd27fd" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Dataset Sintético Gerado: 2000 amostras.\n", + "Shape de um Batch: torch.Size([64, 4])\n" + ] + } + ], + "source": [ + "full_tensor = torch.stack(synthetic_inputs)\n", + "\n", + "# Note que como queremos reconstruir a entrada, ela é a mesma coisa que a saída\n", + "dataset = TensorDataset(full_tensor, full_tensor)\n", + "dataloader = DataLoader(dataset, batch_size=BATCH_SIZE, shuffle=True)\n", + "\n", + "print(f\"Dataset Sintético Gerado: {len(full_tensor)} amostras.\")\n", + "print(f\"Shape de um Batch: {next(iter(dataloader))[0].shape}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "U1CNwmw9eGeo" + }, + "source": [ + "## 5. Treinamento e validação\n", + "\n", + "O treinamento e validação são realizados nas células abaixo" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "id": "j2N-9JrVTVBm" + }, + "outputs": [], + "source": [ + "# Iniciação dos modelos e otimizador\n", + "text_encoder = TextEncoder()\n", + "text_decoder = TextDecoder()\n", + "\n", + "# Vamos combinar os parâmetros dos dois modelos em uma única lista de parâmetros e otimizá-los de uma vez\n", + "params = list(text_encoder.parameters()) + list(text_decoder.parameters())\n", + "optimizer = optim.Adam(params, lr=1e-3)\n", + "\n", + "# Função de Perda é a MSE\n", + "loss_function = nn.MSELoss()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "5M8q7ijBJFob" + }, + "source": [ + "#### Construindo a base de dados para validação\n", + "\n", + "Para a validação, definiu-se que 20% do dataset estaria destinado para a validação dos resultados, enquanto que os restantes 80% estariam dedicados para o treinamento do modelo." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "id": "1kiV2KC3JFoc" + }, + "outputs": [], + "source": [ + "### Separando dados para validação\n", + "from torch.utils.data import random_split,DataLoader\n", + "\n", + "##Definindo-se os tamanhos de cada dataset\n", + "VAL_RATIO = 0.2 # 20% é destinado para validação\n", + "val_size = int(len(dataset) * VAL_RATIO) #Calculado o tamanho do dataset de validação\n", + "train_size = len(dataset) -val_size #Calculado o tamanho de dataset de treinamento\n", + "\n", + "train_dataset, val_dataset = random_split(dataset,[train_size,val_size]) #random_split é executado no dataset a fim de criar cada um dos datasets\n", + "#para a respectivo propósito através do random_split\n", + "\n", + "train_dataloader = DataLoader(train_dataset,batch_size=32,shuffle=True) #Train_dataloader é incializado chamando-se o DataLoader do pytorch e passando o dataset adequado\n", + "val_dataloader = DataLoader(val_dataset,batch_size=32,shuffle=False)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "BCrX5bDwUOau", + "outputId": "a3c5b769-1791-4596-b311-ddfb0a3058db" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Iniciando treinamento\n", + "Epoch [5/20], Loss de Reconstrução: 0.014376\n", + "Epoch [5/20] | Train Loss: 0.014376 | Val Loss: 0.014447\n", + "Epoch [10/20], Loss de Reconstrução: 0.003702\n", + "Epoch [10/20] | Train Loss: 0.003702 | Val Loss: 0.004421\n", + "Epoch [15/20], Loss de Reconstrução: 0.000673\n", + "Epoch [15/20] | Train Loss: 0.000673 | Val Loss: 0.000664\n", + "Epoch [20/20], Loss de Reconstrução: 0.000095\n", + "Epoch [20/20] | Train Loss: 0.000095 | Val Loss: 0.000127\n", + "Pesos do Text Encoder salvos!\n" + ] + } + ], + "source": [ + "NUM_EPOCHS = 20\n", + "print(\"Iniciando treinamento\")\n", + "\n", + "train_losses = [] # Perdas de treinamento para plotar depois\n", + "val_losses = [] # Perdas de validação que serão usadas para plotar depois os resultados\n", + "\n", + "for epoch in range(NUM_EPOCHS):\n", + " #Treinamento\n", + " text_decoder.train()\n", + " text_decoder.train()\n", + " total_loss = 0 # Acumula a perda total de cada época\n", + "\n", + " # Loop dos batches\n", + " for data, _ in dataloader:\n", + " optimizer.zero_grad()\n", + "\n", + " # Forward pass, codifica na representação latente\n", + " z_a = text_encoder(data)\n", + "\n", + " # Forward pass, decodifica a representação latente\n", + " reconstruction = text_decoder(z_a)\n", + "\n", + " # Calcula a perda entre a reconstrução e os dados originais\n", + " loss = loss_function(reconstruction, data)\n", + "\n", + " loss.backward() # Backpropagation\n", + " optimizer.step() # Atualiza os pesos do modelo com base nos gradientes\n", + "\n", + " total_loss += loss.item()\n", + "\n", + " avg_train_loss = total_loss/ len(train_dataloader)\n", + " #avg_loss = total_loss / len(dataloader)\n", + " train_losses.append(avg_train_loss)\n", + "\n", + " #Iniciada a validação do treinamento\n", + " #Validação\n", + " text_encoder.eval()\n", + " text_decoder.eval()\n", + " val_loss_total = 0\n", + "\n", + " with torch.no_grad():\n", + " for data,_ in val_dataloader:\n", + " z_a = text_encoder(data)\n", + " reconstruction = text_decoder(z_a)\n", + " val_loss = loss_function(reconstruction,data)\n", + " val_loss_total += val_loss.item()\n", + "\n", + " avg_val_loss = val_loss_total / len(val_dataloader)\n", + " val_losses.append(avg_val_loss)\n", + "\n", + " # Mostra a perda a cada 5 épocas\n", + " if (epoch + 1) % 5 == 0:\n", + " print(f\"Epoch [{epoch+1}/{NUM_EPOCHS}], Loss de Reconstrução: {avg_train_loss:.6f}\")\n", + " print(f\"Epoch [{epoch+1}/{NUM_EPOCHS}] | Train Loss: {avg_train_loss:.6f} | Val Loss: {avg_val_loss:.6f}\")\n", + "\n", + "torch.save(text_encoder.state_dict(), \"text_encoder_weights.pth\")\n", + "print(\"Pesos do Text Encoder salvos!\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "8KFGgY8MJFoe" + }, + "source": [ + "## Plotagem dos resultados de treinamento e validação\n", + "Uma vez que o modelo tenha sido devidamente treinado e validado, faz-se importante realizar a representação visual dos dados ao longo do tempo, de tal maneira a representar assim as percas obtidas ao longo do tempo.\n", + "A imagem abaixo representa as perdas totais de validação e treinamento." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 488 + }, + "id": "SP1kpFdKJFoe", + "outputId": "30792517-8e7d-4722-872b-d1f0f2524986" + }, + "outputs": [ + { + "data": { + "image/png": "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nTsXvV7Pgw8+SF5eHs8//zy33XYbmzZtAsovVEtISKC4uJgpU6YQFhbG0aNH+eabb8jNzSUwMJBFixZx11130adPHyZOnAhATEyMzevceOONdOjQgWeffRZN02rM6XwTJkxgwYIFXH311dx1112UlZWxbt06fvvtN+tfld544w26d+/OiBEj8PLyYvny5dx3331YLBbuv/9+67aefPJJEhMTGTp0KJMmTSIlJYU333yT33//nfXr1+Pt7V3r9gnhVJoQwiN88MEHGmD3n4+Pj7XeDz/8oAHa8uXLbZ4/fPhwLTo62vr7vHnzNED76KOPrGUlJSVa//79NT8/Py0/P99aDmizZs2y/j5u3Ditbdu2ldo4a9Ys7dyPnX379ml6vV677rrrNLPZbFPXYrFYfz5z5kylbd1zzz2ar6+vVlRUZG1by5Ytta5du2pnz5611vvmm280QJs5c2albZxr2rRpGqBt2rTJWpadna0FBgZqgHbo0CFreWFhYY3tqUpFBiNGjLApv++++zRA27Fjh6Zpmnb48GHNYDBozzzzjE29Xbt2aV5eXjblgwYN0gDtrbfesqm7dOlSDdCef/55a1lZWZl22WWXaYD2wQcfVNunTz/9VAO0X375pdo+VRwr//vf/6xlZ86c0dq3b68B2s8//6xpWvk+7dChg5aQkGCzfwsLC7V27dppV155ZbWv8/PPP2uAFh0dbdPe2mx37Nixml6v137//fdK2694bsWxsG7dOutjBQUFWrt27bSoqCjrsVrRns6dO2vFxcXWuq+88ooGaLt27dI0TdO2bdumAdqSJUuq7V/Tpk21cePGVSqvOGZGjx5d6bFBgwZpgwYNqlR+/nvwp59+0gBt6tSpVfZb0+y/1xISEmw+G7KzszWj0ahdddVVNu/b+fPna4D2/vvvV9VFIVyWTJkQwsO8/vrrrFy50ubf999/b338iiuuoHnz5ixevNhadurUKVauXMnNN99sLfvuu+8ICwtj9OjR1jJvb2+mTp3K6dOnWbt27QW3denSpVgsFmbOnFlpDui5ZyTPnQtbUFDAiRMnuOyyyygsLCQ5ORmAP/74g+zsbO677z5MJpO1/jXXXENsbGylP3ef77vvvqNfv342ZyhbtGjBbbfdVqnuuWeNq2pPTc492wYwZcoUazsAvvzySywWCzfddBMnTpyw/gsLC6NDhw78/PPPNs/38fGpNBXmu+++w8vLi0mTJlnLDAaD9bWq6lNRUREnTpygX79+AGzdurXavnz33XeEh4dzww03WMt8fX2tZzorbN++nX379nHrrbdy8uRJa5/OnDnDkCFD+OWXX+xOUTnfuHHjbNqrul2LxcLSpUu59tpr7c6zrzjmvvvuO/r06WOdlgDg5+fHxIkTOXz4MHv27LF53vjx423+2nLZZZcB5dMuAAIDAwH44YcfKCwsrLF/Vbn33nvr/NwvvvgCnU7HrFmzKj1W1Xut4q9NgwYN4uDBg9bpHatWraKkpIRp06bZvG/vvvtuAgICanyvCeGKZMqEEB6mT58+1V5U5+XlxahRo/jkk08oLi7Gx8eHL7/8ktLSUpsB8ZEjR+jQoUOlgWrnzp2tj1+oAwcOoNfriYuLq7ZeUlISjz/+OD/99JN1vmiFiv9JV7SnU6dOlZ4fGxvLr7/+Wu1rHDlyhL59+1Yqt7c9lfbUpEOHDja/x8TEoNfrresd79u3D03TKtWrcP6fpCMiImwGZVDep/DwcPz8/GrsU05ODomJiXz22WdkZ2fXqk9Hjhyhffv2laZVnP86+/btA7A7ZePc12rWrFm1r3f+Kiqq2y0pKSE/P5+uXbtWu/2qjoVzj/1zt9GmTRubehXtP3XqlLW9M2bM4KWXXuLjjz/msssuY8SIEYwZM8Y6WFZhb/UYVQcOHKBVq1YEBwdXW2/9+vXMmjWLjRs3Vhq85+XlERgYWOV7zWg0Eh0d7ZDPBiEamgyIhWiEbrnlFt5++22+//57Ro4cyf/+9z9iY2Pp3r27Q7Zf1XxTlYvOzpebm8ugQYMICAjgqaeeIiYmBpPJxNatW3n44YeVzig6Un215/zMLBYLOp2O77//HoPBUKn++YNce3Oda+Omm25iw4YN/Otf/6JHjx74+flhsVgYNmyYwzKu2M5//vMfevToYbfO+f2y5/y+qm43JydHvbG1YG//ADbzfF988UXuuOMOvv76a3788UemTp1qnT/eunVrpdext491Op3d+cR1ea8dOHCAIUOGEBsby0svvURkZCRGo5HvvvuOl19+ucHfa0I0JBkQC9EIDRw4kPDwcBYvXsyll17KTz/9xGOPPWZTp23btuzcuROLxWJzlrhiSkDbtm2r3H6zZs3sXm1+/pmjmJgYLBYLe/bsqXIgs2bNGk6ePMmXX37JwIEDreWHDh2q1F6AlJQUrrjiCpvHUlJSqm1vxfMrzjSe/9y6tKcm+/btsznjt3//fiwWi3VlgJiYGDRNo127dnTs2LFW267Qtm1bVq9ezenTp20Gmuf36dSpU6xevZrExERmzpxp00bV19m9ezeaptkM7M9/nYqLxAICAhg6dGit+1MV1e22aNGCgIAAdu/eXe322rZtW6ntoHbsVyc+Pp74+Hgef/xxNmzYwCWXXMJbb73F008/DVT9RbI6zZo1s07NOJe999oPP/xATk5OlWeJly9fTnFxMcuWLbM5633+9Jxz32vR0dHW8pKSEg4dOuTQfStEQ5E5xEI0Qnq9nhtuuIHly5ezaNEiysrKbKZLAAwfPpysrCybucZlZWW89tpr+Pn5MWjQoCq3HxMTQ15eHjt37rSWZWZm8tVXX9nUGzlyJHq9nqeeeqrS2aeKs14VZ9/OPQtWUlLCG2+8YVO/V69etGzZkrfeestmua/vv/+evXv3cs0111SbyfDhw/ntt9/YvHmztez48eN8/PHHNvVU21OT119/3eb31157DShfRxrg+uuvx2AwkJiYWOkMoKZpSsuhDR8+nLKyMptls8xms/W1KtjrE8C8efOU+jJ8+HAyMjL4/PPPrWWFhYW88847NvV69uxJTEwML7zwAqdPn660nePHjyu93vlUt6vX6xk5ciTLly+3WWqsQkX/hw8fzubNm9m4caP1sTNnzvDOO+8QFRVV4xSf8+Xn51NWVmZTFh8fj16vtzlWmzZtWutly2JiYkhOTrbJbseOHZWWmxs1ahSappGYmFhpG9W91/Ly8vjggw9s6g8dOhSj0cirr75qU/e9994jLy+vxveaEK5IzhAL4WG+//57uxd2DRgwwOZszs0338xrr73GrFmziI+Pt86PrDBx4kTefvtt7rjjDrZs2UJUVBSff/4569evZ968edbF++255ZZbePjhh7nuuuuYOnUqhYWFvPnmm3Ts2NHmAq327dvz2GOPMXv2bC677DKuv/56fHx8+P3332nVqhVz5sxhwIABNGvWjHHjxjF16lR0Oh2LFi2qNHjz9vbmueeeY/z48QwaNIjRo0dbl12Liopi+vTp1eb20EMPsWjRIoYNG8YDDzxgXXat4kz5uTmqtKcmhw4dYsSIEQwbNoyNGzfy0Ucfceutt1qnrcTExPD000/z6KOPcvjwYUaOHIm/vz+HDh3iq6++YuLEiTZrRttz7bXXcskll/DII49w+PBh4uLi+PLLLyvNCQ4ICGDgwIE8//zzlJaWEhERwY8//qh81vvuu+9m/vz5jB07li1bthAeHs6iRYsq3RhEr9fz3//+l6uvvpouXbowfvx4IiIiOHr0KD///DMBAQEsX768FinWfrvPPvssP/74I4MGDWLixIl07tyZzMxMlixZwq+//kpQUBCPPPIIn376KVdffTVTp04lODiYhQsXcujQIb744ota3wTkp59+YvLkydx444107NiRsrIyFi1ahMFgYNSoUdZ6PXv2ZNWqVbz00ku0atWKdu3a2Z3LfK4777yTl156iYSEBCZMmEB2djZvvfUWXbp0sZnffvnll3P77bfz6quvsm/fPutUmHXr1nH55ZczefJkrrrqKoxGI9deey333HMPp0+f5t1336Vly5ZkZmZat9WiRQseffRREhMTGTZsGCNGjCAlJYU33niD3r17M2bMmFrlI4RLaOhlLYQQ9aO6Zdc4b4ktTStfaikyMlIDtKefftruNo8dO6aNHz9ea968uWY0GrX4+PhK29G0ysuuaZqm/fjjj1rXrl01o9GoderUSfvoo48qLbtW4f3339cuuugia1sHDRqkrVy50vr4+vXrtX79+mlNmjTRWrVqpT300EPW5eMqlvSqsHjxYu2iiy7SfHx8tODgYO22227T0tPTlTLcuXOnNmjQIM1kMmkRERHa7Nmztffee6/Ssmu1ac/5KjLYs2ePdsMNN2j+/v5as2bNtMmTJ9ssF1fhiy++0C699FKtadOmWtOmTbXY2Fjt/vvv11JSUqx1Bg0apHXp0sXu6508eVK7/fbbtYCAAC0wMFC7/fbbrcuAnbsv09PTteuuu04LCgrSAgMDtRtvvFHLyMiwu2/tOXLkiDZixAjN19dXa968ufbAAw9oK1assJvJtm3btOuvv14LCQnRfHx8tLZt22o33XSTtnr16mpfo2KZs6qWL1Pd7pEjR7SxY8dqLVq00Hx8fLTo6Gjt/vvvt1k67cCBA9oNN9ygBQUFaSaTSevTp4/2zTffKLXn0KFDNvkePHhQu/POO7WYmBjNZDJpwcHB2uWXX66tWrXK5nnJycnawIEDtSZNmmiAdQm2imPm+PHjdvv90UcfadHR0ZrRaNR69Oih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uPHGG6Ne1BuL/amlZIS4E+jduzdWq5WioqJay4uKikhLS2twm7S0tGaV707mzZvH+++/z6effkr//v2bta3dbufCCy/k+++/b6Oj63ySk5MZOnRoo22O5b5U7fDhw3z88cfceeedzdouFvtTdb9oTp9pyTmuu6hOhg8fPszatWubHB1uSLTPb3c0aNAgevfu3WibY7k/AfzjH/9gz549zT5fQWz2J7MkIe4EHA4HEyZMYN26dZFlhmGwbt26WqNRNeXl5dUqD7B27dpGy3cHSinmzZvHO++8wyeffEJ2dnaz96HrOtu3byc9Pb0NjrBzKi8vZ//+/Y22ORb7Ul0vvvgiffv25dprr23WdrHYn7Kzs0lLS6vVZ8rKyti8eXOjfaYl57juoDoZ3rdvHx9//DG9evVq9j6ifX67o6NHj3LmzJlG2xyr/ana888/z4QJExg7dmyzt43F/mRaR1/VJ8JWrVqlnE6nWrlypdq1a5eaO3euSk5OVoWFhUoppX72s5+pBx98MFJ+48aNymazqT/96U9q9+7davHixcput6vt27d3VBPa3N13362SkpLU+vXr1YkTJyIPr9cbKVM3To888oj66KOP1P79+9WWLVvU7NmzlcvlUjt37uyIJrSLBx54QK1fv14dPHhQbdy4UU2ZMkX17t1bnTx5UiklfakuXdfVgAED1MKFC+uti9X+5PF41LZt29S2bdsUoP77v/9bbdu2LXJ3hD/84Q8qOTlZvfvuu+rbb79V06dPV9nZ2aqysjKyjyuuuEI9+eSTkb+jneO6oqbiFAgE1PXXX6/69++vvvnmm1rnLL/fH9lH3ThF+/x2RU3FyePxqAULFqj8/Hx18OBB9fHHH6vx48erIUOGKJ/PF9lHrPenaqWlpSo+Pl4tX768wX3EQn9qK5IQdyJPPvmkGjBggHI4HGrixInqiy++iKy77LLL1C233FKr/BtvvKGGDh2qHA6HGjVqlFqzZk07H3H7Ahp8vPjii5EydeM0f/78SExTU1PVNddco7Zu3dr+B9+OZs2apdLT05XD4VD9+vVTs2bNUt9//31kvfSl2j766CMFqD179tRbF6v96dNPP23ws1YdC8Mw1EMPPaRSU1OV0+lUV155Zb34DRw4UC1evLjWsqbOcV1RU3E6ePBgo+esTz/9NLKPunGK9vntipqKk9frVVdddZXq06ePstvtauDAgequu+6ql9jGen+q9uyzz6q4uDhVUlLS4D5ioT+1FU0ppdp0CFoIIYQQQohOTOYQCyGEEEKImCYJsRBCCCGEiGmSEAshhBBCiJgmCbEQQgghhIhpkhALIYQQQoiYJgmxEEIIIYSIaZIQCyGEEEKImCYJsRBCdCNLly4lPz+/ow9DCCG6FEmIhRCim3j88cd5++23GT9+fEcfihBCdCm2jj4AIYQQ52/jxo385S9/Yf369Tidzo4+HCGE6FLkp5uFEEIIIURMkykTQgjRhRmGwZIlS8jOziYuLo6xY8fy17/+FYD169ejaRpr1qxhzJgxuFwuLrnkEnbs2FFrH2+99RajRo3C6XSSlZXF448/Xmu93+9n4cKFZGZm4nQ6ueCCC3j++ecB0HWdO+64I1L/sGHDWLp0afs0XgghWolMmRBCiC5syZIlvPLKK6xYsYIhQ4bw2WefcdNNN9GnT59ImX/9139l6dKlpKWlsWjRIq677jr27t2L3W5ny5YtzJw5k9/+9rfMmjWLTZs28ctf/pJevXpx6623AnDzzTeTn5/PsmXLGDt2LAcPHuT06dNAOCHv378/b775Jr169WLTpk3MnTuX9PR0Zs6c2REhEUKIZpMpE0II0UX5/X5SUlL4+OOPycvLiyy/88478Xq9zJ07l8svv5xVq1Yxa9YsAIqLi+nfvz8rV65k5syZ3HjjjZw6dYq///3vke1//etfs2bNGnbu3MnevXsZNmwYa9euZcqUKaaOa968eRQWFkZGqoUQorOTEWIhhOiivv/+e7xeLz/60Y9qLQ8EAlx44YWRv2smyykpKQwbNozdu3cDsHv3bqZPn15r+8mTJ/PEE0+g6zrffPMNVquVyy67rNHjePrpp3nhhRcoKCigsrKSQCDAuHHjWqGFQgjRPiQhFkKILqq8vByANWvW0K9fv1rrnE4n+/fvP+864uLimly/atUqFixYwOOPP05eXh5ut5vHHnuMzZs3n3fdQgjRXiQhFkKILmrkyJE4nU4KCgoaHMGtToi/+OILBgwYAMDZs2fZu3cvI0aMAGDEiBFs3Lix1nYbN25k6NChWK1WcnJyMAyDDRs2NDhlYuPGjUyaNIlf/vKX9eoVQoiuQhJiIYTootxuNwsWLOBXv/oVhmFw6aWXUlpaysaNG0lMTGTgwIEA/O53v6NXr16kpqbym9/8ht69ezNjxgwAHnjgAS6++GJ+//vfM2vWLPLz83nqqad45plnAMjKyuKWW27h9ttvj1xUd/jwYU6ePMnMmTMZMmQIL7/8Mh999BHZ2dn85S9/4auvviI7O7ujwiKEEM0mF9UJIUQXppRi2bJlLF++nAMHDpCcnMz48eNZtGgRhmFw+eWX89577/Hggw+yb98+xo0bx3PPPceYMWMi+3jrrbd4+OGH2bdvH+np6dx7770sWLAgst7n87Fo0SJWrVrFmTNnGDBgAIsWLeK2227D7/fzi1/8gnfeeQdN05gzZw5JSUl88MEHfPPNNx0QESGEaD5JiIUQoptav349l19+OWfPniU5ObmjD0cIITot+WEOIYQQQggR0yQhFkIIIYQQMU2mTAghhBBCiJgmI8RCCCGEECKmSUIshBBCCCFimiTEQgghhBAipklCLIQQQgghYpokxEIIIYQQIqZJQiyEEEIIIWKaJMRCCCGEECKmSUIshBBCCCFimiTEQgghhBAipv1/kadxj0RTHuQAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize=(8,5))\n", + "plt.plot(train_losses,label=\"Treinamento\",marker='o')\n", + "plt.plot(val_losses,label=\"Validação\",marker='s')\n", + "plt.title(\"Evolução da perda de reconstrução\")\n", + "plt.xlabel(\"época\")\n", + "plt.ylabel(\"Loss (MSE)\")\n", + "plt.grid(True,linestyle='--',alpha=0.6)\n", + "plt.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "UzlyAaeCJFof" + }, + "source": [ + "É possível observar através da imagem que o gráfico está caindo constantemente e que não apresenta indícios de overfitting" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "FUY7agyBJFof" + }, + "source": [ + "## Feedbacks adicionais quanto ao treinamento" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 490 + }, + "id": "kCXbelSPJFog", + "outputId": "4c1fb895-570f-4071-e9e7-2817b1242755" + }, + "outputs": [ + { + "data": { + "image/png": "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vcWyZcvYsWMHpmk6hkucWe97772Xe++9l+TkZLp168Zzzz3HO++8U+l6y+vj4+Oj/BpLTk5m0KBBjr9PnjxJZmYmV155Za3aW/463Lp1a5XbPtf3mhANiYwhFkLU6LrrrsNisTBjxowKZwBN01SaounKK6+ktLTUadosu93OCy+84LRc+RnOM7czZ84cpbpeeeWVZGRk8NFHHznKCgoKePXVV52W69mzJ23btmXWrFmcPHmywnqOHDmitL0zqa5X13VGjBjBkiVLnKYaK1fe/iuvvJL169ezdu1ax2P5+fm8+uqrxMbGkpiYWKv6HT9+nNLSUqeyLl26oOu609R0AQEBNU5bdqa2bduyc+dOp+x+++23CtPNjRw5EtM0mTFjRoV1lLe7stdBXl4eb775ptPyQ4YMwWaz8fzzzzst+8Ybb5CXl8dVV11VY72HDBlCWFgYixYtYtGiRfTu3dtpSEhBQQGFhYUV2hoUFFTldH4AERERDBw4kFdeeYXMzMwKj1f2Gnv11VcpKSlx/P3yyy9TWlrKFVdcUav29ujRg7i4OObMmVNhP1aXMai/14RoSOQMsRCiRm3btuXxxx/noYceYt++fYwYMYKgoCBSU1P59NNPmTBhAvfdd1+16xg2bBj9+vXjwQcfZN++fSQmJvLJJ59UGKcYHBxM//79eeaZZygpKSE6Opr//e9/TvMhV2f8+PG8+OKLjB49mg0bNhAVFcXbb79d4cYguq7z+uuvc8UVV3DeeecxduxYoqOjOXjwIMuXLyc4OJglS5bULqharvfJJ5/kf//7HwMGDGDChAl06tSJzMxMFi9ezE8//URoaCgPPvgg77//PldccQV33303YWFhvPXWW6SmpvLxxx/X+iYgP/zwA5MnT+b666+nffv2lJaW8vbbb2OxWBg5cqRjuZ49e/L9998ze/ZsWrZsSVxcXKVjmU93++23M3v2bJKSkhg3bhyHDx9m/vz5nHfeeY75mQEGDRrEX//6V55//nmSk5MdX8+vWrWKQYMGMXnyZC6//HJsNhvDhg3jzjvv5OTJk7z22mtEREQ4dS6bN2/OQw89xIwZMxg6dCjDhw9n165dvPTSS1xwwQXceuutNWbi4+PDddddxwcffEB+fj6zZs1yenz37t0MHjyYG264gcTERKxWK59++imHDh1i1KhR1a573rx5XHzxxXTp0oXx48cTHx/PoUOHWLt2Lenp6fz2229OyxcXFzu2Vd6Oiy++mOHDh9eqvbqu8/LLLzNs2DC6devG2LFjiYqKYufOnWzbto1vv/32nN9rQjQo9T2thRDCs5RP91TZ1F9n+vjjj82LL77YDAgIMAMCAsyOHTuakyZNMnft2uVYZsCAAeZ5551X6fOPHj1q/vWvfzWDg4PNkJAQ869//atjGrDTp11LT083r732WjM0NNQMCQkxr7/+ejMjI8MEzGnTptVYz/3795vDhw83/f39zfDwcPP//u//zKVLlzpNu1Zu06ZN5nXXXWc2a9bM9PX1Ndu0aWPecMMN5rJly6rdRvk0Z1VNX6a63v3795ujR482mzdvbvr6+prx8fHmpEmTnKZOS0lJMf/yl7+YoaGhpp+fn9m7d2/zyy+/VKpPamqqU7579+41b7/9drNt27amn5+fGRYWZg4aNMj8/vvvnZ63c+dOs3///maTJk1MwDEFW/m0a0eOHKm03e+8844ZHx9v2mw2s1u3bua3335bYdo10yybFuzZZ581O3bsaAImYF5xxRXmhg0bHMt88cUX5vnnn2/6+fmZsbGx5tNPP20uWLDABMzU1FSn9b344otmx44dTR8fH7NFixbmxIkTK0w3Vp3vvvvOBExN08wDBw44PZadnW1OmjTJ7NixoxkQEGCGhISYffr0cZrarzopKSnm6NGjzcjISNPHx8eMjo42r776avOjjz5yLFP+Ply5cqU5YcIEs2nTpmZgYKB5yy23mEePHq2wTtX2/vTTT+Zll11mBgUFmQEBAeb5559vvvDCC47Hz/W9JkRDoZnmWcyoLoQQQrjITz/9xAMPPKB0h8CGauHChYwdO5ZffvmlyotbhRB1R8YQCyGEcKuLL76YHTt2VHpBnhBC1AcZQyyEEMItjhw5woIFC4CyC+YquwhRCCHqg3SIhRBCuIXdbuf555/n2LFj3HrrrZx//vnurpIQopGSMcRCCCGEEKJR84gxxPPmzSM2NhY/Pz/69OnD+vXrq1z2tdde45JLLqFp06Y0bdqUIUOGVFjeNE0eeeQRoqKiaNKkCUOGDKkw0XhOTg633HILwcHBhIaGMm7cOPm6TgghhBCiEXJ7h3jRokVMnTqVadOmsXHjRrp27UpSUlKFe6qXW7FiBTfddBPLly9n7dq1tGrVissvv5yDBw86lnnmmWd4/vnnmT9/PuvWrSMgIICkpCSnidVvueUWtm3bxnfffceXX37Jjz/+yIQJE+q8vUIIIYQQwrO4fchEnz59uOCCC3jxxReBsnu/t2rVirvuuosHH3ywxufb7XaaNm3qmIjfNE1atmzJvffe67hRQF5eHi1atGDhwoWMGjWKHTt2kJiY6DS9zdKlS7nyyitJT0+nZcuWdddgIYQQQgjhUdx6UV1xcTEbNmzgoYcecpTpus6QIUOcblNanYKCAkpKSggLCwMgNTWVrKwsp3u3h4SE0KdPH9auXcuoUaNYu3YtoaGhTnM9DhkyBF3XWbduHddee22N2zUMg4yMDIKCgtA0TbXJQgghhBCinpimyYkTJ2jZsmW1d/Z0a4c4Ozsbu91OixYtnMpbtGjBzp07ldbxwAMP0LJlS0cHOCsry7GOM9dZ/lhWVhYRERFOj1utVsLCwhzLnKmoqMjpnvUHDx4kMTFRqY5CCCGEEMJ9Dhw4QExMTJWPe/W0a0899RQffPABK1aswM/Pr063NXPmTGbMmFGhfPny5QQGBgIQHBxMZGQkWVlZHD9+3LFMs2bNaNasGenp6RQUFDjKIyIiCA0NJTU1lZKSEkd5y5YtCQwMZM+ePRiGAZSdkTYMg3bt2rFv3z6nOrRt25bS0lL279/vKNN1nXbt2nHy5EkyMjIc5T4+PsTFxZGbm+s0Ttvf35+YmBiOHj3K0aNHHeV12SaANm3aYLVaSUlJcUmbsrKyOHbsGE2bNiUwMLBBtKku9lN4eDjZ2dlYrVZKS0sbRJvqYj8ZhsGxY8cIDw8nISGhQbSprvZTRkYG+/fvp2nTpui63iDaJMdyOZZ7+mvP247leXl5nCgqq09sy+aEh4fX+X7atm0bgwYNIigoiOq4dQxxcXEx/v7+fPTRR4wYMcJRPmbMGHJzc/n888+rfO6sWbN4/PHH+f77752GPuzdu5e2bduyadMmunXr5igfMGAA3bp1Y+7cuSxYsIB7772XY8eOOR4vLS3Fz8+PxYsXVzpk4swzxMePH6dVq1bk5OQQHBwMgKZp6LqOYRicHmtV5bquo2laleV2u91RZhgGmZmZREdHV6hb+VcAp79AACwWC6ZpOpWX16WqctW6u6JN1dX9bNtUWlpKRkYGLVu2xGKxNIg21cV+AsjIyCAqKsppyI83t6ku9lP50KiWLVvi4+PTINp0Olfup9LSUg4ePOj4WrIhtEmO5XIsd2Wb5FhuUFhi59EvtwMwbVgiTWw+db6fcnNzCQsLIy8vz9Ffq4xbzxDbbDZ69uzJsmXLHB1iwzBYtmwZkydPrvJ5zzzzDE888QTffvtthXu+x8XFERkZybJlyxwd4uPHj7Nu3TomTpwIQN++fcnNzWXDhg307NkTgB9++AHDMOjTp0+l2/T19cXX17dCucViwWKxOJVVNUaltuWnr9disdC6detKl6ts+XKaptWq3FV1V2nT2ZZX1yYfHx/atGlzTnX0tDbV1X5q1apVpctWVcfaljeE157FYnF6PTWENp3JVW2yWq0V3nvVLe8NbZJjuRzLa1sux/Lq626xmGia7rScO/ZTpdtTWqoOTZ06lddee4233nqLHTt2MHHiRPLz8xk7diwAo0ePdrro7umnn+bhhx9mwYIFxMbGkpWVRVZWlmMOYU3TmDJlCo8//jhffPEFv//+O6NHj6Zly5aOTnenTp0YOnQo48ePZ/369axevZrJkyczatQoj51hwjAMsrOzK3wCEs4kJzWSkxrJSZ1kpUZyUiM5qZGcXMftY4hvvPFGjhw5wiOPPEJWVhbdunVj6dKljovi0tLSnD4lvPzyyxQXF/OXv/zFaT3Tpk1j+vTpAPzjH/8gPz+fCRMmkJuby8UXX8zSpUudxhm/++67TJ48mcGDB6PrOiNHjuT555+v+wafJdM0yc7OpmnTpu6uikeTnNRITmokJ3WSlRrJSY3kpEZych23d4gBJk+eXOUQiRUrVjj9feZFCJXRNI1HH32URx99tMplwsLCeO+992pTTSFEI2SaJiUlJU4Xd4iK7HZ72RjBwkLlryjdzcfHx2vqKoSoWx7RIRZCCE9UXFxMcXExe/fulfnGa1B+IdT+/fu9JitN04iJiXHMFCSEaLykQ+wlNE0jJCTEa/6jcRfJSY3kVDPDMNi/fz9NmjShRYsW2Gw2yasa5WfSfXx8vCIn0zQ5cuQI6enpJCQk1NuZYnnvqZGc1EhOriMdYi+h6zpRUVHurobHk5zUSE41Ky4uxjRNYmJi8Pf3d3d1vEKTJk3cXYVaad68Ofv27aOkpKTeOsTy3lMjOanxtpwsmsaF8WGO3z2J22eZEGrK566UK0mrJzmpkZzUlA8DcON07V7DNE3Hhwhv4Y6zavLeUyM5qfG2nKwWnWu6RXNNt2isFs/qgnpWbUSVTNMkLy/Pq/6zcQfJSY3kpM5b/qPxBGdOmC8qkveeGslJjeTkOjJkwpPlHoCCP25/aBj45qRBZgGUT0Pn3wxCq56QWwghXGHFihUMGjSIY8eOERoa6u7qCCG8lGma5BeXfXAOsFk8auyzdIg9Ve4BeLEnlJbdLtoCxJ25jNUXJm+QTrEQHs5umKxPzeHwiUIigvzoHReGRa+b/whq+g/m9DnbVV100UVkZmYSEhJyDjUTQjR2xXaDJ77aAcD04Yn4Wj1n2kPpEHuqgqOOznCVSovKlpMOsYOmaYSHh3vUp05PJDmpO9eLrZZuzWTGku1k5hU6yqJC/Jg2LJGhnV1/MUxmZqbj90WLFvHII4+wa9cuR9npU4yZpondbsdqrf6/ApvNRmRkZI3brmk9Qt57qiQnNZKT68gYYtGg6LpOeHh4lfdAF2UkJzWapp3TNGJLt2Yy8Z2NTp1hgKy8Qia+s5GlWzOreObZi4yMdPyUT8dU/vfOnTsJCgrim2++oWfPnvj6+vLTTz9hGAYzZ84kLi6OJk2a0LVrVz766CPHOlesWIGmaeTm5gKwcOFCQkND+fbbb+nUqROBgYFcccUVZGdnO7IyDINHH32UmJgYfH19HXchbezkvadGclIjObmOJCgaFMMwOHDggFwIVQPJSc2ZMyeYpklBcanSz4nCEqZ9sY3KLnUpL5v+xXZOFJYorc+VF808+OCDPPXUU+zYsYPzzz+fmTNn8t///pf58+ezbds27rnnHm699VZWrlxZ5ToKCgqYNWsWb7/9Nj/++CNpaWlMnTrVUc+5c+fy3HPPMWvWLLZs2UJSUhLDhw8nOTnZZe3wRvLeUyM5qZGcXEe+3xINimma5OfnyxW3NZCc1J3+H82pEjuJj3zrkvWaQNbxQrpM/5/S8tsfTcLf5ppD9qOPPspll10GQFFREU8++STff/89ffv2BSA+Pp6ffvqJV155hQEDBlS6jpKSEubPn0/btm0BmDRpEo8++qjj8VmzZvHAAw8watQoAJ5++mmWL1/OnDlzmDdvnkva4Y3kvadGclIjObmOdIiFEKKR6dWrl+P3PXv2UFBQ4OgglysuLqZ79+5VrsPf39/RGQaIioriyJEjABw/fpyMjAz69evn9Jx+/frx22+/uaIJQgjhUtIhFkIIRU18LGx/NElp2fWpOdz25i81Lrdw7AX0jgtT2rarBAQEOH4/efIkAF999RXR0dFOy/n6+la5Dh8fH6e/NU2Ts1RCCK8lHWLRoOi6TmRkpFxgUAPJSY2maU4zJ2iapjxs4ZKE5kSF+JGVV1jpOGINiAzx45KE5nU2BZuKxMREfH19SUtLq3J4RG0FBwfTsmVLVq9e7bTO1atX07t3b5dsw1vJe0+N5KTG23KyaBo9Woc6fvck0iH2VP7NyuYZrm7qNatv2XLCQdM0uXGAAslJndVqPatZJiy6xrRhiUx8ZyMaOHWKy9c2bViiWzvDAEFBQdx3333cc889GIbBxRdfTF5eHqtXryY4OJgxY8Yorac8o/J/77//fqZNm0bbtm3p1q0bb775Jps3b+bdd9+ts7Z4A3nvqZGc1HhbTlaLzvW9PHOqWOkQe6rQVmU33fjjTnWGaZKRkUH0rgVoe76H2EtgxMsyB/EZDMNg3759xMbGes0nZneQnNSUzzLh6+t7Vp3ioZ2jePnWHhXmIY6sw3mIz8Zjjz1G8+bNmTlzJnv37iU0NJQePXrwz3/+U3kdp8/EoWkad999N3l5edx7770cPnyYxMREvvjiCxISEuqqGV5B3ntqJCc1kpPraKYM+jorx48fJyQkhLy8PIKDg+t8e3a7neTkZBJC7Vjm9wNM+PvPENGpzrftTRw5JSSc8w0VGjLJqWaFhYXs3buXli1bOubzPVv1eac6dzFNk8LCQvz8/LzmJgGFhYWkpqYSFxeHn59fvWxT3ntqJCc13paTaZoU28tm7rFZ9Ho5Vqj21+TjhLdp3hESh5f9vuo599ZFCKHEomv0bduMa7pF07dtswbXGRZCCBXFdoPpX2xn+hfbHR1jTyEdYm90yX1l/279GI6muLcuQgghhBBeTjrEXkLXdWJiYsrGCEWdD+2HgmnAqtnurppHccpJVElyUlN+62ahxmazubsKHk/ee2okJzWSk+tIgl5C0zQCAwP/HG9TfpZ4ywdwbL/7KuZhKuQkKiU5qbNYLJKTAk3TJCsF8t5TIzmpkZxcRzrEXsJut7N7927sdntZQasLIH4gGKWweq5b6+ZJKuQkKiU5qTFNk6KiIrnhhILyi+okq+rJe0+N5KRGcnId6RB7EcM4YwB6/3+U/bvpbTieWf8V8lAVchKVkpzUSAdPnWSlRt57aiQnNZKTa0iH2JvF9oPWF4G9GNY87+7aCCGEEEJ4JekQe7v+f4wl/vVNOHnEvXURQgghhKiCrml0jg6mc3QwuoeNe5YOsZfQdZ24uLiKV5K2vRRa9oDSU/DzPPdUzoNUmZNwIjmp0TRNZk6oBV9fX3dXwePJe0+N5KTG23Lysejc0qcNt/Rpg4/Fs+rsWbUR1bJaK7nTtqZB//vLfl//GhTk1G+lPFClOYkKJCc1jfHq7YEDBzJlyhTH37GxscyZM6fa5+i6zueff+6yOtjtdi666CISExPZtWsXF198MUeONIxvweS9p0ZyUiM5uYZ0iL2EYRgkJydXPni+wxXQogsUn4R1r9R/5TxItTkJB8lJTfksE2ct9wBkbK76J/eAC2rpbNiwYQwdOrTSx1atWoWmaWzZsqVW6/zll1+YMGFCjcsVFxfXar3V2bFjB+Hh4Tz99NOMHDmStm3b0rx5c5et313kvadGclIjObmOfKxoCDQN+t8Li2+DdS9D30ngV/X9uoUQ9SD3ALzYE0qr6VBbfWHyBght5bLNjhs3jpEjR5Kenk5MTIzTY2+++Sa9evXi/PPPr9U63dER7dy5M1988QVQ1skXQni/olI707/YDsD04Yn4Wi1urtGf5AxxQ9FpOIS3h8I8+OV1d9dGCFFwtPrOMJQ9XnDUpZu9+uqrad68OQsXLnQqP3nyJIsXL2bEiBHcdNNNREdH4+/vT5cuXXj//ferXeeZQyaSk5Pp378/fn5+JCYm8t1331V4zgMPPED79u3x9/cnPj6ehx9+mJKSEqdllixZwgUXXICfnx/h4eFce+21jsfefvttevXqRVBQEJGRkdx8880cPnzY6fkrV66kd+/e+Pr6EhUVxYMPPkhpaaliUkII8SfpEDcUugUuubfs97UvQnG+e+sjRENkmmXvLZWf0lNq6yw9pbY+xTl+rVYro0ePZuHChU7zAi9evBi73c6tt95Kz549+eqrr9i6dSsTJkzgr3/9K+vXr1dav2EYXHfdddhsNtatW8f8+fN54IEHKiwXFBTEwoUL2b59O3PnzuW1117jP//5j+Pxr776imuvvZYrr7ySTZs2sWzZMnr37u14vKSkhMcee4zffvuNzz77jH379nHbbbc5Hj948CBXXnklF1xwAb/99hsvv/wyb7zxBo8//rhSO4QQ4nSaKTOpn5Xjx48TEhJCXl4ewcF1PzzBNE0Mw0DX9aov8rGXln1Fe2wfJM2Evn+v83p5GqWchOSkoLCwkNTUVGJjY/Hz8yvLqTgfnmzpngr9MwNsAUqL7ty5k06dOrF8+XIGDhwIQP/+/WnTpg1vv/12heWvvvpqOnbsyKxZs4Cyi+q6devmOCscGxvLlClTmDJlCv/73/+46qqr2L9/Py1blmWxdOlSrrjiCj755BNGjBhR6Wtq1qxZfPDBB/z6668AXHTRRcTHx/POO+8otenXX3/lggsu4MSJEwQGBvKvf/2Ljz/+mB07dji299JLL/HAAw+Ql5endNV9+T6Oi4vDz89PqR7nSt57aiQnNd6WkzuGTKj21+QMsRep8atAixUunlr2++q5UFJY95XyQPKVqRrJSY03njPo2LEjF110EQsWLABgz549rFq1inHjxmG323nsscfo0qULYWFhBAYG8u2335KWlqa07h07dtCqVStHZxigb9++gHNWixYtol+/fkRGRhIYGMi///1vp21s3ryZwYMHV7mdDRs2MGzYMFq3bk1QUBADBgwAcKxjx44d9O3b16kT0K9fP06ePEl6erpSW9xF3ntqJCc1kpNryEV1XsIwDFJTU0lISMBiqeYTVdebYOXTcPwgbH4HLrij/irpAZRzauQkJzWmaVJcXEyTJk3KCnz8y87UqsjaAgsqn+3Bye1LIVLhIjcff7Xt/mHcuHHcddddzJs3jzfffJO2bdsyYMAAnn76aebOncucOXPo0qULAQEBTJkyxSUzRJSPEV67di233HILM2bMICkpiZCQED744AOee+45x7KOTCuRn59PUlISSUlJvPvuuzRv3py0tDSSkpJcOpOFO8h7T43kpEZych05Q9zQWG3Qb0rZ7z/NAXtJdUsLIWpD08qGLaj8WKvu8DmxNlFbXy2/Dr3hhhvQdZ333nuP//73v9x+++1omsbq1au55ppruPXWW+natSvx8fHs3r1beb2dOnXiwIEDZGZmOsp+/vlnp2XWrFlDmzZt+Ne//kWvXr1ISEhg//79Tsucf/75LFu2rNJt7Ny5k6NHj/LUU09xySWX0LFjxwoX1HXq1Im1a9c6nZVevXo1QUFBFWbXEEKImri9Qzxv3jzHGL0+ffpUe2HHtm3bGDlyJLGxsWiaVulE8eWPnfkzadIkxzIDBw6s8Pjf/va3umiee/T4KwREQN4B2LLI3bURQrhBYGAgN954Iw899BCZmZmOC9ISEhL47rvvWLNmDTt27ODOO+/k0KFDyusdMmQI7du3Z8yYMfz222+sWrWKf/3rX07LJCQkkJaWxgcffEBKSgrPP/88n376qdMy06ZN4/3332fatGns2LGD33//naeffhqA1q1bY7PZeOGFF9i7dy9ffPEFjz32mNPz//73v3PgwAHuuusudu7cyeeff860adOYOnWq19y1S4jGRtc0OrQIpEOLQLl18+kWLVrE1KlTmTZtGhs3bqRr164kJSVVOBNQrqCggPj4eJ566ikiIyMrXeaXX34hMzPT8VM+HdD111/vtNz48eOdlnvmmWdc27g6oHyQ92kC/e4u+33Vc2UX2zUi8p+hGslJzVlfqOLfrGye4epYfcuWqyPjxo3j2LFjJCUlOcb8/vvf/6ZHjx4kJSUxcOBAIiMjGTFihPI6dV3n008/5dSpU/Tu3Zs77riDJ554Avgzq+HDh3PPPfcwefJkunXrxpo1a3j44Yed1jNw4EAWL17MF198QWJiIr169XKcECmfNm7x4sUkJiby1FNPOS74KxcdHc3XX3/N+vXr6dq1K3/7298YN24c//73v882rnoj7z01kpMab8rJx6JzW784busX53G3bnbrLBN9+vThggsu4MUXXwTKxsK0atWKu+66iwcffLDa555+1XN1pkyZwpdffklycrLjYH3mFdRno75nmai1opMwpwucyoHrXofzr6/5OUIIB5fMQJB7oPp5hv2bufSmHN5q7dq1vPTSS5XOgFGX3DHLhBCifnn8LBPFxcVs2LCBIUOG/FkZXWfIkCGsXbvWZdt45513HGPnTvfuu+8SHh5O586deeihhygoKHDJNuuKaZqcPHlS/Yp338A/p11bNQsayW0da51TIyU5qbPb7WefU2graNmt6p8G1Bk2TfOsstq5cyelpaWOu9I1dPLeUyM5qZGcXMdts0xkZ2djt9tp0aKFU3mLFi3YuXOnS7bx2WefkZub6zSZO8DNN99MmzZtaNmyJVu2bOGBBx5g165dfPLJJ1Wuq6ioiKKiP+86dfz4caDsP0u73Q6UfV2o6zqGYTi9OKsqL583sKry8vWWb+fAgQMkJCRU6NyXf11y5r3MLb0nYK5+Hu3ITuzbv4BOwxx1KZ+7sKY61mWbqqt7lW2yWKqsu2malJSUkJaW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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "best_epoch = int(np.argmin(val_losses))\n", + "plt.figure(figsize=(8,5))\n", + "plt.plot(train_losses, label=\"Treino\", marker='o')\n", + "plt.plot(val_losses, label=\"Validação\", marker='s')\n", + "plt.axvline(best_epoch, linestyle='--', alpha=0.6, label=f\"Best @ {best_epoch}\")\n", + "plt.title(\"Perda de reconstrução vs época\")\n", + "plt.xlabel(\"Época\"); plt.ylabel(\"Loss (MSE)\"); plt.grid(True, ls='--', alpha=0.5); plt.legend(); plt.show()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "6C5sQBSjJFoh" + }, + "source": [ + "### Exportação de métricas por época (CSV)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "27Jx-MNwJFoh", + "outputId": "525cb3e6-7731-4068-a34e-512d015d422e" + }, + "outputs": [ + { + "ename": "ModuleNotFoundError", + "evalue": "No module named 'pandas'", + "output_type": "error", + "traceback": [ + "\u001b[31m---------------------------------------------------------------------------\u001b[39m", + "\u001b[31mModuleNotFoundError\u001b[39m Traceback (most recent call last)", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[14]\u001b[39m\u001b[32m, line 1\u001b[39m\n\u001b[32m----> \u001b[39m\u001b[32m1\u001b[39m \u001b[38;5;28;01mimport\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01mpandas\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mas\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01mpd\u001b[39;00m\n\u001b[32m 2\u001b[39m history = pd.DataFrame({\u001b[33m\"\u001b[39m\u001b[33mepoch\u001b[39m\u001b[33m\"\u001b[39m:\u001b[38;5;28mlist\u001b[39m(\u001b[38;5;28mrange\u001b[39m(\u001b[32m1\u001b[39m,\u001b[38;5;28mlen\u001b[39m(train_losses)+\u001b[32m1\u001b[39m)),\n\u001b[32m 3\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mtrain_loss\u001b[39m\u001b[33m\"\u001b[39m: train_losses, \u001b[33m\"\u001b[39m\u001b[33mval_loss\u001b[39m\u001b[33m\"\u001b[39m:val_losses})\n\u001b[32m 4\u001b[39m history.to_csv(\u001b[33m\"\u001b[39m\u001b[33mtraining_history.csv\u001b[39m\u001b[33m\"\u001b[39m,index=\u001b[38;5;28;01mFalse\u001b[39;00m)\n", + "\u001b[31mModuleNotFoundError\u001b[39m: No module named 'pandas'" + ] + } + ], + "source": [ + "import pandas as pd\n", + "history = pd.DataFrame({\"epoch\":list(range(1,len(train_losses)+1)),\n", + " \"train_loss\": train_losses, \"val_loss\":val_losses})\n", + "history.to_csv(\"training_history.csv\",index=False)\n", + "print(\"Valores salvos em training_history.csv\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "BwU9QILdJFoi" + }, + "source": [ + "### Erro por dimensão (quais campos erram mais?)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "jaXgbkzXJFoi" + }, + "source": [ + "MAE => Mean Absolute Error (erro médio de reconstrução em cada campo do vetor de entrada)\n", + "\n", + "[type, object, x , y]\n", + "tipo de ação,\n", + "object => objeto afetado,\n", + "x => Posição x,\n", + "y => Posição y;\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "BvF3AZF8JFoi", + "outputId": "849acd56-1418-4440-856f-891884081b18" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MAE por dimensão: [0.00555877 0.00672707 0.0130372 0.00728562]\n" + ] + } + ], + "source": [ + "import torch\n", + "text_encoder.eval(); text_decoder.eval()\n", + "per_dim_mae = torch.zeros(data.shape[1])\n", + "n = 0\n", + "with torch.no_grad():\n", + " for data, _ in val_dataloader:\n", + " rec = text_decoder(text_encoder(data))\n", + " per_dim_mae += (rec - data).abs().mean(dim=0)\n", + " n += 1\n", + "per_dim_mae /= n\n", + "print(\"MAE por dimensão:\", per_dim_mae.detach().cpu().numpy())\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "YJ71zxnuLTpA" + }, + "source": [ + "## Avaliação simples numérica" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Gy4obUfoJpoU", + "outputId": "0f629391-f1c9-4d2d-db23-bfcadbfb7e86" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Teste 1: Reconstrução da ação nula\n", + "Original: [0.0, 0.0, 0.0, 0.0]\n", + "Reconstruído: [0.0067, 0.0086, 0.01, 0.0034]\n", + "\n", + "Teste 2: Reconstrução de ação mouse_down\n", + "Original: [1.0, 1.0, 0.800000011920929, 0.20000000298023224]\n", + "Reconstruído: [0.9996, 0.9998, 0.8038, 0.206]\n", + "\n", + "Componentes de posição (normalizados):\n", + "Original: x=0.8000, y=0.2000\n", + "Reconstruído: x=0.8038, y=0.2060\n", + "\n", + "Erro máximo absoluto: 0.005991\n" + ] + } + ], + "source": [ + "# Avaliação simples\n", + "with torch.no_grad():\n", + " # Teste 1 — Ação Nula (No-Op)\n", + "\n", + " # Vetor que representa ausência de ação\n", + " v_none_original = encoding_function(None)\n", + "\n", + " # Passa pelo encoder e depois pelo decoder\n", + " z_none = text_encoder(v_none_original.unsqueeze(0))\n", + " reconstruction_none = text_decoder(z_none).squeeze(0)\n", + "\n", + " print(\"Teste 1: Reconstrução da ação nula\")\n", + " print(f\"Original: {v_none_original.tolist()}\")\n", + " print(f\"Reconstruído: {[round(x, 4) for x in reconstruction_none.tolist()]}\")\n", + " print()\n", + "\n", + " # Teste 2 — Ação Positiva (Mouse Down)\n", + " pos_x, pos_y = 640, 120\n", + "\n", + " test_action = {\n", + " \"type\": \"mouse_down\",\n", + " \"object\": \"ball\",\n", + " \"pos\": [pos_x, pos_y]\n", + " }\n", + "\n", + " v_down_original = encoding_function(test_action)\n", + "\n", + " # Codifica e decodifica\n", + " z_down = text_encoder(v_down_original.unsqueeze(0))\n", + " reconstruction_down = text_decoder(z_down).squeeze(0)\n", + "\n", + " # Coordenadas normalizadas esperadas\n", + " x_expected = pos_x / SCREEN_WIDTH\n", + " y_expected = pos_y / SCREEN_HEIGHT\n", + "\n", + " print(\"Teste 2: Reconstrução de ação mouse_down\")\n", + " print(f\"Original: {v_down_original.tolist()}\")\n", + " print(f\"Reconstruído: {[round(x, 4) for x in reconstruction_down.tolist()]}\")\n", + " print()\n", + "\n", + " # Análise das posições normalizadas\n", + " print(\"Componentes de posição (normalizados):\")\n", + " print(f\"Original: x={x_expected:.4f}, y={y_expected:.4f}\")\n", + " print(f\"Reconstruído: x={reconstruction_down[2]:.4f}, y={reconstruction_down[3]:.4f}\")\n", + "\n", + " # Erro máximo absoluto\n", + " max_error = torch.abs(reconstruction_down - v_down_original).max().item()\n", + " print(f\"\\nErro máximo absoluto: {max_error:.6f}\")\n" + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "wfm (3.12.3)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.3" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/models/Text_Encoder/Text_Encoder.py b/models/Text_Encoder/Text_Encoder.py new file mode 100644 index 0000000..9fdba76 --- /dev/null +++ b/models/Text_Encoder/Text_Encoder.py @@ -0,0 +1,453 @@ +""" +Text Encoder for Action Encoding + +This module implements a deterministic encoder and decoder for actions in a simulation. +Each action contains: +- time: timestamp in seconds +- type: action type (mouse_down) +- object: affected object (ball) +- pos: [x, y] coordinates of the action + +Note: The 'time' field is not encoded - temporal alignment is handled separately. +""" + +import json +import random + +import matplotlib.pyplot as plt +import numpy as np +import torch +import torch.nn as nn +import torch.optim as optim +from torch.utils.data import DataLoader, TensorDataset, random_split + + +# ============================================================================= +# Configuration Constants +# ============================================================================= + +# Screen dimensions for scenario 1 +SCREEN_WIDTH = 800 +SCREEN_HEIGHT = 600 + +# One-hot encoding for action type +TYPE_ENCODING = { + 'mouse_down': [1.0], # Action present + 'none': [0.0] # No action +} + +# One-hot encoding for object type +OBJECT_ENCODING = { + 'ball': [1.0], # Scenario 1 only has balls + 'none': [0.0] # No action - zero vector +} + +# Vector dimensions +INPUT_VECTOR_DIM = 4 # [type, object, x_norm, y_norm] +LATENT_ACTION_DIM = 16 # Za: Latent action space dimension + +# Dataset configuration +NUM_SAMPLES = 2000 +BATCH_SIZE = 64 +VAL_RATIO = 0.2 # 20% for validation +NUM_EPOCHS = 20 + +# Set random seed for reproducibility +torch.manual_seed(42) + + +# ============================================================================= +# Encoding Functions +# ============================================================================= + +def encoding_function(action_data: dict = None) -> torch.Tensor: + """ + Convert an action dictionary or 'no action' signal to a tensor. + + Args: + action_data: Action dictionary (JSON) or None for no action + + Returns: + PyTorch tensor of dimension [INPUT_VECTOR_DIM] + """ + # No action case + if action_data is None: + type_vector = TYPE_ENCODING['none'] + object_vector = OBJECT_ENCODING['none'] + x_norm = 0.0 + y_norm = 0.0 + + # Positive action (mouse_down) + elif action_data: + type_vector = TYPE_ENCODING['mouse_down'] + object_vector = OBJECT_ENCODING.get(action_data['object'], [0.0]) + pos_x = action_data['pos'][0] + pos_y = action_data['pos'][1] + + # Normalize screen coordinates to [0, 1] + x_norm = pos_x / SCREEN_WIDTH + y_norm = pos_y / SCREEN_HEIGHT + + input_list = type_vector + object_vector + [x_norm, y_norm] + + if len(input_list) != INPUT_VECTOR_DIM: + raise ValueError(f"Invalid vector dimension: {len(input_list)}") + + return torch.tensor(input_list, dtype=torch.float32) + + +# ============================================================================= +# Model Architectures +# ============================================================================= + +class TextEncoder(nn.Module): + """ + Deterministic encoder that maps input vector to latent space. + """ + + def __init__(self, input_dim=INPUT_VECTOR_DIM, latent_dim=LATENT_ACTION_DIM): + super().__init__() + self.latent_dim = latent_dim + + self.net = nn.Sequential( + nn.Linear(input_dim, 16), + nn.ReLU(), + nn.Linear(16, latent_dim) + ) + + def forward(self, x): + return self.net(x) + + +class TextDecoder(nn.Module): + """ + Deterministic decoder that reconstructs action vector from latent space. + """ + + def __init__(self, latent_dim=LATENT_ACTION_DIM, output_dim=INPUT_VECTOR_DIM): + super().__init__() + + self.net = nn.Sequential( + nn.Linear(latent_dim, 16), + nn.ReLU(), + nn.Linear(16, output_dim) + ) + + def forward(self, z): + x = self.net(z) + return torch.sigmoid(x) + + +# ============================================================================= +# Dataset Generation +# ============================================================================= + +def generate_synthetic_dataset(num_samples=NUM_SAMPLES): + """ + Generate synthetic dataset with 50% action and 50% no-action samples. + + Args: + num_samples: Total number of samples + + Returns: + Tensor of encoded actions + """ + synthetic_inputs = [] + + # Generate action samples (50%) + for _ in range(num_samples // 2): + pos_x = random.randint(50, 750) + pos_y = random.randint(50, 500) + + action_data = { + "type": "mouse_down", + "object": "ball", + "pos": [pos_x, pos_y] + } + + synthetic_inputs.append(encoding_function(action_data)) + + # Generate no-action samples (50%) + for _ in range(num_samples // 2): + synthetic_inputs.append(encoding_function(None)) + + return torch.stack(synthetic_inputs) + + +# ============================================================================= +# Evaluation Utilities +# ============================================================================= + +def calculate_per_dimension_mae(encoder, decoder, dataloader): + """ + Calculate Mean Absolute Error per dimension. + + Args: + encoder: TextEncoder model + decoder: TextDecoder model + dataloader: DataLoader for evaluation + + Returns: + Tensor of MAE per dimension + """ + encoder.eval() + decoder.eval() + + sample_data, _ = next(iter(dataloader)) + per_dim_mae = torch.zeros(sample_data.shape[1]) + n = 0 + + with torch.no_grad(): + for data, _ in dataloader: + rec = decoder(encoder(data)) + per_dim_mae += (rec - data).abs().mean(dim=0) + n += 1 + + return per_dim_mae / n + + +def test_single_actions(encoder, decoder): + """ + Test reconstruction of individual actions. + + Args: + encoder: TextEncoder model + decoder: TextDecoder model + """ + encoder.eval() + decoder.eval() + + with torch.no_grad(): + # Test 1 - No Action + v_none_original = encoding_function(None) + z_none = encoder(v_none_original.unsqueeze(0)) + reconstruction_none = decoder(z_none).squeeze(0) + + print("Test 1: No Action Reconstruction") + print(f"Original: {v_none_original.tolist()}") + print(f"Reconstructed: {[round(x, 4) for x in reconstruction_none.tolist()]}") + print() + + # Test 2 - Mouse Down Action + pos_x, pos_y = 640, 120 + test_action = { + "type": "mouse_down", + "object": "ball", + "pos": [pos_x, pos_y] + } + + v_down_original = encoding_function(test_action) + z_down = encoder(v_down_original.unsqueeze(0)) + reconstruction_down = decoder(z_down).squeeze(0) + + x_expected = pos_x / SCREEN_WIDTH + y_expected = pos_y / SCREEN_HEIGHT + + print("Test 2: Mouse Down Action Reconstruction") + print(f"Original: {v_down_original.tolist()}") + print(f"Reconstructed: {[round(x, 4) for x in reconstruction_down.tolist()]}") + print() + + print("Position components (normalized):") + print(f"Original: x={x_expected:.4f}, y={y_expected:.4f}") + print(f"Reconstructed: x={reconstruction_down[2]:.4f}, y={reconstruction_down[3]:.4f}") + + max_error = torch.abs(reconstruction_down - v_down_original).max().item() + print(f"\nMax absolute error: {max_error:.6f}") + + +# ============================================================================= +# Training Function +# ============================================================================= + +def train_models(encoder, decoder, train_loader, val_loader, num_epochs=NUM_EPOCHS): + """ + Train encoder and decoder models. + + Args: + encoder: TextEncoder model + decoder: TextDecoder model + train_loader: DataLoader for training + val_loader: DataLoader for validation + num_epochs: Number of training epochs + + Returns: + train_losses, val_losses lists + """ + # Combine parameters from both models + params = list(encoder.parameters()) + list(decoder.parameters()) + optimizer = optim.Adam(params, lr=1e-3) + loss_function = nn.MSELoss() + + train_losses = [] + val_losses = [] + + print("Starting training...") + + for epoch in range(num_epochs): + # Training + decoder.train() + encoder.train() + total_loss = 0 + + for data, _ in train_loader: + optimizer.zero_grad() + + # Forward pass + z_a = encoder(data) + reconstruction = decoder(z_a) + + # Calculate loss + loss = loss_function(reconstruction, data) + + # Backward pass + loss.backward() + optimizer.step() + + total_loss += loss.item() + + avg_train_loss = total_loss / len(train_loader) + train_losses.append(avg_train_loss) + + # Validation + encoder.eval() + decoder.eval() + val_loss_total = 0 + + with torch.no_grad(): + for data, _ in val_loader: + z_a = encoder(data) + reconstruction = decoder(z_a) + val_loss = loss_function(reconstruction, data) + val_loss_total += val_loss.item() + + avg_val_loss = val_loss_total / len(val_loader) + val_losses.append(avg_val_loss) + + # Print progress every 5 epochs + if (epoch + 1) % 5 == 0: + print(f"Epoch [{epoch+1}/{num_epochs}], Reconstruction Loss: {avg_train_loss:.6f}") + print(f"Epoch [{epoch+1}/{num_epochs}] | Train Loss: {avg_train_loss:.6f} | Val Loss: {avg_val_loss:.6f}") + + return train_losses, val_losses + + +# ============================================================================= +# Plotting Functions +# ============================================================================= + +def plot_training_history(train_losses, val_losses): + """ + Plot training and validation losses. + + Args: + train_losses: List of training losses per epoch + val_losses: List of validation losses per epoch + """ + plt.figure(figsize=(8, 5)) + plt.plot(train_losses, label="Training", marker='o') + plt.plot(val_losses, label="Validation", marker='s') + plt.title("Reconstruction Loss Evolution") + plt.xlabel("Epoch") + plt.ylabel("Loss (MSE)") + plt.grid(True, linestyle='--', alpha=0.6) + plt.legend() + plt.show() + + +def plot_with_best_epoch(train_losses, val_losses): + """ + Plot training and validation losses with best epoch marked. + + Args: + train_losses: List of training losses per epoch + val_losses: List of validation losses per epoch + """ + best_epoch = int(np.argmin(val_losses)) + + plt.figure(figsize=(8, 5)) + plt.plot(train_losses, label="Training", marker='o') + plt.plot(val_losses, label="Validation", marker='s') + plt.axvline(best_epoch, linestyle='--', alpha=0.6, label=f"Best @ {best_epoch}") + plt.title("Reconstruction Loss vs Epoch") + plt.xlabel("Epoch") + plt.ylabel("Loss (MSE)") + plt.grid(True, linestyle='--', alpha=0.5) + plt.legend() + plt.show() + + +# ============================================================================= +# Main Script +# ============================================================================= + +if __name__ == "__main__": + print("=" * 70) + print("Text Encoder Training") + print("=" * 70) + + # Test encoding functions + example_action = { + "time": 9.40, + "type": "mouse_down", + "object": "ball", + "pos": [400, 300] + } + + print("\nEncoding examples:") + action_vector = encoding_function(example_action) + print(f"Action present: {action_vector.tolist()}") + + none_vector = encoding_function(None) + print(f"No action: {none_vector.tolist()}") + + # Generate synthetic dataset + print("\nGenerating synthetic dataset...") + full_tensor = generate_synthetic_dataset(NUM_SAMPLES) + dataset = TensorDataset(full_tensor, full_tensor) + print(f"Synthetic dataset generated: {len(full_tensor)} samples") + print(f"Batch shape: {next(iter(DataLoader(dataset, batch_size=BATCH_SIZE)))[0].shape}") + + # Split into training and validation + val_size = int(len(dataset) * VAL_RATIO) + train_size = len(dataset) - val_size + + train_dataset, val_dataset = random_split(dataset, [train_size, val_size]) + train_loader = DataLoader(train_dataset, batch_size=BATCH_SIZE, shuffle=True) + val_loader = DataLoader(val_dataset, batch_size=BATCH_SIZE, shuffle=False) + + print(f"Training samples: {train_size}, Validation samples: {val_size}") + + # Initialize models + text_encoder = TextEncoder() + text_decoder = TextDecoder() + + print(f"\nEncoder params: {sum(p.numel() for p in text_encoder.parameters())}") + print(f"Decoder params: {sum(p.numel() for p in text_decoder.parameters())}") + + # Train models + train_losses, val_losses = train_models( + text_encoder, text_decoder, train_loader, val_loader, NUM_EPOCHS + ) + + # Save models + torch.save(text_encoder.state_dict(), "text_encoder_weights.pth") + print("\nText Encoder weights saved!") + + # Plot results + print("\nPlotting training history...") + plot_training_history(train_losses, val_losses) + plot_with_best_epoch(train_losses, val_losses) + + # Calculate per-dimension MAE + per_dim_mae = calculate_per_dimension_mae(text_encoder, text_decoder, val_loader) + print(f"\nMAE per dimension: {per_dim_mae.detach().cpu().numpy()}") + print(" [type, object, x, y]") + + # Test single actions + print("\n" + "=" * 50) + print("Single Action Tests") + print("=" * 50) + test_single_actions(text_encoder, text_decoder) + + print("\nTraining complete!") \ No newline at end of file diff --git a/models/Text_Encoder/__pycache__/Text_Encoder.cpython-312.pyc b/models/Text_Encoder/__pycache__/Text_Encoder.cpython-312.pyc new file mode 100644 index 0000000..b9dec99 Binary files /dev/null and b/models/Text_Encoder/__pycache__/Text_Encoder.cpython-312.pyc differ diff --git a/models/Text_Encoder/text_encoder_weights.pth b/models/Text_Encoder/text_encoder_weights.pth new file mode 100644 index 0000000..8d921d5 Binary files /dev/null and b/models/Text_Encoder/text_encoder_weights.pth differ diff --git a/models/VAE/__pycache__/vae_video.cpython-312.pyc b/models/VAE/__pycache__/vae_video.cpython-312.pyc new file mode 100644 index 0000000..f535626 Binary files /dev/null and b/models/VAE/__pycache__/vae_video.cpython-312.pyc differ diff --git a/models/VAE/vae_video.ipynb b/models/VAE/vae_video.ipynb index 919f482..1e17804 100644 --- a/models/VAE/vae_video.ipynb +++ b/models/VAE/vae_video.ipynb @@ -1626,7 +1626,12 @@ "model = VAE().to(device)\n", "\n", "# history = train(model=model, train_loader=train_loader, test_loader=test_loader)\n", - "history = train(model, train_loader, test_loader, device, 30)" + "history = train(model, train_loader, test_loader, device, 30)\n", + "\n", + "# salva os pesos treinados\n", + "torch.save(model.state_dict(), \"vae_weights.pth\")\n", + "\n", + "print(\"Pesos do VAE salvos\")" ] }, { @@ -1671,7 +1676,8 @@ "provenance": [] }, "kernelspec": { - "display_name": "Python 3", + "display_name": "wfm (3.12.3)", + "language": "python", "name": "python3" }, "language_info": { @@ -1684,7 +1690,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.12" + "version": "3.12.3" } }, "nbformat": 4, diff --git a/models/VAE/vae_video.py b/models/VAE/vae_video.py new file mode 100644 index 0000000..b167346 --- /dev/null +++ b/models/VAE/vae_video.py @@ -0,0 +1,641 @@ +""" +VAE for Video +""" + +import os +import math +import shutil +from typing import Tuple +from datetime import datetime +from PIL import Image +import matplotlib.pyplot as plt + +import cv2 +import torch +import torch.nn as nn +import torch.optim as optim +from torch.nn import functional as F + +import torchvision +from torchvision import transforms +from torch.utils.data import Dataset, DataLoader, random_split + +from sklearn.model_selection import train_test_split + + +# ===================== Video Preprocessing ===================== + +def extract_frames(video_path, frames_dir, frame_step=5): + """Extract frames from video at specified interval.""" + os.makedirs(frames_dir, exist_ok=True) + cap = cv2.VideoCapture(video_path) + frame_count = 0 + saved_count = 0 + + while True: + success, frame = cap.read() + if not success: + break + + if frame_count % frame_step == 0: + frame_path = os.path.join(frames_dir, f"frame_{saved_count:04d}.jpg") + cv2.imwrite(frame_path, frame) + saved_count += 1 + + frame_count += 1 + + cap.release() + print( + f"✅ Extraídos {saved_count} frames (de {frame_count} totais) para {frames_dir}" + ) + + +def process_videos(videos_folder, frames_root="./frames", frame_step=5): + """Process all videos in folder and extract frames.""" + for video_file in os.listdir(videos_folder): + if video_file.lower().endswith((".mp4", ".avi", ".mov")): + video_path = os.path.join(videos_folder, video_file) + video_name = os.path.splitext(video_file)[0] + frames_dir = os.path.join(frames_root, video_name) + if not os.path.exists(frames_dir) or len(os.listdir(frames_dir)) == 0: + extract_frames(video_path, frames_dir, frame_step=frame_step) + + +# ===================== Loss Functions ===================== + +def aggressive_beta(epoch, batch_idx, num_batches, warmup_epochs=8): + """ + MUCH faster beta ramp for difficult data + Reach β=1.0 in 8 epochs (was 15) + """ + total_steps = warmup_epochs * num_batches + current_step = epoch * num_batches + batch_idx + + if current_step >= total_steps: + return 1.0 + + progress = current_step / total_steps + return progress**0.3 # Faster than square root + + +def gradient_weighted_loss(x, x_hat, mu, logvar, beta=1.0): + """ + EXTREME weighting for 99.7% background data + Focus entirely on edges (balls/ground) + """ + batch_size = x.size(0) + + # Sobel edge detection + sobel_x = torch.tensor( + [[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]], dtype=torch.float32, device=x.device + ).view(1, 1, 3, 3) + sobel_y = torch.tensor( + [[-1, -2, -1], [0, 0, 0], [1, 2, 1]], dtype=torch.float32, device=x.device + ).view(1, 1, 3, 3) + + x_padded = torch.nn.functional.pad(x, (1, 1, 1, 1), mode='replicate') + grad_x = torch.nn.functional.conv2d(x_padded, sobel_x) + grad_y = torch.nn.functional.conv2d(x_padded, sobel_y) + gradient_magnitude = torch.sqrt(grad_x**2 + grad_y**2) + + # Normalize + grad_max = gradient_magnitude.max() + if grad_max > 1e-8: + gradient_magnitude = gradient_magnitude / grad_max + + # EXTREME weighting: 1-100x (was 1-21x) + mse = (x_hat - x) ** 2 + weights = 0.1 + 100.0 * gradient_magnitude # Background=0.1, edges=100 + + recon_loss = (mse * weights).sum() / batch_size + + # Free bits KL + kl_per_dim = -0.5 * (1 + logvar - mu.pow(2) - logvar.exp()) + kl_per_dim_clamped = torch.clamp(kl_per_dim - 1.5, min=0.0) # Lower free bits + kl_loss = kl_per_dim_clamped.sum() / batch_size + + actual_kl = -0.5 * torch.sum(1 + logvar - mu.pow(2) - logvar.exp()) / batch_size + + total_loss = recon_loss + beta * kl_loss + return total_loss, recon_loss, actual_kl + + +# ===================== Training Utilities ===================== + +def save_validation_samples( + model, test_loader, global_epoch, device, save_dir, phase_name="" +): + """Save validation set reconstructions.""" + os.makedirs(save_dir, exist_ok=True) + + model.eval() + val_images = next(iter(test_loader))[:8].to(device) + + with torch.no_grad(): + val_recon, _ = model(val_images) + + comparison = torch.cat([val_images, val_recon], dim=0) + + filename = f"{phase_name}_val_epoch_{global_epoch:03d}.png" + filepath = os.path.join(save_dir, filename) + torchvision.utils.save_image(comparison, filepath, nrow=8, padding=2) + + model.train() + + +def save_reconstruction_samples(model, images, epoch, batch_idx, save_dir): + """Save reconstruction samples during training.""" + model.eval() + with torch.no_grad(): + sample_images = images[:4] + reconstructed, _ = model(sample_images) + + comparison = torch.cat([sample_images, reconstructed], dim=3) + + filepath = os.path.join( + save_dir, f"epoch_{epoch + 1}_batch_{batch_idx + 1}.png" + ) + torchvision.utils.save_image(comparison, filepath, nrow=1) + model.train() + + +def validate(model, test_loader, device, beta=1.0): + """Validation with weighting.""" + model.eval() + val_loss = val_recon = val_kl = 0 + + with torch.no_grad(): + for images in test_loader: + images = images.to(device) + reconstructed, encoded = model(images) + mu, logvar = torch.chunk(encoded, 2, dim=1) + + loss, recon_loss, kl_loss = gradient_weighted_loss( + images, reconstructed, mu, logvar, beta=beta + ) + + val_loss += loss.item() + val_recon += recon_loss.item() + val_kl += kl_loss.item() + + model.train() + return ( + val_loss / len(test_loader), + val_recon / len(test_loader), + val_kl / len(test_loader), + ) + + +def save_checkpoint(model, optimizer, epoch, loss, filepath, is_best=False): + """Save model checkpoint.""" + checkpoint = { + "epoch": epoch + 1, + "model_state_dict": model.state_dict(), + "optimizer_state_dict": optimizer.state_dict(), + "loss": loss, + "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), + } + torch.save(checkpoint, filepath) + + if not is_best: + print(f"Checkpoint saved: {filepath}") + + +def plot_training_curves(history, save_dir): + """ + Plot and save training curves. + """ + fig, axes = plt.subplots(2, 2, figsize=(15, 10)) + + epochs = range(1, len(history['train_loss']) + 1) + + # Total Loss + axes[0, 0].plot( + epochs, history['train_loss'], 'b-', label='Train Loss', linewidth=2 + ) + axes[0, 0].plot(epochs, history['val_loss'], 'r-', label='Val Loss', linewidth=2) + axes[0, 0].set_title('Total Loss', fontsize=14, fontweight='bold') + axes[0, 0].set_xlabel('Epoch') + axes[0, 0].set_ylabel('Loss') + axes[0, 0].legend() + axes[0, 0].grid(True, alpha=0.3) + + # Reconstruction Loss + axes[0, 1].plot( + epochs, history['train_recon'], 'b-', label='Train Recon', linewidth=2 + ) + axes[0, 1].plot(epochs, history['val_recon'], 'r-', label='Val Recon', linewidth=2) + axes[0, 1].set_title('Reconstruction Loss', fontsize=14, fontweight='bold') + axes[0, 1].set_xlabel('Epoch') + axes[0, 1].set_ylabel('MSE Loss') + axes[0, 1].legend() + axes[0, 1].grid(True, alpha=0.3) + + # KL Divergence + axes[1, 0].plot(epochs, history['train_kl'], 'b-', label='Train KL', linewidth=2) + axes[1, 0].plot(epochs, history['val_kl'], 'r-', label='Val KL', linewidth=2) + axes[1, 0].set_title('KL Divergence', fontsize=14, fontweight='bold') + axes[1, 0].set_xlabel('Epoch') + axes[1, 0].set_ylabel('KL Loss') + axes[1, 0].legend() + axes[1, 0].grid(True, alpha=0.3) + + # Learning Rate + axes[1, 1].plot(epochs, history['learning_rates'], 'g-', linewidth=2) + axes[1, 1].set_title('Learning Rate Schedule', fontsize=14, fontweight='bold') + axes[1, 1].set_xlabel('Epoch') + axes[1, 1].set_ylabel('Learning Rate') + axes[1, 1].set_yscale('log') + axes[1, 1].grid(True, alpha=0.3) + + plt.tight_layout() + plt.savefig( + os.path.join(save_dir, 'training_curves.png'), dpi=150, bbox_inches='tight' + ) + plt.close() + + +def train( + model, train_loader, test_loader, device, num_epochs=50, save_dir="./saved_models" +): + """ + Training for 99.7% background data. + """ + os.makedirs(save_dir, exist_ok=True) + os.makedirs("./reconstructed_samples", exist_ok=True) + + optimizer = torch.optim.Adam(model.parameters(), lr=1e-3) # Higher LR + scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau( + optimizer, mode='min', factor=0.5, patience=3 + ) + + history = { + "train_loss": [], + "train_recon": [], + "train_kl": [], + "val_loss": [], + "val_recon": [], + "val_kl": [], + "learning_rates": [], + "betas": [], + } + + avg_train_loss = 0 + best_val_loss = float("inf") + num_batches = len(train_loader) + + print("\n" + "=" * 70) + print(f"Training Starting - {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") + print("=" * 70) + print(f"Device: {device}") + print(f"Epochs: {num_epochs}") + print("=" * 70 + "\n") + + for epoch in range(num_epochs): + model.train() + train_loss = 0 + train_recon = 0 + train_kl = 0 + epoch_beta_sum = 0 + + for batch_idx, images in enumerate(train_loader): + images = images.to(device) + + beta = aggressive_beta(epoch, batch_idx, num_batches, warmup_epochs=8) + epoch_beta_sum += beta + + # Forward + recon, encoded = model(images) + mu, logvar = torch.chunk(encoded, 2, dim=1) + + # Gradient weighting + loss, recon_loss, kl_loss = gradient_weighted_loss( + images, recon, mu, logvar, beta=beta + ) + + # Backward + optimizer.zero_grad() + loss.backward() + torch.nn.utils.clip_grad_norm_( + model.parameters(), max_norm=2.0 + ) # Higher clip + optimizer.step() + + train_loss += loss.item() + train_recon += recon_loss.item() + train_kl += kl_loss.item() + + if (batch_idx + 1) % 20 == 0: + print( + f"E[{epoch+1:02d}/{num_epochs}] " + f"B[{batch_idx+1:03d}/{num_batches}] | " + f"L:{loss.item():.3f} R:{recon_loss.item():.3f} " + f"KL:{kl_loss.item():.3f} β:{beta:.3f}" + ) + + if beta > 0.2 and kl_loss.item() < 1.0: + print(f" KL={kl_loss.item():.2f} still low at β={beta:.2f}") + + if (batch_idx + 1) % 100 == 0: + save_reconstruction_samples( + model, images, epoch, batch_idx, "./reconstructed_samples" + ) + + # Epoch metrics + avg_train_loss = train_loss / num_batches + avg_train_recon = train_recon / num_batches + avg_train_kl = train_kl / num_batches + avg_beta = epoch_beta_sum / num_batches + + # Validation + val_loss, val_recon, val_kl = validate( + model, test_loader, device, beta=avg_beta + ) + + scheduler.step(val_loss) + current_lr = optimizer.param_groups[0]["lr"] + + # Update history + history['train_loss'].append(avg_train_loss) + history['train_recon'].append(avg_train_recon) + history['train_kl'].append(avg_train_kl) + history['val_loss'].append(val_loss) + history['val_recon'].append(val_recon) + history['val_kl'].append(val_kl) + history['learning_rates'].append(current_lr) + history['betas'].append(avg_beta) + + print(f"\n{'='*70}") + print(f"Epoch [{epoch+1}/{num_epochs}] Summary:") + print(f"{'-'*70}") + print( + f" Train: L={avg_train_loss:.4f} R={avg_train_recon:.4f} KL={avg_train_kl:.4f}" + ) + print(f" Val: L={val_loss:.4f} R={val_recon:.4f} KL={val_kl:.4f}") + print(f" Beta={avg_beta:.3f} LR={current_lr:.2e}") + + if avg_beta >= 0.8: + if avg_train_kl < 1.0: + print(f" CRITICAL: KL={avg_train_kl:.2f} < 1.0") + elif avg_train_kl < 2.0: + print(f" WARNING: KL={avg_train_kl:.2f} < 2.0") + else: + print(f" KL healthy: {avg_train_kl:.2f}") + else: + print(f" ℹ Warmup: β={avg_beta:.2f}") + + print(f"{'='*70}\n") + + if val_loss < best_val_loss: + best_val_loss = val_loss + save_checkpoint( + model, + optimizer, + epoch, + val_loss, + os.path.join(save_dir, 'best_model.pth'), + is_best=True, + ) + print(f" Best model saved! (Val Loss: {val_loss:.4f})\n") + + if (epoch + 1) % 5 == 0: + save_checkpoint( + model, + optimizer, + epoch, + avg_train_loss, + os.path.join(save_dir, f"checkpoint_epoch_{epoch+1}.pth"), + ) + save_validation_samples( + model, test_loader, epoch, device, "./reconstructed_samples" + ) + + torch.cuda.empty_cache() + + save_checkpoint( + model, + optimizer, + num_epochs - 1, + avg_train_loss, + os.path.join(save_dir, "final_model.pth"), + ) + + print("\n Training Complete!") + print(f"Best Val Loss: {best_val_loss:.4f}") + print("=" * 70 + "\n") + + return history + + +# ===================== Dataset ===================== + +class VideoFramesDataset(Dataset): + """Dataset for video frames.""" + + def __init__(self, frames_dir, transform=None): + # Recursively find all .jpg frames + self.frame_files = sorted( + [ + os.path.join(root, f) + for root, _, files in os.walk(frames_dir) + for f in files + if f.lower().endswith(".jpg") + ] + ) + self.transform = transform + + def __len__(self): + return len(self.frame_files) + + def __getitem__(self, idx): + img_path = self.frame_files[idx] + image = Image.open(img_path).convert("RGB") + if self.transform: + image = self.transform(image) + return image + + +# ===================== Model Architecture ===================== + +class ConvBlock(nn.Module): + """Convolutional block with batch norm and ReLU.""" + + def __init__( + self, in_channels, out_channels, kernel_size=3, stride=1, padding=1 + ) -> None: + super().__init__() + self.conv = nn.Conv2d(in_channels, out_channels, kernel_size, stride, padding) + self.batch_norm = nn.BatchNorm2d(out_channels) + self.activation = nn.ReLU(inplace=True) + + def forward(self, x: torch.Tensor): + return self.activation(self.batch_norm(self.conv(x))) + + +class ResidualBlock(nn.Module): + """Residual block with two convolutions.""" + + def __init__(self, channels) -> None: + super().__init__() + self.conv1 = nn.Conv2d( + in_channels=channels, + out_channels=channels, + kernel_size=3, + padding=1, + ) + self.conv2 = nn.Conv2d( + in_channels=channels, + out_channels=channels, + kernel_size=3, + padding=1, + ) + self.batch_norm_1 = nn.BatchNorm2d(channels) + self.batch_norm_2 = nn.BatchNorm2d(channels) + + def forward(self, x): + residual = x + out = F.relu(self.batch_norm_1(self.conv1(x))) + out = self.batch_norm_2(self.conv2(out)) + return F.relu(out + residual) + + +class VAE(nn.Module): + """Variational Autoencoder for video frames.""" + + def __init__(self) -> None: + super().__init__() + + self.encoder = nn.Sequential( + nn.utils.spectral_norm(nn.Conv2d(1, 32, 3, stride=1, padding=1)), + nn.BatchNorm2d(32), + nn.ReLU(inplace=True), + nn.utils.spectral_norm(nn.Conv2d(32, 64, 3, stride=2, padding=1)), + nn.BatchNorm2d(64), + nn.ReLU(inplace=True), + ResidualBlock(64), + nn.utils.spectral_norm(nn.Conv2d(64, 128, 3, stride=2, padding=1)), + nn.BatchNorm2d(128), + nn.ReLU(inplace=True), + ResidualBlock(128), + nn.utils.spectral_norm(nn.Conv2d(128, 256, 3, stride=2, padding=1)), + nn.BatchNorm2d(256), + nn.ReLU(inplace=True), + ResidualBlock(256), + nn.utils.spectral_norm(nn.Conv2d(256, 16, kernel_size=1)), + ) + + self.decoder_main = nn.Sequential( + ConvBlock(8, 64, kernel_size=1, padding=0), + nn.Upsample(scale_factor=2, mode="nearest"), + ConvBlock(64, 32, kernel_size=3, padding=1), + ResidualBlock(32), + nn.Upsample(scale_factor=2, mode="nearest"), + ConvBlock(32, 16, kernel_size=3, padding=1), + nn.Upsample(scale_factor=2, mode="nearest"), + nn.Conv2d(16, 32, kernel_size=3, padding=1), + ) + + # Simple final layer + self.final_conv = nn.Conv2d(32, 1, kernel_size=3, padding=1) + + # Initialize + self._initialize_weights() + + def _initialize_weights(self): + nn.init.xavier_normal_(self.final_conv.weight, gain=0.02) + nn.init.constant_(self.final_conv.bias, 0.0) + + def reparametrization(self, mean, log_variance): + std = torch.exp(0.5 * log_variance) + eps = torch.randn_like(std) + return eps.mul(std).add_(mean) + + def decoder(self, z): + x = self.decoder_main(z) + x = self.final_conv(x) + return torch.clamp(x, 0, 1) + + def forward(self, x): + encoded = self.encoder(x) + mean, log_variance = torch.chunk(encoded, 2, dim=1) + log_variance = torch.clamp(log_variance, -10, 10) + z = self.reparametrization(mean, log_variance) + reconstructed = self.decoder(z) + return reconstructed, encoded + + +# ===================== Main Training Script ===================== + +def main(): + """Main training function.""" + + # Configuration + videos_folder = "dataset/scenario1/videos" # Folder with videos + frames_root = "frames" + frame_step = 5 + batch_size = 256 + num_epochs = 30 + save_dir = "./saved_models" + + # Extract frames from all videos + print("Extracting frames from videos...") + process_videos(videos_folder, frames_root, frame_step) + + # Transform for greyscale images + transform = transforms.Compose( + [ + transforms.Resize((64, 64)), + transforms.Grayscale(num_output_channels=1), + transforms.ToTensor(), + ] + ) + + # Create dataset from frames + print("Creating dataset...") + full_dataset = VideoFramesDataset(frames_root, transform=transform) + + # Split data into training and testing + total_size = len(full_dataset) + train_size = int(0.8 * total_size) + test_size = total_size - train_size + train_dataset, test_dataset = random_split(full_dataset, [train_size, test_size]) + + # Create dataloaders + train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True) + test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False) + + # Define device + device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + + print(f"train_dataset: {len(train_dataset)} frames") + print(f"test_dataset: {len(test_dataset)} frames") + print(f"device: {device}") + + # Create and train model + print("\n" + "=" * 70) + print("EXTREME Training Config -", datetime.now().strftime('%Y-%m-%d %H:%M:%S')) + print("=" * 70) + print("Device:", device) + print("Learning Rate: 1e-3 (higher)") + print("Epochs:", num_epochs) + print("Beta warmup: 8 epochs (ultra-fast)") + print("Free bits: 1.5 nats (lower)") + print("Edge weighting: 100x (extreme)") + print("Data: 99.7% background → needs extreme measures") + print("=" * 70 + "\n") + + model = VAE().to(device) + + # Train model + history = train(model, train_loader, test_loader, device, num_epochs, save_dir) + + # Save trained weights + torch.save(model.state_dict(), "vae_weights.pth") + print("Pesos do VAE salvos") + + # Plot training curves + plot_training_curves(history, save_dir) + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/models/VAE/vae_weights.pth b/models/VAE/vae_weights.pth new file mode 100644 index 0000000..ffd4682 Binary files /dev/null and b/models/VAE/vae_weights.pth differ diff --git a/models/__pycache__/latent_fusion.cpython-312.pyc b/models/__pycache__/latent_fusion.cpython-312.pyc new file mode 100644 index 0000000..7226022 Binary files /dev/null and b/models/__pycache__/latent_fusion.cpython-312.pyc differ diff --git a/models/VAE/latent_fusion.ipynb b/models/latent_fusion.ipynb similarity index 100% rename from models/VAE/latent_fusion.ipynb rename to models/latent_fusion.ipynb diff --git a/models/latent_fusion.py b/models/latent_fusion.py new file mode 100644 index 0000000..2aded75 --- /dev/null +++ b/models/latent_fusion.py @@ -0,0 +1,240 @@ +#!/usr/bin/env python +# coding: utf-8 + +""" +Latent Fusion Module +-------------------- + +Implementa Spatial Broadcast Fusion entre: + +• z_visual → tensor visual (B, C, H, W) +• z_action → vetor latente da ação (B, A) + +Saída: + +• z_fused → tensor combinado (B, C+A, H, W) + +Seguro para importação. +Testes executam apenas se rodar diretamente. +""" + +import torch +import torch.nn as nn + + +# ========================================================= +# FUSER +# ========================================================= + +class SpatialBroadcastFuser(nn.Module): + """ + Spatial Broadcast Fusion + + Expande o vetor latente da ação espacialmente e concatena + com o tensor visual no eixo dos canais. + """ + + def __init__(self, height=None, width=None): + super().__init__() + + self.height = height + self.width = width + + + def forward(self, z_visual: torch.Tensor, z_action: torch.Tensor): + + """ + Args: + + z_visual : (B, C, H, W) + + z_action : (B, A) + + Returns: + + z_fused : (B, C+A, H, W) + """ + + if z_visual.dim() != 4: + raise ValueError( + f"z_visual deve ser 4D (B,C,H,W), recebido {z_visual.shape}" + ) + + if z_action.dim() != 2: + raise ValueError( + f"z_action deve ser 2D (B,A), recebido {z_action.shape}" + ) + + B, C, H, W = z_visual.shape + + height = self.height if self.height is not None else H + width = self.width if self.width is not None else W + + # Confere consistência + if height != H or width != W: + raise ValueError( + f"Dimensões incompatíveis: visual=({H},{W}) vs fuser=({height},{width})" + ) + + # (B, A) → (B, A, 1, 1) + z_action_expanded = z_action.unsqueeze(-1).unsqueeze(-1) + + # (B, A, H, W) + z_action_tiled = z_action_expanded.expand(-1, -1, height, width) + + # concatena canais + z_fused = torch.cat( + [z_visual, z_action_tiled], + dim=1 + ) + + return z_fused + + +# ========================================================= +# PROBE (opcional — para debug e validação) +# ========================================================= + +class ActionProbe(nn.Module): + """ + Rede auxiliar que tenta recuperar z_action do tensor fundido. + + Usado apenas para testes de integridade da fusão. + """ + + def __init__(self, in_channels, action_dim): + super().__init__() + + self.gap = nn.AdaptiveAvgPool2d(1) + + self.linear = nn.Linear( + in_channels, + action_dim + ) + + + def forward(self, x): + + x = self.gap(x) + + x = x.flatten(1) + + return self.linear(x) + + +# ========================================================= +# TESTE +# ========================================================= + +def test_fusion(): + + print("Testing SpatialBroadcastFuser...") + + batch_size = 32 + visual_channels = 8 + action_dim = 16 + H = 8 + W = 8 + + z_visual = torch.randn( + batch_size, + visual_channels, + H, + W + ) + + z_action = torch.randn( + batch_size, + action_dim + ) + + fuser = SpatialBroadcastFuser() + + z_fused = fuser( + z_visual, + z_action + ) + + print("Visual shape :", z_visual.shape) + print("Action shape :", z_action.shape) + print("Fused shape :", z_fused.shape) + + expected_channels = visual_channels + action_dim + + assert z_fused.shape == ( + batch_size, + expected_channels, + H, + W + ) + + print("Fusion OK") + + +def test_probe(): + + print("\nTesting probe recovery...") + + batch_size = 32 + visual_channels = 8 + action_dim = 16 + H = 8 + W = 8 + + z_visual = torch.randn( + batch_size, + visual_channels, + H, + W + ) + + z_action = torch.randn( + batch_size, + action_dim + ) + + fuser = SpatialBroadcastFuser() + + z_fused = fuser( + z_visual, + z_action + ).detach() + + probe = ActionProbe( + visual_channels + action_dim, + action_dim + ) + + optimizer = torch.optim.Adam( + probe.parameters(), + lr=0.01 + ) + + loss_fn = nn.MSELoss() + + for i in range(300): + + optimizer.zero_grad() + + recovered = probe(z_fused) + + loss = loss_fn( + recovered, + z_action + ) + + loss.backward() + + optimizer.step() + + if i % 100 == 0: + print(f"Iter {i} loss {loss.item():.6f}") + + if loss.item() < 0.01: + print("Probe recovery OK") + else: + print("Warning: probe recovery high loss") + + + +