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