Я пытаюсь включить функциональные возможности PyTorch в среду scikit-learn
(в частности, Pipelines и GridSearchCV) и поэтому изучаю skorch
. Стандартный пример документации для нейронных сетей выглядит как
import torch.nn.functional as F
from torch import nn
from skorch import NeuralNetClassifier
class MyModule(nn.Module):
def __init__(self, num_units=10, nonlin=F.relu):
super(MyModule, self).__init__()
self.dense0 = nn.Linear(20, num_units)
self.nonlin = nonlin
self.dropout = nn.Dropout(0.5)
...
...
self.output = nn.Linear(10, 2)
...
...
, где вы явно передаете входные и выходные измерения путем их жесткого кодирования в конструкторе. Однако это не совсем то, как работают интерфейсы scikit-learn
, где входные и выходные измерения выводятся методом fit
, а не передаются явно конструкторам. В качестве практического примера рассмотрим
# copied from the documentation
net = NeuralNetClassifier(
MyModule,
max_epochs=10,
lr=0.1,
# Shuffle training data on each epoch
iterator_train__shuffle=True,
)
# any general Pipeline interface
pipeline = Pipeline([
('transformation', AnyTransformer()),
('net', net)
])
gs = GridSearchCV(net, params, refit=False, cv=3, scoring='accuracy')
gs.fit(X, y)
помимо того факта, что нигде в трансформаторах не нужно указывать размеры входа и выхода, трансформаторы, которые применяются до модели, могут изменить размерность обучающий набор (подумайте об уменьшении размерности и т. п.), поэтому жесткое кодирование ввода и вывода в конструкторе нейронной сети просто не сработает.
Неужели я неправильно понял, как это должно работать или нет, каково было бы предлагаемое решение? (Я думал об указании конструкторов в методе forward
, где у вас уже есть X
для уже готовой подгонки, но я не уверен, что это хорошая практика)?