Предполагая, что ваши входные векторы являются горячими, то есть там, где используются "встраиваемые слои", вы можете напрямую использовать встраивающий слой из факела, который работает выше, а также некоторые другие вещи.nn.Embeddings
в качестве длинного тензора принять ненулевой индекс горячего вектора.Например: если вектор объектов равен
f = [[0,0,1], [1,0,0]]
, то для ввода nn.Embeddings
будет
input = [2, 0]
Однако, какой запрос запрашивал OP вВопрос заключается в получении вложений путем умножения матриц, и ниже я рассмотрю это.Вы можете определить модуль для этого, как показано ниже.Поскольку param является экземпляром nn.Parameter
, он будет зарегистрирован в качестве параметра и будет оптимизирован при вызове Адама или любого другого оптимизатора.
class Embedding(nn.Module):
def __init__(self, input_dim, embedding_dim):
super().__init__()
self.param = torch.nn.Parameter(torch.randn(input_dim, embedding_dim))
def forward(self, x):
return torch.mm(x, self.param)
Если вы заметите, что это то же самое, что линейныйслой без смещения и немного другой инициализации.Поэтому вы можете добиться того же, используя линейный слой, как показано ниже.
self.embedding = nn.Linear(4096, 20, bias=False)
# change initial weights to normal[0,1] or whatever is required
embedding.weight.data = torch.randn_like(embedding.weight)