如何将参数从 skorch.NeuralNetClassifier.fit() 传递到我的手电筒 nn.module 的转发功能
How to pass parameters to forward function of my torch nn.module from skorch.NeuralNetClassifier.fit()
我扩展了nn.Module
来实现我的网络,它的转发功能是这样的...
def forward(self, X, **kwargs):
batch_size, seq_len = X.size()
length = kwargs['length']
embedded = self.embedding(X) # [batch_size, seq_len, embedding_dim]
if self.use_padding:
if length is None:
raise AttributeError("Length must be a tensor when using padding")
embedded = nn.utils.rnn.pack_padded_sequence(embedded, length, batch_first=True)
#print("Size of Embedded packed", embedded[0].size())
hidden, cell = self.init_hidden(batch_size)
if self.rnn_unit == 'rnn':
out, _ = self.rnn(embedded, hidden)
elif self.rnn_unit == 'lstm':
out, (hidden, cell) = self.rnn(embedded, (hidden, cell))
# unpack if padding was used
if self.use_padding:
out, _ = nn.utils.rnn.pad_packed_sequence(out, batch_first = True)
我像这样初始化了一个焦糖NeuralNetClassifier
,
net = NeuralNetClassifier(
model,
criterion=nn.CrossEntropyLoss,
optimizer=Adam,
max_epochs=8,
lr=0.01,
batch_size=32
)
现在如果我调用 net.fit(X, y, length=X_len)
它会抛出一个错误
TypeError: __call__() got an unexpected keyword argument 'length'
根据文档 fit 函数需要一个 fit_params
字典,
**fit_params : dict
Additional parameters passed to the ``forward`` method of
the module and to the ``self.train_split`` call.
并且源代码总是将我的参数发送到 train_split
,显然我的关键字参数不会被识别。
有没有办法将参数传递给我的前向函数?
fit_params
参数用于传递与数据拆分和模型相关的信息,例如拆分组。
在您的情况下,您正在通过 fit_params
将额外的 数据 传递给模块,这不是它的目的。事实上,如果您在训练数据加载器上启用批处理,那么您很容易 运行 遇到麻烦,因为那时您的长度和数据未对齐。
执行此操作的最佳方法已在 answer to your question on the issue tracker:
中描述
X_dict = {'X': X, 'length': X_len}
net.fit(X_dict, y)
由于 skorch 支持 dict
s,您可以简单地将长度添加到您的输入字典中,并将其同时传递给模块,很好地批处理并通过相同的数据加载器传递。在您的模块中,您可以通过 forward
:
中的参数访问它
def forward(self, X, length):
return ...
可以找到有关此行为的更多文档 in the docs。
我扩展了nn.Module
来实现我的网络,它的转发功能是这样的...
def forward(self, X, **kwargs):
batch_size, seq_len = X.size()
length = kwargs['length']
embedded = self.embedding(X) # [batch_size, seq_len, embedding_dim]
if self.use_padding:
if length is None:
raise AttributeError("Length must be a tensor when using padding")
embedded = nn.utils.rnn.pack_padded_sequence(embedded, length, batch_first=True)
#print("Size of Embedded packed", embedded[0].size())
hidden, cell = self.init_hidden(batch_size)
if self.rnn_unit == 'rnn':
out, _ = self.rnn(embedded, hidden)
elif self.rnn_unit == 'lstm':
out, (hidden, cell) = self.rnn(embedded, (hidden, cell))
# unpack if padding was used
if self.use_padding:
out, _ = nn.utils.rnn.pad_packed_sequence(out, batch_first = True)
我像这样初始化了一个焦糖NeuralNetClassifier
,
net = NeuralNetClassifier(
model,
criterion=nn.CrossEntropyLoss,
optimizer=Adam,
max_epochs=8,
lr=0.01,
batch_size=32
)
现在如果我调用 net.fit(X, y, length=X_len)
它会抛出一个错误
TypeError: __call__() got an unexpected keyword argument 'length'
根据文档 fit 函数需要一个 fit_params
字典,
**fit_params : dict Additional parameters passed to the ``forward`` method of the module and to the ``self.train_split`` call.
并且源代码总是将我的参数发送到 train_split
,显然我的关键字参数不会被识别。
有没有办法将参数传递给我的前向函数?
fit_params
参数用于传递与数据拆分和模型相关的信息,例如拆分组。
在您的情况下,您正在通过 fit_params
将额外的 数据 传递给模块,这不是它的目的。事实上,如果您在训练数据加载器上启用批处理,那么您很容易 运行 遇到麻烦,因为那时您的长度和数据未对齐。
执行此操作的最佳方法已在 answer to your question on the issue tracker:
中描述X_dict = {'X': X, 'length': X_len}
net.fit(X_dict, y)
由于 skorch 支持 dict
s,您可以简单地将长度添加到您的输入字典中,并将其同时传递给模块,很好地批处理并通过相同的数据加载器传递。在您的模块中,您可以通过 forward
:
def forward(self, X, length):
return ...
可以找到有关此行为的更多文档 in the docs。