7

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

net.fit(dataset)

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

ValueError:分层 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()
4

1 回答 1

7

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

当通过X和分开时,这工作正常,因为y可以随时访问。问题是您使用的是惰性的,并且不允许您直接访问,因此会出现错误。fitytorch.dataset.Datasety

您的选择如下。

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

net = NeuralNetClassifier(
    train_split=None,
)

您将失去内部验证,因此,像提前停止这样的功能。

事先拆分数据

将您的数据集拆分为两个数据集,dataset_train然后dataset_valid使用skorch.helper.predefined_split

net = NeuralNetClassifier(
    train_split=predefined_split(dataset_valid),
)

您什么都不会丢失,但取决于您的数据,这可能会很复杂。

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

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
于 2019-06-19T11:52:25.843 回答