当我创建一个新的NN时,我使用了一个特征嵌入层作为输入层来嵌入分类特征。但是,我注意到,当我执行培训时,这些嵌入(应该是可训练的)不会被更新。除了嵌入之外,所有其他内容都会更新。
考虑到我有几个分类特性,我定义我的FeatureEmbedder模块如下。
class FeatureEmbedder(nn.Module):
# Discuss if we need this implementation or if the FeatureEmbedded from gluonts.torch.model.modules.feature works
@validated()
def __init__(
self,
cardinalities: List[int],
embedding_dimensions: List[int],
):
super().__init__()
self._num_embedded_features = len(cardinalities)
self.embedders = [
torch.nn.Embedding(num_embeddings=card, embedding_dim=dim)
for card, dim in zip(cardinalities, embedding_dimensions)
]
def forward(self, features):
"""
:param features: (-1, num_features)
:return:
Embedding with shape (-1, sum([self.embedding_dimensions]))
"""
embedded_features = torch.cat(
[
embedder(features[:, i].long())
for i, embedder in enumerate(self.embedders)
],
dim=-1,
)
return embedded_features我注意到,当我第一次调用我的训练函数并打印模型时,FeatureEmbedder子模块似乎没有任何参数,我没有解释.
| Name | Type | Params
--------------------------------------------------------------------------
0 | model | NNetwork | 193
1 | model.embedder | FeatureEmbedder | 0
2 | model.model | Sequential | 160
3 | model.model.0 | Linear | 50
4 | model.model.1 | ReLU | 0
5 | model.model.2 | Linear | 110
6 | model.model.3 | ReLU | 0
7 | model.output_layer | Sequential | 33
8 | model.output_layer.linear | Linear | 33
9 | loss | ScaledNegativeLogLikelihood | 0
--------------------------------------------------------------------------有人能帮我解释一下为什么我的嵌入式不接受网络培训吗?我已经检查过了,在我看来,所有的张量/嵌入都需要梯度(xx.requires_grad是真实的)。
谢谢!
发布于 2022-03-03 22:52:32
苏史密斯在pytorch论坛上的一个问题中解释了这一点。不要使用列表来存储权重/层,因为如果参数在常规列表中,self.parameters就不会查找它们,而这些参数(假设是)传递给优化器。使用torch.nn.ModuleList代替。
https://stackoverflow.com/questions/71344638
复制相似问题