我想使用skorch在Pytorch中应用交叉验证,所以我准备了我的模型和返回(image,caption和captions_length)的tensorDataset,所以它具有X和Y,所以我将无法在该方法中设置Y
net.fit(dataset)
但是当我尝试出现错误时:
这是我的代码的一部分:
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
,则该分割使用分层分割,而X
则事先需要有关标签的信息。
当分别将y
和fit
传递给y
时,这可以正常工作,因为torch.dataset.Dataset
始终可访问。问题是您使用的是惰性的y
,不能直接访问train_split=None
,因此会出现错误。
您的选择如下。
设置dataset_train
以禁用内部CV拆分
net = NeuralNetClassifier(
train_split=None,
)
您将失去内部验证,并因此失去早期停止等功能。
预先分割您的数据
将您的数据集分为两个数据集
dataset_valid
和skorch.helper.predefined_split
,然后使用
y
: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)
仅当您的
TensorDataset
适合内存时,此方法才有效。由于您使用的是y
,因此您还可以执行以下操作来提取ojit_code:y_train = my_dataset.y
关于machine-learning - 将tensorDataset或Dataloader传递给skorch,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56490278/