ValueError:采样器选项与 shuffle pytorch 互斥

art*_*_cs 6 python opencv face-recognition pytorch

我正在使用 pytorch 和 mtcnn 进行人脸识别项目,在训练了我的训练数据集之后,现在我想对测试数据集进行预测

这是我训练过的代码

optimizer = optim.Adam(resnet.parameters(), lr=0.001)
scheduler = MultiStepLR(optimizer, [5, 10])

trans = transforms.Compose([
   np.float32,
   transforms.ToTensor(),
   fixed_image_standardization
])
dataset = datasets.ImageFolder(data_dir, transform=trans)
img_inds = np.arange(len(dataset))
np.random.shuffle(img_inds)
train_inds = img_inds[:int(0.8 * len(img_inds))]
val_inds = img_inds[int(0.8 * len(img_inds)):]

train_loader = DataLoader(
   dataset,
   num_workers=workers,
   batch_size=batch_size,
   sampler=SubsetRandomSampler(train_inds)
)
val_loader = DataLoader(
   dataset,
   shuffle=True,
   num_workers=workers,
   batch_size=batch_size,
   sampler=SubsetRandomSampler(val_inds)
)
Run Code Online (Sandbox Code Playgroud)

如果删除sampler=SubsetRandomSampler(val_inds)并放置val_inds,则会出现此错误

val_inds ^ 语法错误:位置参数跟随关键字参数

我想在 pytorch 中进行预测(从测试数据集中随机选择)?这就是为什么我应该使用shuffle=True 我遵循这个回购协议facenet-pytorch

Szy*_*zke 12

太长了;shuffle=True在这种情况下删除,因为SubsetRandomSampler已经对数据进行了洗牌。

torch.utils.data.SubsetRandomSampler作用(如有疑问请查阅文档)是它将获取索引列表并返回它们的排列。

在您的情况下,您indices对应于training(这些是训练 Dataset 中元素的索引)和validation

让我们假设它们看起来像这样:

train_indices = [0, 2, 3, 4, 5, 6, 9, 10, 12, 13, 15]
val_indices = [1, 7, 8, 11, 14]
Run Code Online (Sandbox Code Playgroud)

在每次传递期间,SubsetRandomSampler将从这些列表中随机返回一个数字,并且在返回所有数字后,这些数字将再次随机化__iter__将再次调用)。

因此SubsetRandomSampler可能会返回类似这样的内容val_indices(类似地train_indices):

val_indices = [1, 8, 11, 7, 14]  # Epoch 1
val_indices = [11, 7, 8, 14, 1]  # Epoch 2
val_indices = [7, 1, 14, 8, 11]  # Epoch 3
Run Code Online (Sandbox Code Playgroud)

现在,每个数字都是原始dataset. 请注意validation,以这种方式进行洗牌,因此train不使用shuffle=True。这些索引不重叠,因此数据被正确分割。

附加信息

  • shuffle如果指定,请torch.utils.data.RandomSampler在幕后使用,请参阅源代码。这又相当于使用指定的所有索引( )。shuffle=Truetorch.utils.data.SubsetRandomSamplernp.arange(len(datatest))
  • 您不必预先洗牌,np.random.shuffle(img_inds)因为无论如何索引都会在每次传递期间进行洗牌
  • numpy如果torch提供相同的功能,请勿使用。确实torch.arange,混合这两个库几乎没有必要。

推理

单幅图像

只需将其通过网络传递并获取输出,例如:

module.eval()
with torch.no_grad():
    output = module(dataset[5380])
Run Code Online (Sandbox Code Playgroud)

第一行将模型置于评估模式(更改某些层的行为),上下文管理器关闭梯度(因为预测不需要它)。这些几乎总是在“检查神经网络输出”时使用。

检查验证数据集

沿着这些思路,请注意与单个图像应用相同的想法:

module.eval()

total_batches = 0
batch_accuracy = 0
for images, labels in val_loader:
    total_batches += 1
    with torch.no_grad():
        output = module(images)
        # In case it outputs logits without activation
        # If it outputs activation you may have to use argmax or > 0.5 for binary case
        # Item gets float from torch.tensor
        batch_accuracy += torch.mean(labels == (output > 0.0)).item()

print("Overall accuracy: {}".format(batch_accuracy / total_batches))
Run Code Online (Sandbox Code Playgroud)

其他案例

请参阅一些初学者指南教程并理解这些概念,因为 StackOverflow 不是重新做这项工作的地方(相当具体和小问题),谢谢。