我想使用skorch将交叉验证应用于method,所以我准备了我的模型和返回(图像、标题和captions_length)的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()发布于 2019-06-19 11:52:25
您正在(隐式地)使用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.yhttps://stackoverflow.com/questions/56490278
复制相似问题