pytorch——embedding层

深度学习框架主要是整明白,每一层的输入输出。

是什么:

embed = torch.nn.Embedding(n_vocabulary,embedding_size)

embedding层(嵌入层)其实就是一个(n_vocabulary*embedding_size )矩阵,n_vocabulary代表你有多少个词,embedding_size代表每一个词的词向量的维度。所以这个矩阵就是保存所有的词的词向量,每一行代表一个词的词向量。

怎么用:

 保存了词向量的矩阵是为了,把一句话都映射出词向量的集合。但是字符串是不能直接输入embedding层的,embedding层只能接受矩阵中的行索引(可以同时接受多个索引,不是一次只能得到一个行索引,然后查找到一个词向量),然后输出对应的行索引的词向量。

import torch.nn as nn
import torch

# 有10个词的词向量,每个词向量是5维的
embeds = nn.Embedding(10, 5)
print(embeds.weight)
# 给出一句话的每个单词的索引(id)
a = torch.tensor([1,2,3,4])
# 得出这一句话所有的词向量
print(embeds(a))
print(embeds(a).size())

对于实际的过程 ,先得得到所有词在词向量矩阵中的行索引。所以在进入嵌入层之前先要有一个,查字典得过程。如果在句子里出现了词典里没有词怎么办?就把所有得词当作一个词,在字典里起名"unk",这样所有词典里没有得词的词向量就是"unk"的词向量了。

比如'w'就不再字典里,所以它的词向量就是'unk'的。

# 实际的词和行索引的对应,也就是词典
dict_1={'a':0,'b':1,'c':2,'d':3,'e':4,'f':5,'g':6,'h':7,'i':8,'unk':9}

# 对于一个新的句子,通过查找词典,找到里面词的索引
def find(s):
    d = []
    for i in s.split():
        if dict_1.get(i)!=None:
            d.append(dict_1[i])
        else:
            d.append(dict_1['unk'])
    return torch.tensor(d)

s = "a f d w"

print(embeds(find(s)))

在实际过程中,每个句子的长度是不一样的,把每个词都翻译成行索引(id),再传入embedding层就会报错。

import torch
import torch.nn as nn
embedding = nn.Embedding(10,5)
input = torch.tensor([[1,2],[0]])
out = embedding(input)
print(out)


ValueError: expected sequence of length 2 at dim 1 (got 1)

import torch
import torch.nn as nn
embedding = nn.Embedding(10,5)
input = torch.tensor([[1,2],[0,1,2]])
out = embedding(input)
print(out)

ValueError: expected sequence of length 2 at dim 1 (got 3)

所以要把所有句子截长补短,使所有句子都是一样的长度。才能传入embedding层里。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值