将tensorDataset或Dataloader传递给skorch

7

我希望使用skorch在Pytorch中应用交叉验证,因此我准备了我的模型和我的tensorDataset,它返回(图像、标题和标题长度),因此它具有X和Y,所以我将无法在该方法中设置Y。

net.fit(dataset)

但是当我尝试这样做时,出现了错误:

ValueError: 分层交叉验证需要明确传递合适的y

这是我的部分代码:

start = time.time()
net = NeuralNetClassifier(
        decoder, criterion= nn.CrossEntropyLoss,
        max_epochs=args.epochs,
        lr=args.lr,
        optimizer=optim.SGD,
        device='cuda',  # uncomment this to train with CUDA
       )
net.fit(dataset, y=None)
end = time.time()
1个回答

7
您正在(隐式地)使用skorch的内部CV拆分,该拆分在NeuralNetClassifier的情况下使用分层拆分,进而需要事先了解标签信息。
当分别将Xy传递给fit时,这可以正常工作,因为y始终可访问。问题在于,您正在使用懒惰的torch.dataset.Dataset,无法直接访问y,因此出现错误。
您有以下选项。

train_split=None设置为禁用内部CV拆分

net = NeuralNetClassifier(
    train_split=None,
)

你将失去内部验证和早停等功能。
将数据事先拆分成两个数据集,dataset_traindataset_valid,然后使用 skorch.helper.predefined_split
net = NeuralNetClassifier(
    train_split=predefined_split(dataset_valid),
)

你不会失去任何东西,但根据你的数据可能会变得复杂。
提取你的 y 并将其传递给 fit。
y_train = np.array([y for X, y in iter(my_dataset)])
net.fit(my_dataset, y=y_train)

这仅适用于您的y可以放入内存中的情况。由于您正在使用TensorDataset,因此还可以执行以下操作来提取y:
y_train = my_dataset.y

你好nemo,感谢您的回复,但我在训练期间不仅传递X,那么skorch能够处理吗? - Omar Abdelaziz
当将数据集传递给 .fit 时,skorch 期望数据集包含 (X, y),因此 skorch 将按预期处理此情况。在训练之前,仅需要 y 进行拆分。 - nemo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接