gpt4 book ai didi

python - 值错误 : sampler option is mutually exclusive with shuffle pytorch

转载 作者:行者123 更新时间:2023-12-02 16:14:41 26 4
gpt4 key购买 nike

我正在使用 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)
)

如果删除 sampler=SubsetRandomSampler(val_inds)并把 val_inds相反,它会出现这个错误

val_inds ^ SyntaxError: positional argument follows keyword argument



我想在 pytorch 中进行预测(从测试数据集中随机选择)?这就是为什么我应该使用 shuffle=True我关注了这个 repo facenet-pytorch

最佳答案

TLDR;删除 shuffle=True在这种情况下为 SubsetRandomSampler已经洗牌数据了。

什么torch.utils.data.SubsetRandomSampler确实(请 consult documentation when in doubt )它会获取一个索引列表并返回它们的排列。

在您的情况下,您有 indices对应 training (这些是 训练数据集中元素的索引 )和 validation .

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

train_indices = [0, 2, 3, 4, 5, 6, 9, 10, 12, 13, 15]
val_indices = [1, 7, 8, 11, 14]

每次通过 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

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

附加信息
  • shuffle使用 torch.utils.data.RandomSampler如果 shuffle=True 在引擎盖下已指定,请参阅 source code .这又相当于使用 torch.utils.data.SubsetRandomSampler所有指数 ( np.arange(len(datatest)) ) 指定。
  • 您不必预先洗牌 np.random.shuffle(img_inds)因为无论如何索引将在每次传递期间被洗牌
  • 不要使用 numpy如果 torch提供相同的功能 .有torch.arange ,几乎不需要混合这两个库。

  • 推理

    单张图片

    只需通过您的网络将其传递给获取输出,例如:
    module.eval()
    with torch.no_grad():
    output = module(dataset[5380])

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

    检查验证数据集

    沿着这些思路,请注意适用于单个图像的相同想法:
    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))

    其他案例

    请看 some beginners guidestutorials并理解这些概念,因为 StackOverflow 不是重新做这项工作的地方(相当具体和小问题),谢谢。

    关于python - 值错误 : sampler option is mutually exclusive with shuffle pytorch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61033726/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com