将 tensorDataset 或 Dataloader 传递给 skorch

Passing tensorDataset or Dataloader to skorch

我想使用 skorch 在 Pytorch 中应用交叉验证,所以我准备了我的模型和我的张量数据集 returns(图像、标题和 captions_length),所以它有 X 和 Y,所以我将无法在方法

中设置 Y
net.fit(dataset)

但是当我尝试时出现错误:

ValueError: Stratified CV requires explicitly passing a suitable 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()

您正在(隐含地)使用 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