首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将tensorDataset或Dataloader传递给skorch

将tensorDataset或Dataloader传递给skorch
EN

Stack Overflow用户
提问于 2019-06-07 08:01:48
回答 1查看 2.9K关注 0票数 7

我想使用skorch将交叉验证应用于method,所以我准备了我的模型和返回(图像、标题和captions_length)的captions_length,所以它有X和Y,所以我不能在方法中设置Y

代码语言:javascript
复制
net.fit(dataset)

但当我尝试的时候我发现了一个错误:

ValueError:分层简历要求显式传递合适的y

下面是我代码的一部分:

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-19 11:52:25

您正在(隐式地)使用skorch的内部CV拆分,在NeuralNetClassifier的情况下使用分层拆分,这反过来需要预先提供标签的信息。

当将Xy分别传递给fit时,这很好,因为y在任何时候都是可访问的。问题是您使用的是torch.dataset.Dataset,它很懒,不能直接访问y,因此出现了错误。

您的选择如下。

设置train_split=None以禁用内部CV拆分

代码语言:javascript
复制
net = NeuralNetClassifier(
    train_split=None,
)

您将失去内部验证,因此,像早期停止这样的功能。

预先拆分数据

将数据集拆分为两个数据集,dataset_traindataset_valid,然后使用skorch.helper.predefined_split

代码语言:javascript
复制
net = NeuralNetClassifier(
    train_split=predefined_split(dataset_valid),
)

您没有损失什么,但根据您的数据,这可能是复杂的。

提取您的y并将其传递给

代码语言:javascript
复制
y_train = np.array([y for X, y in iter(my_dataset)])
net.fit(my_dataset, y=y_train)

只有当您的y适合内存时,这才能工作。由于您正在使用TensorDataset,您还可以执行以下操作来提取您的y

代码语言:javascript
复制
y_train = my_dataset.y
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56490278

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档