我想使用skorch在Pytorch中应用交叉验证,所以我准备了我的模型和返回(image,caption和captions_length)的tensorDataset,所以它具有X和Y,所以我将无法在该方法中设置Y

net.fit(dataset)

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



这是我的代码的一部分:
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,则该分割使用分层分割,而X则事先需要有关标签的信息。

当分别将yfit传递给y时,这可以正常工作,因为torch.dataset.Dataset始终可访问。问题是您使用的是惰性的y,不能直接访问train_split=None,因此会出现错误。

您的选择如下。

设置dataset_train以禁用内部CV拆分

net = NeuralNetClassifier(
    train_split=None,
)

您将失去内部验证,并因此失去早期停止等功能。

预先分割您的数据

将您的数据集分为两个数据集dataset_validskorch.helper.predefined_split
然后使用 y :

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)

仅当您的TensorDataset适合内存时,此方法才有效。由于您使用的是y,因此您还可以执行以下操作来提取ojit_code:

y_train = my_dataset.y

关于machine-learning - 将tensorDataset或Dataloader传递给skorch,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56490278/

10-12 18:23