import os import torch import torchvision from torch.utils.data import DataLoader from torchvision.transforms import transforms import toml batch_size = 8 num_epochs = 10 learning_rate = 0.001 class LoRAModel(torch.nn.Module): def __init__(self): super(LoRAModel, self).__init__() def forward(self, x): pass custom_dataset = """ [[datasets]] [[datasets.subsets]] image_dir = "/path/to/directory" num_repeats = 10 [[datasets.subsets]] image_dir = "/path/to/directory" is_reg = true num_repeats = 1 """ dataset_config = toml.loads(custom_dataset) datasets = dataset_config.get("datasets", []) transform = transforms.Compose([ transforms.Resize((512, 512)), transforms.ToTensor(), ]) train_datasets = [] for dataset in datasets: subsets = dataset.get("subsets", []) for subset in subsets: image_dir = subset.get("image_dir") num_repeats = subset.get("num_repeats", 1) is_reg = subset.get("is_reg", False) dataset = torchvision.datasets.ImageFolder(root=image_dir, transform=transform) train_datasets.extend([dataset] * num_repeats) train_dataset = torch.utils.data.ConcatDataset(train_datasets) dataloader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True) model = LoRAModel() criterion = torch.nn.CrossEntropyLoss() optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate) total_step = len(dataloader) for epoch in range(num_epochs): for i, (images, labels) in enumerate(dataloader): outputs = model(images) loss = criterion(outputs, labels) optimizer.zero_grad() loss.backward() optimizer.step() if (i + 1) % 100 == 0: print(f"Epoch [{epoch + 1}/{num_epochs}], Step [{i + 1}/{total_step}], Loss: {loss.item()}") save_path = "/path/to/directory/model.pth" torch.save(model.state_dict(), save_path)