我想使用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()
答案 0 :(得分:1)
您(隐式)使用的是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
并将其传递给适合对象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