现在你有一个[20,64]的编码emb1,代表20件商品。现在你想将每个商品的特征信息emb2融入到编码中,获得一个新的[20,64]的编码emb1’。假设商品信息编码emb2是[20,8]的,你需要将emb1中的每一个编码的前8项emb1[:,:8] 换成 emb2,可以这样做:
(下面代码的embedding代表的是商品编码,fea代表的是商品的特征信息)
import torch
import torch.nn as nn
x = nn.init.xavier_normal_(nn.Parameter(torch.Tensor(20, 64)))
fea = nn.Embedding(20, 8)
for i in range(0, 20):
x[i, :8] = fea.weight[i]
embedding = nn.Embedding(20, 8, _weight=x)
输出:
embedding.weight[0]
Out[2]:
tensor([-0.7128, -1.8596, -0.5473, 0.3086, -0.4706, -0.3109, 1.5375, 1.5377,
-0.0819, 0.1718, -0.0422, -0.0682, 0.0161, 0.2059, 0.0259, 0.2842,
...........],
grad_fn=<SelectBackward>)
fea.weight[0]
Out[3]:
tensor([-0.7128, -1.8596, -0.5473, 0.3086, -0.4706, -0.3109, 1.5375, 1.5377],
grad_fn=<SelectBackward>)
可以发现,embedding的前8位于fea一致。
实验中,我发现,虽然能更改embedding的值,但是embedding的部分属性也会改变(可以用pycharm检测一下),可能会导致模型精度改变,需要进一步调整参数;即使只改变一件商品的embedding,也会导致性能出现变化,不知道哪里做得不对,可能是pytorch不支持