使用tensorDataset或Dataloader传递给skorch

我想在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的情况下使用分层分割,这反过来需要事先了解标签的信息。

当将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

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注