pytorch-word2vec的实例实现

word2vec的实例实现

实现词嵌入word2vec中的跳字模型近似训练中的负采样以及二次采样(subsampling),在语料库上训练词嵌入模型的实现。

首先导入实验所需的包或模块。

import collections
import math
import random
import sys
import time
import os
import numpy as np
import torch
from torch import nn
import torch.utils.data as Data
import osprint(torch.__version__)

处理数据集

PTB(Penn Tree Bank)是一个常用的小型语料库 。它采样自《华尔街日报》的文章,包括训练集、验证集和测试集。我们将在PTB训练集上训练词嵌入模型。该数据集的每一行作为一个句子。句子中的每个词由空格隔开。

assert 'ptb.train.txt' in os.listdir("../ref/data/ptb")with open('../ref/data/ptb/ptb.train.txt', 'r') as f:lines = f.readlines()# st是sentence的缩写raw_dataset = [st.split() for st in lines]'# sentences: %d' % len(raw_dataset) # 输出 '# sentences: 42068'

输出:

'# sentences: 42068'

对于数据集的前5个句子,打印每个句子的词数和前5个词。这个数据集中句尾符为"",生僻词全用"“表示,数字则被替换成了"N”。

for st in raw_dataset[:5]:print('# tokens:', len(st), st[:5])
# tokens: 24 ['aer', 'banknote', 'berlitz', 'calloway', 'centrust']
# tokens: 15 ['pierre', '<unk>', 'N', 'years', 'old']
# tokens: 11 ['mr.', '<unk>', 'is', 'chairman', 'of']
# tokens: 23 ['rudolph', '<unk>', 'N', 'years', 'old']
# tokens: 34 ['a', 'form', 'of', 'asbestos', 'once']

建立词语索引

只保留在数据集中至少出现5次的词。

# tk是token的缩写
counter = collections.Counter([tk for st in raw_dataset for tk in st])
counter = dict(filter(lambda x: x[1] >= 5, counter.items()))

然后将词映射到整数索引。

idx_to_token = [tk for tk, _ in counter.items()]
token_to_idx = {tk: idx for idx, tk in enumerate(idx_to_token)}
dataset = [[token_to_idx[tk] for tk in st if tk in token_to_idx]for st in raw_dataset]
num_tokens = sum([len(st) for st in dataset])
'# tokens: %d' % num_tokens # 输出 '# tokens: 887100'

二次采样

文本数据中一般会出现一些高频词,如英文中的“the”“a”和“in”。通常来说,在一个背景窗口中,一个词(如“chip”)和较低频词(如“microprocessor”)同时出现比和较高频词(如“the”)同时出现对训练词嵌入模型更有益。因此,训练词嵌入模型时可以对词进行二次采样 [2]。 具体来说,数据集中每个被索引词wiw_iwi将有一定概率被丢弃,该丢弃概率为

P(wi)=max⁡(1−tf(wi),0)P(w_i) = \max\left(1 - \sqrt{\frac{t}{f(w_i)}}, 0\right)P(wi)=max(1f(wi)t,0)

其中 f(wi)f(w_i)f(wi) 是数据集中词wiw_iwi的个数与总词数之比,常数ttt是一个超参数(实验中设为10−410^{-4}104)。可见,只有当f(wi)>tf(w_i) > tf(wi)>t时,我们才有可能在二次采样中丢弃词wiw_iwi,并且越高频的词被丢弃的概率越大。

def discard(idx):return random.uniform(0, 1) < 1 - math.sqrt(1e-4 / counter[idx_to_token[idx]] * num_tokens) #概率丢弃subsampled_dataset = [[tk for tk in st if not discard(tk)] for st in dataset]
'# tokens: %d' % sum([len(st) for st in subsampled_dataset]) # '# tokens: 375875'

二次采样后去掉了一半左右的词。下面比较一个词在二次采样前后出现在数据集中的次数。可见高频词“the”的采样率不足1/20。

