将tensorDataset或Dataloader传递给skorch

时间:2019-06-07 08:01:48

标签: machine-learning deep-learning computer-vision pytorch skorch

我想使用skorch在Pytorch中应用交叉验证,所以我准备了我的模型和我的tensorDataset,它返回了(image,caption和captions_length),所以它有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 个答案:

答案 0 :(得分:1)

您(隐式)使用的是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并将其传递给适合对象

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