将 tensorDataset 或 Dataloader 传递给 skorch

Oma*_*ziz 7 machine-learning computer-vision deep-learning pytorch skorch

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

net.fit(dataset)
Run Code Online (Sandbox Code Playgroud)

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

ValueError: Stratified CV 需要明确传递一个合适的 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()
Run Code Online (Sandbox Code Playgroud)

nem*_*emo 7

您正在(隐式地)使用 skorch 的内部 CV 拆分,该拆分使用分层拆分,以防NeuralNetClassifier后者需要事先了解有关标签的信息。

当传递Xyfit单独能正常工作,因为y在任何时候都可以访问。问题是您使用的torch.dataset.Dataset是懒惰的并且不让您y直接访问,因此出现错误。

您的选择如下。

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

net = NeuralNetClassifier(
    train_split=None,
)
Run Code Online (Sandbox Code Playgroud)

您将失去内部验证,因此会失去诸如提前停止之类的功能。

事先拆分您的数据

拆分数据集分成两分集,dataset_traindataset_valid,然后使用skorch.helper.predefined_split

net = NeuralNetClassifier(
    train_split=predefined_split(dataset_valid),
)
Run Code Online (Sandbox Code Playgroud)

您不会丢失任何东西,但根据您的数据,这可能会很复杂。

提取您的y并将其传递以适合

y_train = np.array([y for X, y in iter(my_dataset)])
net.fit(my_dataset, y=y_train)
Run Code Online (Sandbox Code Playgroud)

这仅在您y适合内存时才有效。由于您正在使用,TensorDataset您还可以执行以下操作来提取您的y:

y_train = my_dataset.y
Run Code Online (Sandbox Code Playgroud)