我想在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