| | import torch |
| |
|
| | import CrosswalkDataset as Dataset |
| | import ClassifierModel as Model |
| | import Utilities as Utils |
| |
|
| |
|
| | def train_model_v0(model_to_train, dataset, epoch_number=25, loss_func=Utils.BasicClassificationLoss, |
| | batch_size=16, save=False): |
| | optimiser = torch.optim.Adam(model_to_train.parameters(), lr=0.001) |
| | dataloader = torch.utils.data.DataLoader(dataset, shuffle=True, batch_size=batch_size) |
| |
|
| | loss_function = loss_func() |
| |
|
| | for epoch in range(epoch_number): |
| | model_to_train.train() |
| | running_loss = 0.0 |
| |
|
| | for images, gt_labels in dataloader: |
| | optimiser.zero_grad() |
| |
|
| | predictions = model_to_train(images) |
| |
|
| | batch_loss = loss_function(predictions, gt_labels) |
| | batch_loss.backward() |
| |
|
| | running_loss += batch_loss |
| | optimiser.step() |
| |
|
| | print(f"Epoch [{epoch + 1} of {epoch_number}] finished, with loss {running_loss / len(dataloader)} in " |
| | f"len {len(dataloader) * batch_size}") |
| |
|
| | Utils.save_model(model_to_train, optimiser) |
| | return model_to_train |
| |
|
| |
|
| | |
| | def train_model_v1(model_to_train, dataset, epoch_number=10, loss_func=Utils.BasicClassificationLoss, |
| | batch_size=16, save=False): |
| | optimiser = torch.optim.Adam(model_to_train.parameters(), lr=0.001) |
| | scheduler = torch.optim.lr_scheduler.ExponentialLR(optimiser, gamma=0.95) |
| | dataloader = torch.utils.data.DataLoader(dataset, shuffle=True, batch_size=batch_size) |
| | loss_function = loss_func() |
| |
|
| | for epoch in range(epoch_number): |
| | model_to_train.train() |
| | running_loss = 0.0 |
| |
|
| | for images, gt_labels in dataloader: |
| | optimiser.zero_grad() |
| |
|
| | predictions = model_to_train(images) |
| |
|
| | batch_loss = loss_function(predictions, gt_labels) |
| | batch_loss.backward() |
| |
|
| | running_loss += batch_loss |
| | optimiser.step() |
| |
|
| | scheduler.step() |
| |
|
| | print(f"Epoch [{epoch + 1} of {epoch_number}] finished, with loss {running_loss / len(dataloader)} in " |
| | f"len {len(dataloader) * batch_size}") |
| |
|
| | Utils.save_model(model_to_train, optimiser) |
| | return model_to_train |
| |
|
| |
|
| | model = Model.BasicClassificationModel(image_size=416) |
| | |
| | crosswalk_dataset = Dataset.CrosswalkDataset("Crosswalk.v7-crosswalk-t3.tensorflow/train/_annotations.csv", |
| | "Crosswalk.v7-crosswalk-t3.tensorflow/train") |
| | model = train_model_v1(model, crosswalk_dataset, save=True) |
| |
|