def compare_counts(token):return '# %s: before=%d, after=%d' % (token, sum([st.count(token_to_idx[token]) for st in dataset]), sum([st.count(token_to_idx[token]) for st in subsampled_dataset]))compare_counts('the') # '# the: before=50770, after=2013'

低频词“join”则完整地保留了下来。

compare_counts('join') # '# join: before=45, after=45'

提取中心词和背景词

我们将与中心词距离不超过背景窗口大小的词作为它的背景词。下面定义函数提取出所有中心词和它们的背景词。它每次在整数1和max_window_size(最大背景窗口)之间随机均匀采样一个整数作为背景窗口大小。

def get_centers_and_contexts(dataset, max_window_size):centers, contexts = [], []for st in dataset:if len(st) < 2:  # 每个句子至少要有2个词才可能组成一对“中心词-背景词”continuecenters += stfor center_i in range(len(st)):window_size = random.randint(1, max_window_size)indices = list(range(max(0, center_i - window_size),min(len(st), center_i + 1 + window_size)))indices.remove(center_i)  # 将中心词排除在背景词之外contexts.append([st[idx] for idx in indices])return centers, contexts

创建一个人工数据集,其中含有词数分别为7和3的两个句子。设最大背景窗口为2,打印所有中心词和它们的背景词。

tiny_dataset = [list(range(7)), list(range(7, 10))]
print('dataset', tiny_dataset)
for center, context in zip(*get_centers_and_contexts(tiny_dataset, 2)):print('center', center, 'has contexts', context)

输出:

dataset [[0, 1, 2, 3, 4, 5, 6], [7, 8, 9]]
center 0 has contexts [1]
center 1 has contexts [0, 2]
center 2 has contexts [0, 1, 3, 4]
center 3 has contexts [2, 4]
center 4 has contexts [3, 5]
center 5 has contexts [3, 4, 6]
center 6 has contexts [5]
center 7 has contexts [8, 9]
center 8 has contexts [7, 9]
center 9 has contexts [8]

设最大背景窗口大小为5。提取数据集中所有的中心词及其背景词。

all_centers, all_contexts = get_centers_and_contexts(subsampled_dataset, 5)

使用负采样来进行近似训练。对于一对中心词和背景词,我们随机采样KKK个噪声词(实验中设K=5K=5K=5)。根据word2vec论文的建议,噪声词采样概率P(w)P(w)P(w)设为www词频与总词频之比的0.75次方

def get_negatives(all_contexts, sampling_weights, K):all_negatives, neg_candidates, i = [], [], 0population = list(range(len(sampling_weights)))for contexts in all_contexts:negatives = []while len(negatives) < len(contexts) * K: #K negative for one backgroundif i == len(neg_candidates):# 根据每个词的权重(sampling_weights)随机生成k个词的索引作为噪声词。# 为了高效计算,可以将k设得稍大一点i, neg_candidates = 0, random.choices(population, sampling_weights, k=int(1e5)) #参数weights设置相对权重,它的值是一个列表,设置之后,每一个成员被抽取到的概率就被确定了。neg, i = neg_candidates[i], i + 1# 噪声词不能是背景词if neg not in set(contexts):negatives.append(neg) #select negative from 10**5 candidatesall_negatives.append(negatives) return all_negativessampling_weights = [counter[w]**0.75 for w in idx_to_token]
all_negatives = get_negatives(all_contexts, sampling_weights, 5)

这里展示一下K与背景词数量、干扰词数量的关系:

K = 5
print(" {} * len of ({}) = len of({})".format(K, all_contexts[0], all_negatives[0]))

读取数据

从数据集中提取所有中心词all_centers,以及每个中心词对应的背景词all_contexts和噪声词all_negatives。我们先定义一个Dataset类。

class MyDataset(torch.utils.data.Dataset):def __init__(self, centers, contexts, negatives):assert len(centers) == len(contexts) == len(negatives)#trigger for exceptionself.centers = centersself.contexts = contextsself.negatives = negativesdef __getitem__(self, index):return (self.centers[index], self.contexts[index], self.negatives[index])def __len__(self):return len(self.centers)

