【发布时间】:2020-02-17 00:14:52
【问题描述】:
我正在尝试将 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 可供使用,但我不是确定这是好的做法)?
【问题讨论】:
标签: python deep-learning pytorch skorch