作品为原创,转载请标明出处
我在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