通过随机小批量来读取它们。在一个小批量数据中,第iii个样本包括一个中心词以及它所对应的nin_ini个背景词和mim_imi个噪声词。

  • 由于每个样本的背景窗口大小可能不一样,其中背景词与噪声词个数之和ni+min_i+m_ini+mi也会不同。
  • 在构造小批量时,我们将每个样本的背景词和噪声词连结在一起,并添加填充项0直至连结后的长度相同,即长度均为max⁡ini+mi\max_i n_i+m_imaxini+mi(max_len变量)。
  • 为了避免填充项对损失函数计算的影响,我们构造了掩码变量masks,其每一个元素分别与连结后的背景词和噪声词contexts_negatives中的元素一一对应。
  • 当contexts_negatives变量中的某个元素为填充项时,相同位置的掩码变量masks中的元素取0,否则取1。
  • 为了区分正类和负类,我们还需要将contexts_negatives变量中的背景词和噪声词区分开来。
  • 依据掩码变量的构造思路,我们只需创建与contexts_negatives变量形状相同的标签变量labels,并将与背景词(正类)对应的元素设1,其余清0。

下面我们实现这个小批量读取函数batchify。它的小批量输入data是一个长度为批量大小的列表,其中每个元素分别包含中心词center、背景词context和噪声词negative。该函数返回的小批量数据符合我们需要的格式,例如,包含了掩码变量。

def batchify(data):"""用作DataLoader的参数collate_fn: 输入是个长为batchsize的list, list中的每个元素都是Dataset类调用__getitem__得到的结果"""max_len = max(len(c) + len(n) for _, c, n in data)centers, contexts_negatives, masks, labels = [], [], [], []for center, context, negative in data:cur_len = len(context) + len(negative)centers += [center]contexts_negatives += [context + negative + [0] * (max_len - cur_len)]masks += [[1] * cur_len + [0] * (max_len - cur_len)]labels += [[1] * len(context) + [0] * (max_len - len(context))]return (torch.tensor(centers).view(-1, 1), torch.tensor(contexts_negatives),torch.tensor(masks), torch.tensor(labels))

用刚刚定义的batchify函数指定DataLoader实例中小批量的读取方式,然后打印读取的第一个批量中各个变量的形状。

