Oma*_*ziz 7 machine-learning computer-vision deep-learning pytorch skorch
我想使用 skorch 在 Pytorch 中应用交叉验证,所以我准备了我的模型和我的 tensorDataset,它返回(图像、标题和标题长度),所以它有 X 和 Y,所以我无法在方法中设置 Y
net.fit(dataset)
Run Code Online (Sandbox Code Playgroud)
但是当我尝试时出现错误:
ValueError: Stratified CV 需要明确传递一个合适的 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()
Run Code Online (Sandbox Code Playgroud)
您正在(隐式地)使用 skorch 的内部 CV 拆分,该拆分使用分层拆分,以防NeuralNetClassifier
后者需要事先了解有关标签的信息。
当传递X
和y
对fit
单独能正常工作,因为y
在任何时候都可以访问。问题是您使用的torch.dataset.Dataset
是懒惰的并且不让您y
直接访问,因此出现错误。
您的选择如下。
train_split=None
为禁用内部 CV 拆分net = NeuralNetClassifier(
train_split=None,
)
Run Code Online (Sandbox Code Playgroud)
您将失去内部验证,因此会失去诸如提前停止之类的功能。
拆分数据集分成两分集,dataset_train
和dataset_valid
,然后使用skorch.helper.predefined_split
:
net = NeuralNetClassifier(
train_split=predefined_split(dataset_valid),
)
Run Code Online (Sandbox Code Playgroud)
您不会丢失任何东西,但根据您的数据,这可能会很复杂。
y
并将其传递以适合y_train = np.array([y for X, y in iter(my_dataset)])
net.fit(my_dataset, y=y_train)
Run Code Online (Sandbox Code Playgroud)
这仅在您y
适合内存时才有效。由于您正在使用,TensorDataset
您还可以执行以下操作来提取您的y
:
y_train = my_dataset.y
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2175 次 |
最近记录: |