Подмножество набора данных K-Fold с PyTorch - PullRequest
1 голос
/ 09 июля 2020

Я потратил весь день, пытаясь прочитать всюду о внедрении кросс-валидации K-Fold в PyTorch, но не могу заставить ее работать. У меня есть настраиваемое подмножество, написанное для моего набора данных, но это тоже не работает ... Код, имеющий проблемы, следующий:

    for epoch in range(training_configuration.epochs_count):
        mean = [0.5768, 0.4622, 0.3460]
        std = [0.2383, 0.2464, 0.2465]

        if data_augmentation:
            train_transforms = data_augmentation_transforms(mean, std)
            print('Data Augmentation: On')
        else:
            train_transforms = image_common_transforms(mean, std)
            print('Data Augmentation: Off')

        test_transforms = image_common_transforms(mean, std)
        
        dataset = KenyanFood13Dataset(
            root_dir = train_config.root_dir, 
            img_path = train_config.img_path,
            csv_file = train_config.csv_path,
            transform = train_transforms)
        
        kf = KFold(n_splits=5, shuffle=True)
        for i, (train_index, test_index) in enumerate(kf.split(dataset)):
            train = torch.utils.data.Subset(dataset, train_index)
            test = torch.utils.data.Subset(dataset, test_index)

            train_loader = DataLoader(train, batch_size=train_config.batch_size, shuffle=True, num_workers=train_config.num_workers)    
            test_loader = DataLoader(test, batch_size=train_config.batch_size, shuffle=False, num_workers=train_config.num_workers)

            print('Data: New fold successfully')

            init_val_loss, init_val_accuracy = validate(training_configuration, model, test_loader)
            print(f'Initial Validation Loss: {init_val_loss:.6f}, Initial Validation Accuracy: {init_val_accuracy*100:.3f}%\n')

            # --------- THIS IS WHERE THE ERROR IS -------------
            train_loss, train_acc = train(
                train_config=training_configuration, 
                model=model, 
                optimizer=optimizer, 
                train_loader=train_loader, 
                epoch_idx=epoch)

Traceback :

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-19-c606f47fba53> in <module>
     34     tb_writer,
     35     scheduler=scheduler,
---> 36     data_augmentation=True)

<ipython-input-18-05bc5c268921> in main(model, optimizer, tb_writer, scheduler, training_configuration, data_augmentation)
     65                 optimizer=optimizer,
     66                 train_loader=train_loader,
---> 67                 epoch_idx=epoch)
     68 
     69             epoch_train_loss = np.append(epoch_train_loss, [train_loss])

TypeError: 'Subset' object is not callable

Есть мысли о том, как я могу это реализовать?

...