def train_model(model, criterion, optimizer, scheduler, num_epochs, data_dir):
    'Train the model.'
    (dataloaders, dataset_sizes, class_names) = load_data(data_dir)
    device = torch.device(('cuda:0' if torch.cuda.is_available() else 'cpu'))
    since = time.time()
    best_model_wts = copy.deepcopy(model.state_dict())
    best_acc = 0.0
    for epoch in range(num_epochs):
        print('Epoch {}/{}'.format(epoch, (num_epochs - 1)))
        print(('-' * 10))
        for phase in ['train', 'val']:
            if (phase == 'train'):
                scheduler.step()
                model.train()
            else:
                model.eval()
            running_loss = 0.0
            running_corrects = 0
            for (inputs, labels) in dataloaders[phase]:
                inputs = inputs.to(device)
                labels = labels.to(device)
                optimizer.zero_grad()
                with torch.set_grad_enabled((phase == 'train')):
                    outputs = model(inputs)
                    (_, preds) = torch.max(outputs, 1)
                    loss = criterion(outputs, labels)
                    if (phase == 'train'):
                        loss.backward()
                        optimizer.step()
                running_loss += (loss.item() * inputs.size(0))
                running_corrects += torch.sum((preds == labels.data))
            epoch_loss = (running_loss / dataset_sizes[phase])
            epoch_acc = (running_corrects.double() / dataset_sizes[phase])
            print('{} Loss: {:.4f} Acc: {:.4f}'.format(phase, epoch_loss, epoch_acc))
            if ((phase == 'val') and (epoch_acc > best_acc)):
                best_acc = epoch_acc
                best_model_wts = copy.deepcopy(model.state_dict())
            run.log('best_val_acc', np.float(best_acc))
        print()
    time_elapsed = (time.time() - since)
    print('Training complete in {:.0f}m {:.0f}s'.format((time_elapsed // 60), (time_elapsed % 60)))
    print('Best val Acc: {:4f}'.format(best_acc))
    model.load_state_dict(best_model_wts)
    return model
Train the model.
def train_model(model, criterion, optimizer, scheduler, num_epochs, data_dir):
    
    (dataloaders, dataset_sizes, class_names) = load_data(data_dir)
    device = torch.device(('cuda:0' if torch.cuda.is_available() else 'cpu'))
    since = time.time()
    best_model_wts = copy.deepcopy(model.state_dict())
    best_acc = 0.0
    for epoch in range(num_epochs):
        print('Epoch {}/{}'.format(epoch, (num_epochs - 1)))
        print(('-' * 10))
        for phase in ['train', 'val']:
            if (phase == 'train'):
                scheduler.step()
                model.train()
            else:
                model.eval()
            running_loss = 0.0
            running_corrects = 0
            for (inputs, labels) in dataloaders[phase]:
                inputs = inputs.to(device)
                labels = labels.to(device)
                optimizer.zero_grad()
                with torch.set_grad_enabled((phase == 'train')):
                    outputs = model(inputs)
                    (_, preds) = torch.max(outputs, 1)
                    loss = criterion(outputs, labels)
                    if (phase == 'train'):
                        loss.backward()
                        optimizer.step()
                running_loss += (loss.item() * inputs.size(0))
                running_corrects += torch.sum((preds == labels.data))
            epoch_loss = (running_loss / dataset_sizes[phase])
            epoch_acc = (running_corrects.double() / dataset_sizes[phase])
            print('{} Loss: {:.4f} Acc: {:.4f}'.format(phase, epoch_loss, epoch_acc))
            if ((phase == 'val') and (epoch_acc > best_acc)):
                best_acc = epoch_acc
                best_model_wts = copy.deepcopy(model.state_dict())
            run.log('best_val_acc', np.float(best_acc))
        print()
    time_elapsed = (time.time() - since)
    print('Training complete in {:.0f}m {:.0f}s'.format((time_elapsed // 60), (time_elapsed % 60)))
    print('Best val Acc: {:4f}'.format(best_acc))
    model.load_state_dict(best_model_wts)
    return model