Передача tenorDataset или Dataloader для скорча - PullRequest
1 голос
/ 07 июня 2019

Я хочу применить перекрестную проверку в Pytorch, используя skorch, поэтому я подготовил свою модель и мой tenorsDataset, который возвращает (image, caption и 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()

1 Ответ

1 голос
/ 19 июня 2019

Вы (неявно) используете внутреннее разделение 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.y
...