added machine learning helper
parent
bbbf9f8c83
commit
aff7c6170e
|
|
@ -0,0 +1,42 @@
|
||||||
|
"""
|
||||||
|
This file contains the HumorDataset class.
|
||||||
|
"""
|
||||||
|
import torch
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
class HumorDataset(torch.utils.data.Dataset):
|
||||||
|
def __init__(self, data, labels, vocab_size=0, emb_dim=None):
|
||||||
|
self.original_indices = labels.index.to_list()
|
||||||
|
|
||||||
|
self.data = data
|
||||||
|
self.labels = labels.reset_index(drop=True)
|
||||||
|
self.vocab_size = vocab_size
|
||||||
|
self.emb_dim = emb_dim
|
||||||
|
|
||||||
|
# TODO: bug fix
|
||||||
|
self.shape = self.get_shape()
|
||||||
|
|
||||||
|
|
||||||
|
def __getitem__(self, idx):
|
||||||
|
item = {'input_ids': torch.tensor(self.data[idx], dtype=torch.float)}
|
||||||
|
item['labels'] = torch.tensor(self.labels[idx], dtype=torch.float)
|
||||||
|
return item
|
||||||
|
|
||||||
|
def __len__(self):
|
||||||
|
return len(self.labels)
|
||||||
|
|
||||||
|
def get_single_shape(self, data):
|
||||||
|
shape_data = None
|
||||||
|
if type(data) == list:
|
||||||
|
shape_data = len(data[0])
|
||||||
|
elif type(data) == torch.Tensor:
|
||||||
|
shape_data = data[0].shape
|
||||||
|
elif type(data) == np.ndarray:
|
||||||
|
shape_data = data[0].shape
|
||||||
|
return shape_data
|
||||||
|
|
||||||
|
def get_shape(self):
|
||||||
|
shape_data = self.get_single_shape(self.data)
|
||||||
|
shape_labels = self.get_single_shape(self.labels)
|
||||||
|
return shape_data, shape_labels
|
||||||
|
|
||||||
16
gpu_check.py
16
gpu_check.py
|
|
@ -1,16 +0,0 @@
|
||||||
import torch
|
|
||||||
|
|
||||||
# Check if CUDA is available
|
|
||||||
cuda_available = torch.cuda.is_available()
|
|
||||||
print(f"CUDA available: {cuda_available}")
|
|
||||||
|
|
||||||
if cuda_available:
|
|
||||||
# Print the current CUDA device
|
|
||||||
current_device = torch.cuda.current_device()
|
|
||||||
print(f"Current CUDA device: {current_device}")
|
|
||||||
|
|
||||||
# Print the name of the current CUDA device
|
|
||||||
device_name = torch.cuda.get_device_name(current_device)
|
|
||||||
print(f"CUDA device name: {device_name}")
|
|
||||||
else:
|
|
||||||
print("CUDA is not available. Please check your CUDA installation and PyTorch configuration.")
|
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
import torch
|
||||||
|
import nltk
|
||||||
|
|
||||||
|
import time
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
|
||||||
|
def get_device(verbose=False):
|
||||||
|
"""
|
||||||
|
Get the current device (CPU or GPU) for PyTorch.
|
||||||
|
"""
|
||||||
|
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
|
||||||
|
if verbose:
|
||||||
|
print('Using device:', device)
|
||||||
|
return device
|
||||||
|
|
||||||
|
def save_model_and_hyperparameters(model, model_prefix_name, accuracy, timestamp=None,**kwargs):
|
||||||
|
"""
|
||||||
|
Save the model and hyperparameters to disk.
|
||||||
|
**kwargs: hyperparameters to save
|
||||||
|
"""
|
||||||
|
# Create a timestamp
|
||||||
|
if timestamp is None:
|
||||||
|
timestamp = time.strftime("%Y%m%d-%H%M%S")
|
||||||
|
|
||||||
|
accuracy = round(accuracy, 4)
|
||||||
|
|
||||||
|
# Save the model state dictionary
|
||||||
|
model_path = f'models/{model_prefix_name}_acc_{accuracy}_{timestamp}.pth'
|
||||||
|
torch.save(model.state_dict(), model_path)
|
||||||
|
print(f"Model saved to {model_path}.")
|
||||||
|
|
||||||
|
# Save the hyperparameters as a JSON file
|
||||||
|
hyperparameters = kwargs
|
||||||
|
hyperparameters['accuracy'] = accuracy
|
||||||
|
hyperparameters_path = f'models/{model_prefix_name}_para_acc_{accuracy}_{timestamp}.json'
|
||||||
|
with open(hyperparameters_path, 'w') as f:
|
||||||
|
json.dump(hyperparameters, f)
|
||||||
|
print(f"Hyperparameters saved to {hyperparameters_path}.")
|
||||||
|
|
||||||
|
def get_newest_model_path(path, name=None, extension=".pth"):
|
||||||
|
"""
|
||||||
|
Get the newest file in a directory.
|
||||||
|
"""
|
||||||
|
# List all files in the directory
|
||||||
|
files = [f for f in os.listdir(path) if f.endswith(extension)]
|
||||||
|
# List all files with name in it
|
||||||
|
if name:
|
||||||
|
files = [f for f in files if name in f]
|
||||||
|
|
||||||
|
# Sort files by modification time
|
||||||
|
files.sort(key=lambda x: os.path.getmtime(os.path.join(path, x)), reverse=True)
|
||||||
|
|
||||||
|
# Get the newest file
|
||||||
|
if files:
|
||||||
|
newest_model_path = os.path.join(path, files[0])
|
||||||
|
return newest_model_path
|
||||||
|
else:
|
||||||
|
print("No File found in the directory")
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
"""
|
||||||
|
Main function used to set up the environment.
|
||||||
|
"""
|
||||||
|
# download nltk data
|
||||||
|
nltk.download('punkt')
|
||||||
|
nltk.download('punkt_tab')
|
||||||
|
|
||||||
|
|
||||||
|
# Check if CUDA is available
|
||||||
|
cuda_available = torch.cuda.is_available()
|
||||||
|
print(f"CUDA available: {cuda_available}")
|
||||||
|
|
||||||
|
if cuda_available:
|
||||||
|
# Print the current CUDA device
|
||||||
|
current_device = torch.cuda.current_device()
|
||||||
|
print(f"Current CUDA device: {current_device}")
|
||||||
|
|
||||||
|
# Print the name of the current CUDA device
|
||||||
|
device_name = torch.cuda.get_device_name(current_device)
|
||||||
|
print(f"CUDA device name: {device_name}")
|
||||||
|
else:
|
||||||
|
print("CUDA is not available. Please check your CUDA installation and PyTorch configuration.")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
|
|
@ -0,0 +1,48 @@
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
class History:
|
||||||
|
"""
|
||||||
|
Class to store the history of the training process.
|
||||||
|
Used to store the loss and accuracy of the training and validation sets.
|
||||||
|
"""
|
||||||
|
def __init__(self):
|
||||||
|
self.history = {
|
||||||
|
'loss': [],
|
||||||
|
'train_acc': [],
|
||||||
|
'val_acc': [],
|
||||||
|
}
|
||||||
|
self.batch_history = {
|
||||||
|
'loss': [],
|
||||||
|
'train_acc': [],
|
||||||
|
'val_acc': [],
|
||||||
|
}
|
||||||
|
|
||||||
|
def update(self):
|
||||||
|
self.history['loss'].append(np.mean(self.batch_history['loss']))
|
||||||
|
self.history['train_acc'].append(np.mean(self.batch_history['train_acc']))
|
||||||
|
self.history['val_acc'].append(np.mean(self.batch_history['val_acc']))
|
||||||
|
|
||||||
|
def get_history(self):
|
||||||
|
return self.history
|
||||||
|
|
||||||
|
def batch_reset(self):
|
||||||
|
self.batch_history = {
|
||||||
|
'loss': [],
|
||||||
|
'train_acc': [],
|
||||||
|
'val_acc': [],
|
||||||
|
}
|
||||||
|
|
||||||
|
def batch_update(self, loss, train_acc, val_acc):
|
||||||
|
self.batch_history['loss'].append(loss)
|
||||||
|
self.batch_history['train_acc'].append(train_acc)
|
||||||
|
self.batch_history['val_acc'].append(val_acc)
|
||||||
|
|
||||||
|
def batch_update_train(self, loss, train_acc):
|
||||||
|
self.batch_history['loss'].append(loss)
|
||||||
|
self.batch_history['train_acc'].append(train_acc)
|
||||||
|
|
||||||
|
def batch_update_val(self, val_acc):
|
||||||
|
self.batch_history['val_acc'].append(val_acc)
|
||||||
|
|
||||||
|
def get_batch_history(self):
|
||||||
|
return self.batch_history
|
||||||
Loading…
Reference in New Issue