Pytorch中Embedding之后怎么做?

作品为原创,转载请标明出处
我在csdn中看了很多文章,虽然我了解了Embedding的含义,但是在后续的使用过程中,很不顺畅,最终我还是自己把它给摸透了

  • Pytorch中的Embedding
    embedding= nn.Embedding(dict_len,Embedding_dim)
    dict_len:代表的是你的训练集组成词典的总长度
    Embedding_dim:就是把[4,1,2,3]中的一个item化为Embedding_dim长度的向量
    可以这样想有个长方形**(1,4)想象成长方体的一个面,假如Embedding_dim=50**,然后你把这个4向后扩充,变为一个(**1,4,50)**的长方体。
import torch.nn as nn
import torch
dict1={"你":0,"是":1,"个":2,"栽":3,"娃":4,"我":5,"中":6,"国":7,"人":8}
Embedding_dim=50 #看你自己想要多少维的
dict_len=len(dict1)
embedding= nn.Embedding(dict_len,Embedding_dim)
input=[[4,1,2,3]]
input = torch.LongTensor(input)
print(input.size())# (1,4)
x=embedding(input)
print(x.size())#(1,4,50)

做到这里大部分是之前写过的内容,但是在Embedding(词嵌入)之后我们应该怎么做?

  • 准备工作
import torch
import torch.nn as nn
import torch.optim as optim
import torch.utils.data as Data
dict_size=50 #这里我规定好了词典的长度
batch_size=2 
torch.manual_seed(2)#是的结果一致,也可以删除
  • 模型搭建

我一直存在问题的也是模型搭建的这个地方

class model(nn.Module):
    def __init__(self):
        super(model,self).__init__()
        self.embedding =nn.Embedding(dict_size,2)
        self.fc=nn.Linear(2,4)

    def forward(self,input):
        embeded= self.embedding(input)
        out =self.fc(embeded)
        return out

在代码块中 embeded= self.embedding(input) ,这里的input究竟是个啥,
后续的训练模块中会传过来一个参数[1,6],batch_size=2,所以传过来这样一个一维数组,然后embedding(input)会得到什么?假如dict_size=50,词典的总长度为50,在self.embedding =nn.Embedding(dict_size,2),我们会得到一个 50*2(50行,2列) 的向量组,50表示有50个词,2表示每个向量的长度。又回到我们的 input=[1,6] ,它会根据1,6这两个索引在大小为 50*2 (50行,2列)的向量组中,找到行号为1,6的的两个向量组成 2*2 的向量组。
根据 out =self.fc(embeded) ,然后把这个 2*2的向量组放进去,注意他是先放一个1*2,再放一个1*2的向量组进去,最后得到2*4的向量组就是当前的out,后面要和target进行运算求loss

  • 数据准备
input_target=[]
for i in range(0,dict_size):
    if i %5==0:
        input_target.append([i,5])
    elif i%8==0 :
        input_target.append([i,8])
    elif i%3==0 :
        input_target.append([i,3])
    else :
        input_target.append([i,99])
#数据被分为四类,目标值为5,8,3,其他
out_dict = {3: 0, 5: 1, 8: 2, 99: 3}
#因为后面需要用out和target的时候,out中只有索引(0,1,2,3)没有索引为8,99
#所以索引5,8,99都索引不到,所以换为0,1,2,3
input_target=[[input_target[i][j] for j in range(2)]for i in range(len(input_target))]
print(input_target)
input,target=zip(*input_target)
target=[out_dict[i] for i in target]
input = torch.LongTensor(input)
target = torch.LongTensor(target)
dataset = Data.TensorDataset(input, target)
dataloader = Data.DataLoader(dataset, batch_size,shuffle=True)
  • 必要参数
md = model()
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(md.parameters(),lr=0.01)
  • 训练
    #大家可以在debug模式下查看input,target的size,其他参数也可以
for epoch in range(100):
    for idx,(input,target) in enumerate(dataloader):
        optimizer.zero_grad()
        out = md(input)
        loss =criterion(out,target)
        print(epoch,"--->",loss)
        loss.backward()
        optimizer.step()
  • 获取embedding后的数据,也就是50*2的词向量的数据
print(md.embedding.weight)
data=md.embedding.weight.data
  • 画图
