将 tensorDataset 或 Dataloader 传递给 skorch
Passing tensorDataset or Dataloader to skorch
我想使用 skorch 在 Pytorch 中应用交叉验证,所以我准备了我的模型和我的张量数据集 returns(图像、标题和 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
的情况下使用分层拆分,而后者又需要事先提供有关标签的信息。
当分别将 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
并将其传递给 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
我想使用 skorch 在 Pytorch 中应用交叉验证,所以我准备了我的模型和我的张量数据集 returns(图像、标题和 captions_length),所以它有 X 和 Y,所以我将无法在方法
中设置 Ynet.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
的情况下使用分层拆分,而后者又需要事先提供有关标签的信息。
当分别将 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
并将其传递给 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