gpt4 book ai didi

machine-learning - 将tensorDataset或Dataloader传递给skorch

转载 作者:行者123 更新时间:2023-11-30 08:34:36 24 4
gpt4 key购买 nike

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

net.fit(dataset)

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

ValueError: Stratified CV requires explicitly passing a suitable 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()

最佳答案

您正在(隐式地)使用 skorch 的内部 CV 分割,它在 NeuralNetClassifier 的情况下使用分层分割,而 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并将其传递给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

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com