import matplotlib.pyplot as plt
for i,(x,y) in enumerate(data.numpy()):
    if i==3 or i==5 or i==8:
        plt.scatter(x, y, color='r')
    else :
        plt.scatter(x,y,color='b')

for index,data_item in enumerate(data):
        plt.annotate(index,data_item)
plt.show()
  • 结果
99 ---> tensor(0.0007, grad_fn=<NllLossBackward>)
99 ---> tensor(0.0025, grad_fn=<NllLossBackward>)
99 ---> tensor(0.0055, grad_fn=<NllLossBackward>)
99 ---> tensor(0.0024, grad_fn=<NllLossBackward>)
99 ---> tensor(0.0014, grad_fn=<NllLossBackward>)
99 ---> tensor(0.0105, grad_fn=<NllLossBackward>)
99 ---> tensor(0.0011, grad_fn=<NllLossBackward>)
99 ---> tensor(0.0055, grad_fn=<NllLossBackward>)
99 ---> tensor(0.0016, grad_fn=<NllLossBackward>)
99 ---> tensor(0.0016, grad_fn=<NllLossBackward>)
99 ---> tensor(0.0030, grad_fn=<NllLossBackward>)
99 ---> tensor(0.0018, grad_fn=<NllLossBackward>)
99 ---> tensor(0.0011, grad_fn=<NllLossBackward>)
99 ---> tensor(0.0007, grad_fn=<NllLossBackward>)
99 ---> tensor(0.0008, grad_fn=<NllLossBackward>)
99 ---> tensor(0.0022, grad_fn=<NllLossBackward>)
99 ---> tensor(0.0146, grad_fn=<NllLossBackward>)
99 ---> tensor(0.0142, grad_fn=<NllLossBackward>)
99 ---> tensor(0.0137, grad_fn=<NllLossBackward>)
99 ---> tensor(0.0120, grad_fn=<NllLossBackward>)
99 ---> tensor(0.0024, grad_fn=<NllLossBackward>)
99 ---> tensor(0.0022, grad_fn=<NllLossBackward>)
99 ---> tensor(0.0031, grad_fn=<NllLossBackward>)
99 ---> tensor(0.0013, grad_fn=<NllLossBackward>)
99 ---> tensor(0.0020, grad_fn=<NllLossBackward>)

50个向量

[ 1.3628,  3.0897],
        [-2.5115,  0.7576],
        [-2.1830,  2.0668],
        [-0.9950, -2.2796],
        [-2.0402,  1.5621],
        [ 1.5678,  2.5301],
        [-1.0902, -2.6770],
        [-1.7709,  1.2340],
        [ 1.7994, -0.9179],
        [-0.9685, -1.9943],
        [ 1.8325,  2.5903],
        [-1.4302,  2.1038],
        [-1.0960, -2.5188],
        [-1.8405,  3.5507],
        [-1.7042,  2.2227],
        [ 2.0250,  3.3083],
        [ 1.9723, -0.8660],
        [-1.7833,  1.3030],
        [-0.9751, -2.2064],
        [-1.7881,  1.1080],
        [ 2.2553,  2.7846],
        [-1.0056, -2.5331],
        [-2.1883,  0.9349],
        [-2.1015,  1.2387],
        [ 1.9663, -0.9824],
        [ 1.1682,  3.3720],
        [-1.7718,  2.5560],
        [-0.9347, -1.7703],
        [-1.4436,  1.0110],
        [-1.9208,  1.1714],
        [ 1.0700,  3.2502],
        [-1.9959,  1.2873],
        [ 3.0438, -1.4771],
        [-0.9769, -2.2489],
        [-2.0360,  2.4276],
        [ 1.7071,  2.9851],
        [-0.4290, -3.2846],
        [-1.6186,  1.4410],
        [-1.7845,  1.6495],
        [-0.8423, -1.4402],
        [ 2.1803,  2.6483],
        [-1.7366,  1.9275],
        [-1.1094, -2.7281],
        [-1.6913,  2.1427],
        [-1.9830,  0.7640],
        [ 1.4731,  1.9277],
        [-1.6684,  1.2367],
        [-1.7522,  2.1834],
        [ 3.4283, -1.5773],
        [-1.2535,  2.1722]

画图
在这里插入图片描述
作品为原创,转载请标明出处,谢谢大家,Q:1825185282

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值