【发布时间】:2021-05-01 15:43:20
【问题描述】:
我在 CIFAR 数据集上训练 ResNet34。由于某种原因,我需要将数据集转换为TensorDataset。
我的解决方案基于此:https://stackoverflow.com/a/44475689/15072863 有一些差异(也许它们很关键,但我不明白为什么)。
看来我做的不对。
火车装载机:
transform_train = transforms.Compose([
transforms.RandomCrop(32, padding=4),
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010))])
train_ds = torchvision.datasets.CIFAR10('/files/', train=True, transform=transform_train, download=True)
xs, ys = [], []
for x, y in train_ds:
xs.append(x)
ys.append(y)
# 1) Standard Version
# cifar_train_loader = DataLoader(train_ds, batch_size=batch_size_train, shuffle=True, num_workers=num_workers)
# 2) TensorDataset version, seems to be incorrect
cifar_tensor_ds = TensorDataset(torch.stack(xs), torch.tensor(ys, dtype=torch.long))
cifar_train_loader = DataLoader(cifar_tensor_ds, batch_size=batch_size_train, shuffle=True, num_workers=num_workers)
我认为这并不重要,但测试加载器的定义与往常一样:
transform_test = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)),
])
cifar_test_loader = DataLoader(
torchvision.datasets.CIFAR10('/files/', train=False, transform=transform_test, download=True),
batch_size=batch_size_test, shuffle=False, num_workers=num_workers)
我知道我使用 TensorDataset 的方式有问题,因为;
- 使用
TensorDataset,我实现了 100% 的训练准确率和 80% 的测试准确率 - 使用标准数据集,我实现了 99% 的训练准确度(从来没有 100%)和 90% 的测试准确度。
那么,我做错了什么?
P.S.:我的最终目标是根据类别将数据集分成 10 个数据集。有一个更好的方法吗?当然,我可以定义我的 DataSet 子类,但是手动拆分它并创建TensorDataset 似乎更简单。
【问题讨论】:
标签: python neural-network pytorch dataset dataloader