我正在尝试将 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
可以使用的方法中,但我不确定这是一个好习惯)?