Python 迭代torch.utils.data.random\u split中的子集

Python 迭代torch.utils.data.random\u split中的子集,python,loops,pytorch,Python,Loops,Pytorch,我目前正在加载一个包含AI训练数据的文件夹。子文件夹表示标签名称,其中包含相应的图像。通过使用pyTorch的ImageFolder加载程序,这一点非常有效 def load_dataset(): data_path = 'C:/example_folder/' train_dataset_manual = torchvision.datasets.ImageFolder( root=data_path, transform=torchvisio

我目前正在加载一个包含AI训练数据的文件夹。子文件夹表示标签名称,其中包含相应的图像。通过使用pyTorch的ImageFolder加载程序,这一点非常有效

def load_dataset():
    data_path = 'C:/example_folder/'

    train_dataset_manual = torchvision.datasets.ImageFolder(
        root=data_path,
        transform=torchvision.transforms.ToTensor()
    )

    train_loader_manual = torch.utils.data.DataLoader(
        train_dataset_manual,
        batch_size=1,
        num_workers=0,
        shuffle=True
    )

    return train_loader_manual

full_dataset = load_dataset()
现在我想把这个数据集分为一个训练数据集和一个测试数据集。我使用随机_分割函数进行此操作:

training_data_size = 0.8

train_size = int(training_data_size * len(full_dataset))
test_size = len(full_dataset) - train_size
train_dataset, test_dataset = torch.utils.data.random_split(full_dataset, [train_size, test_size])
完整的数据集是类型为
torch.utils.data.dataloader.dataloader
的对象。我可以用这样的循环遍历它:

for batch_idx, (data, target) in enumerate(full_dataset):
    print(batch_idx)
train\u数据集
是类型为
torch.utils.data.dataset.Subset的对象。如果我尝试循环通过它,我会得到:

TypeError“DataLoader”对象不可订阅:

我怎样才能循环通过它?我对Python比较陌生


谢谢

您需要对
数据集
而不是
数据加载器
应用
随机分割
。用于定义
DataLoader
的数据集可在
DataLoader.dataset
成员中找到

比如你可以做什么

train_dataset, test_dataset = torch.utils.data.random_split(full_dataset.dataset, [train_size, test_size])

train_loader = DataLoader(train_dataset, batch_size=1, num_workers=0, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=1, num_workers=0, shuffle=False)
然后您可以按预期迭代
训练装载机
测试装载机

train_dataset, test_dataset = torch.utils.data.random_split(full_dataset.dataset, [train_size, test_size])

train_loader = DataLoader(train_dataset, batch_size=1, num_workers=0, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=1, num_workers=0, shuffle=False)