1、enumerate
python内置的函数,遍历一个数据对象并返回索引列表,同时列出数据下标和数据 list = ["a", "b", "c"] for i,elem in enumerate(list): ?? ?print(i, elem) ?? ? 返回: 0 a 1 b 2 c
2、tqdm
它是一个可以显示进度条的模块 当tqdm和enumerate结合时,比如 from tqdm import tqdm list = ["a", "b", "c"] for i,elem in enumerate(tqdm(list)): ?? ?print(i, elem)
返回: 0 a 1 b 2 c 100%|██████████| 3/3 [00:00<?, ?it/s]
3、word embedding 将源数据映射到另外一个空间,一对一映射。可以将自然语言所表示的单次或短语转换为计算机所能理解的由实数构成的向量或矩阵形式。这样得到一个向量以后,就可以通过计算向量之间的相似度来得出语义的相关性。 torch.nn.Embedding(num_embeddings, embedding_dim) num_embeddings: 嵌入字典的大小(词的个数) embedding_dim: 每个嵌入向量的大小(每个词对应的维度) 该方法定义了一个简单的存储固定大小的词典的嵌入向量的查找表,即这个返回的是一个词典。如果要访问查找表,需要给定一个编号,嵌入层就能返回这个编号对应的嵌入向量。 注意:初始化的时候,里面的值都是随机的,后续需要训练模型。
示例一:初始化一个embedding并进行值索引 import torch import torch.nn as nn
word1 = torch.LongTensor([0,1,2]) word2 = torch.LongTensor([3,1,2]) embedding = nn.Embedding(4, 5) print(embedding.weight) print("word1:") print(embedding(word1)) print("word2:") print(embedding(word2))
返回: tensor([[ 0.0514, -1.0414, ?0.2586, -0.8766, -0.1747], ? ? ? ? [-0.8588, ?0.4468, ?0.7430, -0.7781, -1.5827], ? ? ? ? [-2.0571, ?0.0059, ?0.3309, -0.0148, -1.8753], ? ? ? ? [ 0.4409, ?0.8645, ?0.2430, ?0.4251, -0.2876]], requires_grad=True) word1: tensor([[ 0.0514, -1.0414, ?0.2586, -0.8766, -0.1747], ? ? ? ? [-0.8588, ?0.4468, ?0.7430, -0.7781, -1.5827], ? ? ? ? [-2.0571, ?0.0059, ?0.3309, -0.0148, -1.8753]], ? ? ? ?grad_fn=<EmbeddingBackward>) word2: tensor([[ 0.4409, ?0.8645, ?0.2430, ?0.4251, -0.2876], ? ? ? ? [-0.8588, ?0.4468, ?0.7430, -0.7781, -1.5827], ? ? ? ? [-2.0571, ?0.0059, ?0.3309, -0.0148, -1.8753]], ? ? ? ?grad_fn=<EmbeddingBackward>)
示例二:embedding模型训练更新权重 import torch from torch.nn import Embedding
class Model(torch.nn.Module): ? ? def __init__(self): ? ? ? ? super(Model, self).__init__() ? ? ? ? self.emb = Embedding(5, 10)
? ? def forward(self, vec): ? ? ? ? input = torch.tensor([0, 1, 2, 3, 4]) ? ? ? ? emb_vec1 = self.emb(input) ? ? ? ? print(emb_vec1) ? ? ? ? output = torch.einsum('ik, kj -> ij', emb_vec1, vec) ? ? ? ? return output
def simple_train(): ? ? model = Model() ? ? vec = torch.randn((10, 1)) ? ? label = torch.Tensor(5, 1).fill_(3) ? ? loss_fn = torch.nn.MSELoss() ? ? opt = torch.optim.SGD(model.parameters(), lr=0.05)
? ? for iter_num in range(100): ? ? ? ? output = model(vec) ? ? ? ? loss = loss_fn(output, label) ? ? ? ? print('iter:%d loss:%.2f' % (iter_num, loss)) ? ? ? ? opt.zero_grad() ? ? ? ? loss.backward(retain_graph=True) ? ? ? ? opt.step()
if __name__ == '__main__': ? ? simple_train()
model中的参数就是一个embedding,前向传播总是编码同一个词汇表,然后乘上输入的向量。经果训练滞后embedding乘上向量可以得到全为3的向量。优化器中的参数仅有embedding,所以bedding是会被训练的。
4、torch.distributions.normal.Normal torch.distributions定义了正态分布
import torch from torch.distributions import Normal
mean = torch.Tensor([0, 2]) ? #此处有两个均值 normal = Normal(mean, 1) c = normal.sample() c_log_prob = normal.log_prob(c).exp() print("c:", c) print("c log_prob:", c_log_prob)
其中, sample()就是直接在定义的正态分布(均值为mean,标准差为std)上采样。 log_prob(value)是计算value在定义的正态分布(mean, std)中对应的概率密度函数的对数值。
概率密度函数,对其取log的公式分别如下:
返回值: c: tensor([0.0274, 1.0780]) c log_prob: tensor([0.3988, 0.2608]) ?
?
|