pytorch Embedding 修改 自定义

现在你有一个[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不支持

你可能感兴趣的:(深度学习,pytorch,embedding)