我想在Pytorch中使用skorch进行交叉验证,所以我准备了我的模型和我的tensorDataset,它返回(image, caption和captions_length),因此它有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', # 取消注释此行以使用CUDA进行训练 )net.fit(dataset, y=None)end = time.time()
回答:
您(隐式地)使用了skorch的内部CV分割,这在NeuralNetClassifier的情况下使用分层分割,这反过来需要事先了解标签的信息。
当将X和y分别传递给fit时,这一切正常,因为y始终是可访问的。问题在于您使用的是torch.dataset.Dataset,它是惰性的,并且不直接提供对y的访问,因此出现了错误。
您的选项如下。
设置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并传递给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