batch_size = 512
num_workers = 0 if sys.platform.startswith('win32') else 4dataset = MyDataset(all_centers, all_contexts, all_negatives)
data_iter = Data.DataLoader(dataset, batch_size, shuffle=True, #set a dataset forcollate_fn=batchify, num_workers=num_workers)
for batch in data_iter:for name, data in zip(['centers', 'contexts_negatives', 'masks','labels'], batch):print(name, 'shape:', data.shape)break

输出:

centers shape: torch.Size([512, 1])
contexts_negatives shape: torch.Size([512, 60])
masks shape: torch.Size([512, 60])
labels shape: torch.Size([512, 60])

跳字模型

通过使用嵌入层和小批量乘法来实现跳字模型。它们也常常用于实现其他自然语言处理的应用。

嵌入层

获取词嵌入的层称为嵌入层,在PyTorch中可以通过创建nn.Embedding实例得到。嵌入层的权重是一个矩阵,其行数为词典大小(num_embeddings),列数为每个词向量的维度(embedding_dim)。我们设词典大小为20,词向量的维度为4。

embed = nn.Embedding(num_embeddings=20, embedding_dim=4)
embed.weight

输出:

Parameter containing:
tensor([[ 1.4661, -0.0863, -0.7256, -0.4591],[-0.1848,  0.1527, -0.9891,  1.3739],[ 1.6892, -0.8399, -0.1476, -0.6153],[ 1.6853, -0.0610,  1.8559,  0.6242],[-1.5009,  0.2730, -0.3688,  0.5599],[-1.3175,  0.9324,  0.0477,  0.6728],[ 0.0316,  0.9806, -0.6857,  1.2622],[-1.4576, -0.9973, -0.1076,  0.0197],[-1.4366, -0.8724, -0.0563,  1.2543],[-1.5040,  0.4426, -0.6406,  0.0243],[-1.4785,  1.2112, -0.2328,  1.2140],[-2.2098, -0.3141,  0.3318, -1.0206],[ 1.2869,  0.9700,  2.3408,  0.2634],[-0.7229, -0.1446,  0.5023,  1.4011],[ 0.5258,  0.7519,  0.5948,  1.2724],[-0.4999, -1.9596, -1.9181,  1.3039],[-0.5907,  0.0956, -1.3246, -0.1742],[-1.0380, -0.1586, -0.8281,  0.1813],[ 0.7077,  0.4264,  1.7595,  1.1582],[-0.5711,  0.0796,  0.7719, -0.5790]], requires_grad=True)

嵌入层的输入为词的索引。输入一个词的索引iii,嵌入层返回权重矩阵的第iii行作为它的词向量。下面我们将形状为(2, 3)的索引输入进嵌入层,由于词向量的维度为4,我们得到形状为(2, 3, 4)的词向量。

x = torch.tensor([[1, 2, 3], [4, 5, 6]], dtype=torch.long)
embed(x)

输出:

tensor([[[-0.1848,  0.1527, -0.9891,  1.3739],[ 1.6892, -0.8399, -0.1476, -0.6153],[ 1.6853, -0.0610,  1.8559,  0.6242]],[[-1.5009,  0.2730, -0.3688,  0.5599],[-1.3175,  0.9324,  0.0477,  0.6728],[ 0.0316,  0.9806, -0.6857,  1.2622]]], grad_fn=<EmbeddingBackward>)

小批量乘法

可以使用小批量乘法运算bmm对两个小批量中的矩阵一一做乘法。

  • 假设第一个小批量中包含nnn个形状为a×ba\times ba×b的矩阵X1,…,Xn\boldsymbol{X}_1, \ldots, \boldsymbol{X}_nX1,,Xn
  • 第二个小批量中包含nnn个形状为b×cb\times cb×c的矩阵Y1,…,Yn\boldsymbol{Y}_1, \ldots, \boldsymbol{Y}_nY1,,Yn
  • 这两个小批量的矩阵乘法输出为nnn个形状为a×ca\times ca×c的矩阵X1Y1,…,XnYn\boldsymbol{X}_1\boldsymbol{Y}_1, \ldots, \boldsymbol{X}_n\boldsymbol{Y}_nX1Y1,,XnYn

因此,给定两个形状分别为(nnn, aaa, bbb)和(nnn, bbb, ccc)的Tensor,小批量乘法输出的形状为(nnn, aaa, ccc)。

X = torch.ones((2, 1, 4))
Y = torch.ones((2, 4, 6))
torch.bmm(X, Y).shape

输出:

X = torch.ones((2, 1, 4))
Y = torch.ones((2, 4, 6))
torch.bmm(X, Y).shape

跳字模型前向计算

在前向计算中,跳字模型的输入包含中心词索引center以及连结的背景词与噪声词索引contexts_and_negatives。其中center变量的形状为(批量大小, 1),而contexts_and_negatives变量的形状为(批量大小, max_len)。这两个变量先通过词嵌入层分别由词索引变换为词向量,再通过小批量乘法得到形状为(批量大小, 1, max_len)的输出。输出中的每个元素是中心词向量与背景词向量或噪声词向量的内积。

def skip_gram(center, contexts_and_negatives, embed_v, embed_u):v = embed_v(center)#(batch_size, 1)u = embed_u(contexts_and_negatives)#(batch_size, max_len)pred = torch.bmm(v, u.permute(0, 2, 1))return pred

简单说一下Tensor.permute的作用:
permute就是更改Tensor的维度,下面的例子将Tensor的二、三维度做了交换

#help
x = torch.randn(2, 3, 5)
print(x)
x.permute(0,2,1)

输出

tensor([[[ 0.4602,  0.1497, -0.4955, -0.6957,  0.0581],[-0.5020, -0.6797, -0.6404,  2.0036,  0.5790],[-0.0533, -0.4460, -0.2509,  0.1712, -1.3488]],[[-0.3313,  0.7201,  0.2478, -1.6327, -0.4580],[ 0.5060, -0.1724,  2.7267,  0.1494, -0.3988],[-1.8063, -0.5025, -0.3524,  0.4211,  1.5029]]])
tensor([[[ 0.4602, -0.5020, -0.0533],[ 0.1497, -0.6797, -0.4460],[-0.4955, -0.6404, -0.2509],[-0.6957,  2.0036,  0.1712],[ 0.0581,  0.5790, -1.3488]],[[-0.3313,  0.5060, -1.8063],[ 0.7201, -0.1724, -0.5025],[ 0.2478,  2.7267, -0.3524],[-1.6327,  0.1494,  0.4211],[-0.4580, -0.3988,  1.5029]]])

训练模型

定义二元交叉熵损失函数

根据负采样中损失函数的定义,我们可以使用二元交叉熵损失函数,
−log⁡P(w(t+j)∣w(t))=−log⁡P(D=1∣w(t),w(t+j))−∑k=1,wk∼P(w)Klog⁡P(D=0∣w(t),wk)=−log⁡σ(uit+j⊤vit)−∑k=1,wk∼P(w)Klog⁡(1−σ(uhk⊤vit))=−log⁡σ(uit+j⊤vit)−∑k=1,wk∼P(w)Klog⁡σ(−uhk⊤vit).\begin{aligned} -\log P(w^{(t+j)} \mid w^{(t)}) =& -\log P(D=1\mid w^{(t)}, w^{(t+j)}) - \sum_{k=1,\ w_k \sim P(w)}^K \log P(D=0\mid w^{(t)}, w_k)\ \\ =&- \log \sigma\left(\boldsymbol{u}_{i_{t+j}}^\top \boldsymbol{v}_{i_t}\right) - \sum{k=1,\ w_k \sim P(w)}^K \log\left(1-\sigma\left(\boldsymbol{u}_{h_k}^\top \boldsymbol{v}_{i_t}\right)\right)\\\ =&- \log \sigma\left(\boldsymbol{u}_{i_{t+j}}^\top \boldsymbol{v}_{i_t}\right) - \sum{k=1,\ w_k \sim P(w)}^K \log\sigma\left(-\boldsymbol{u}_{h_k}^\top \boldsymbol{v}_{i_t}\right). \end{aligned} logP(w(t+j)w(t))== =logP(D=1w(t),w(t+j))k=1, wkP(w)KlogP(D=0w(t),wk) logσ(uit+jvit)k=1, wkP(w)Klog(1σ(uhkvit))logσ(uit+jvit)k=1, wkP(w)Klogσ(uhkvit).

下面定义SigmoidBinaryCrossEntropyLoss。

class SigmoidBinaryCrossEntropyLoss(nn.Module):def __init__(self): # none mean sumsuper(SigmoidBinaryCrossEntropyLoss, self).__init__()def forward(self, inputs, targets, mask=None):"""input – Tensor shape: (batch_size, len)target – Tensor of the same shape as input"""inputs, targets, mask = inputs.float(), targets.float(), mask.float()res = nn.functional.binary_cross_entropy_with_logits(inputs, targets, reduction="none", weight=mask)return res.mean(dim=1)loss = SigmoidBinaryCrossEntropyLoss()

我们可以通过掩码变量指定小批量中参与损失函数计算的部分预测值和标签:

  • 当掩码为1时,相应位置的预测值和标签将参与损失函数的计算;
  • 当掩码为0时,相应位置的预测值和标签则不参与损失函数的计算。

我们之前提到,掩码变量可用于避免填充项对损失函数计算的影响。

pred = torch.tensor([[1.5, 0.3, -1, 2], [1.1, -0.6, 2.2, 0.4]])
# 标签变量label中的1和0分别代表背景词和噪声词
label = torch.tensor([[1, 0, 0, 0], [1, 1, 0, 0]])
mask = torch.tensor([[1, 1, 1, 1], [1, 1, 1, 0]])  # 掩码变量
loss(pred, label, mask) * mask.shape[1] / mask.float().sum(dim=1)

输出:

tensor([0.8740, 1.2100])

下面将从零开始实现二元交叉熵损失函数的计算,并根据掩码变量mask计算掩码为1的预测值和标签的损失。

def sigmd(x):return - math.log(1 / (1 + math.exp(-x)))print('%.4f' % ((sigmd(1.5) + sigmd(-0.3) + sigmd(1) + sigmd(-2)) / 4)) # 注意1-sigmoid(x) = sigmoid(-x)
print('%.4f' % ((sigmd(1.1) + sigmd(-0.6) + sigmd(-2.2)) / 3))

输出:

0.8740
1.2100

发现结果和使用pytorch内置函数是一样的

初始化模型参数

分别构造中心词和背景词的嵌入层,并将超参数词向量维度embed_size设置成100。

embed_size = 100
net = nn.Sequential(nn.Embedding(num_embeddings=len(idx_to_token), embedding_dim=embed_size),nn.Embedding(num_embeddings=len(idx_to_token), embedding_dim=embed_size)
)

定义训练函数

由于填充项的存在,与之前的训练函数相比,损失函数的计算稍有不同

def train(net, lr, num_epochs):device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')print("train on", device)net = net.to(device)optimizer = torch.optim.Adam(net.parameters(), lr=lr)for epoch in range(num_epochs):start, l_sum, n = time.time(), 0.0, 0for batch in data_iter:center, context_negative, mask, label = [d.to(device) for d in batch]pred = skip_gram(center, context_negative, net[0], net[1])# 使用掩码变量mask来避免填充项对损失函数计算的影响l = (loss(pred.view(label.shape), label, mask) *mask.shape[1] / mask.float().sum(dim=1)).mean() # 一个batch的平均lossoptimizer.zero_grad()l.backward()optimizer.step()l_sum += l.cpu().item()n += 1print('epoch %d, loss %.2f, time %.2fs'% (epoch + 1, l_sum / n, time.time() - start))
train(net, 0.01, 10)

输出:

train on cuda
epoch 1, loss 1.97, time 7.79s
epoch 2, loss 0.63, time 7.28s
epoch 3, loss 0.45, time 7.43s
epoch 4, loss 0.40, time 7.62s
epoch 5, loss 0.37, time 7.46s
epoch 6, loss 0.35, time 7.39s
epoch 7, loss 0.34, time 7.64s
epoch 8, loss 0.33, time 7.60s
epoch 9, loss 0.32, time 7.34s
epoch 10, loss 0.32, time 7.38s

应用词嵌入模型

根据两个词向量的余弦相似度表示词与词之间在语义上的相似度

def get_similar_tokens(query_token, k, embed):W = embed.weight.datax = W[token_to_idx[query_token]]# 添加的1e-9是为了数值稳定性cos = torch.matmul(W, x) / (torch.sum(W * W, dim=1) * torch.sum(x * x) + 1e-9).sqrt() #词向量之间的关联性_, topk = torch.topk(cos, k=k+1)topk = topk.cpu().numpy()for i in topk[1:]:  # 除去输入词print('cosine sim=%.3f: %s' % (cos[i], (idx_to_token[i])))get_similar_tokens('news', 10, net[0])

输出:

cosine sim=0.424: hoffman
cosine sim=0.398: daughter
cosine sim=0.396: tokyo
cosine sim=0.394: attributed
cosine sim=0.376: slew
cosine sim=0.373: steps
cosine sim=0.370: pleased
cosine sim=0.369: daily
cosine sim=0.362: reviewing
cosine sim=0.361: wednesday

输出了与”news“最相关的10个词,按照相关度排序

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/507939.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pytorch-LSTM的输入和输出尺寸

LSTM的输入和输出尺寸 CLASS torch.nn.LSTM(*args, **kwargs)Applies a multi-layer long short-term memory (LSTM) RNN to an input sequence. For each element in the input sequence, each layer computes the following function: 对于一个输入序列实现多层长短期记忆的…

python中的[-1]、[:-1]、[::-1]、[n::-1]

import numpy as np anp.random.rand(4) print(a)[0.48720333 0.67178384 0.65662903 0.40513918]print(a[-1]) #取最后一个元素 0.4051391774882336print(a[:-1]) #去除最后一个元素 [0.48720333 0.67178384 0.65662903]print(a[::-1]) #逆序 [0.40513918 0.65662903 0.67178…

torchtext.data.Field

torchtext.data.Field 类接口 class torchtext.data.Field(sequentialTrue, use_vocabTrue, init_tokenNone, eos_tokenNone, fix_lengthNone, dtypetorch.int64, preprocessingNone, postprocessingNone, lowerFalse, tokenizeNone, tokenizer_languageen, include_lengthsF…

np.triu

np.triu numpy.triu(m, k0) Upper triangle of an array. Return a copy of a matrix with the elements below the k-th diagonal zeroed. 返回一个矩阵的上三角矩阵&#xff0c;第k条对角线以下的元素归零 例如&#xff1a; import numpy as np np.triu(np.ones([4,4]), …

python读取json格式的超参数

python读取json格式的超参数 json文件&#xff1a; {"full_finetuning": true,"max_len": 180,"learning_rate": 3e-5,"weight_decay": 0.01,"clip_grad": 2,"batch_size": 30,"epoch_num": 20,"…

python缺少标准库_干货分享:Python如何自动导入缺失的库

很多同学在写Python项目时会遇到导入模块失败的情况&#xff1a;ImportError: No module named xxx或者ModuleNotFoundError: No module named xxx。导入模块失败通常分为两种&#xff1a;一种是导入自己写的模块(即以 .py 为后缀的文件)&#xff0c;另一种是导入三方库。接下来…

.val()数据乱码_【目标检测数据集】PASCAL VOC制作

【VOC20072012】数据集地址&#xff1a;https://pjreddie.com/projects/pascal-voc-dataset-mirror/PASCAL VOC为图像识别和分类提供了一整套标准化的优秀的数据集&#xff0c;用于构建和评估用于图像分类&#xff08;Classification&#xff09;&#xff0c;检测&#xff08;O…

pytorch-多GPU训练(单机多卡、多机多卡)

pytorch-多GPU训练&#xff08;单机多卡、多机多卡&#xff09; pytorch 单机多卡训练 首先是数据集的分布处理 需要用到的包&#xff1a; torch.utils.data.distributed.DistributedSampler torch.utils.data.DataLoader torch.utils.data.Dataset DistributedSampler这个…

机器人 铑元素_智能机器人 三十三

福里斯特茫然不知所措地从窃窃私语的黑暗中转过身来&#xff0c;沉重的失败感犹如巨怪压得他喘不过气来。他顺从地跛着脚走向笼内角落里的小浴室&#xff0c;冲着微笑着的木偶刚才经过的地方点点头&#xff0c;漫不经意地问道&#xff1a;“你们是如何抓住他们的&#xff1f;”…

character-level OCR之Character Region Awareness for Text Detection(CRAFT) 论文阅读

Character Region Awareness for Text Detection 论文阅读 论文地址(arXiv) &#xff0c;pytorch版本代码地址 最近在看一些OCR的问题&#xff0c;CRAFT是在场景OCR中效果比较好的模型&#xff0c;记录一下论文的阅读 已有的文本检测工作大致如下&#xff1a; 基于回归的文…

c# wpf 面试_【远程面试】九强通信 | 九洲电器集团全资子公司

成都IT内推圈成立于2016年,专注成都IT互联网领域的招聘与求职;覆盖精准IT人群10W,通过内推圈推荐且已入职人数超过5000,合作公司均系成都知名或靠谱公司.此公众号每天7:30AM准时推送当天职位详情,敬请关注并置顶&#xff01;岗位投递一、登陆内推圈官网: www.itneituiquan.com,…

ViT(Vision Transformer)学习

ViT(Vison Transformer)学习 Paper:An image is worth 1616 words: transformers for image recognition at scale. In ICLR, 2021. Transformer 在 NLP领域大放异彩&#xff0c;并且随着模型和数据集的不断增长&#xff0c;仍然没有表现出饱和的迹象。这使得使用更大规模的数…

mysql php宝塔 root_[转载]在安卓中安装宝塔面板运行PHP+MySQL

手机上的操作我用的手机是小米10pro&#xff0c;其他手机应该也能用相同的方法安装成功。安装Linux Deploy&#xff0c;然后给它root权限。点击左上角的菜单按钮。点击号&#xff0c;创建一个名为debian的配置文件。如果已经有了名为debian的配置文件&#xff0c;选择它即可。返…

cpri带宽不足的解决方法_u盘容量不足怎么办 u盘容量不足解决方法【介绍】

我们在使用u盘的时候总能碰到各种各样的问题&#xff0c;其中u盘容量不足问题也是神烦&#xff0c;很多时候打开并没有发现有文件存在&#xff0c;但是在你存文件的时候又被提示u盘容量不足无法操作&#xff0c;关于这个问题u启动通过整理和大家一起分享下解决办法。1、u盘里的…

(python numpy) np.array.shape 中 (3,)、(3,1)、(1,3)的区别

(python numpy) np.array.shape 中 (3,)、(3,1)、(1,3)的区别 被人问到这个问题&#xff0c;就记录一下吧 1. (3,) (3,)是[x,y,z][x,y,z][x,y,z]的形式&#xff0c;即为一维数组&#xff0c;访问数组元素用一个index for example: >>> array1 np.array([1,2,3]) …

复合的赋值运算符例题_Java学习:运算符的使用与注意事项

运算符的使用与注意事项四则运算当中的加号“”有常见的三种用法&#xff1a;对于数值来&#xff0c;那就是加法。对于字符char类型来说&#xff0c;在计算之前&#xff0c;char会被提升成为int&#xff0c;然后再计算。char类型字符&#xff0c;和int类型数字之间的对照关系比…

腾讯会议如何使用讲演者模式进行汇报(nian gao)

腾讯会议如何使用讲演者模式进行汇报&#xff08;nian gao&#xff09; 首先列出步骤&#xff0c;再一一演示&#xff1a; altf5 开启讲演者模式&#xff0c;调整讲演者模式的窗口为小窗alttab 切换回腾讯会议界面&#xff0c;屏幕共享power point窗口&#xff08;注意不是“…

bulk这个词的用法_15、形容词与副词(二)比较的用法

初中英语语法——形容词与副词(二)比较的用法语法解释1、形容词与副词比较级和最高级的规则变化单音节词与部分双音节词&#xff1a;(1)一般情况加-er&#xff0c;-estlong-longer-longest strong-stronger-strongestclean-cleaner-cleanest(2)以不发音的e结尾的词&#xff0c;…

pytorch 使用DataParallel 单机多卡和单卡保存和加载模型时遇到的问题

首先很多网上的博客&#xff0c;讲的都不对&#xff0c;自己跟着他们踩了很多坑 1.单卡训练&#xff0c;单卡加载 这里我为了把三个模块save到同一个文件里&#xff0c;我选择对所有的模型先封装成一个checkpoint字典&#xff0c;然后保存到同一个文件里&#xff0c;这样就可…

retinex 的水下图像增强算法_图像增强论文:腾讯优图CVPR2019

Underexposed Photo Enhancement using Deep Illumination Estimation基于深度学习优化光照的暗光下的图像增强论文地址&#xff1a;Underexposed Photo Enhancement using Deep Illumination Estimation暗光拍照也清晰&#xff0c;这是手机厂商目前激烈竞争的新拍照目标。提出…