我有从未编译的keras代码构建的模型,并且正在尝试通过自定义训练循环运行它们。
TF 2.0急切(默认)代码在CPU(笔记本电脑)上运行约30秒钟。当我用包装的tf.function调用方法创建一个keras模型时,它运行的速度非常慢,而且启动时间似乎很长,尤其是“第一次”。
例如,在tf.function代码中,对10个样本的初始训练花费40s,而对10个样本的后续训练花费2s。
在20个样本上,初始花费50s,后续花费4s。
第一次采样1个样本需要2秒钟,后续过程需要200毫秒。
如此看来,每次火车呼叫都在创建一个新图,其中复杂度随火车数量而增加!
我只是在做这样的事情:
@tf.function
def train(n=10):
step = 0
loss = 0.0
accuracy = 0.0
for i in range(n):
step += 1
d, dd, l = train_one_step(model, opt, data)
tf.print(dd)
with tf.name_scope('train'):
for k in dd:
tf.summary.scalar(k, dd[k], step=step)
if tf.equal(step % 10, 0):
tf.print(dd)
d.update(dd)
return d
Run Code Online (Sandbox Code Playgroud)
根据示例,模型keras.model.Model
使用@tf.function
装饰call
方法。
我想用新实体更新模型。我正在加载“pt”NER 模型,并尝试更新它。在做任何事情之前,我尝试了这句话:“meu nome é Mário e hoje eu vou para academia”。(英文中这句话是“我的名字是马里奥,今天我要去健身房。在整个过程之前我得到了这个:
Entities [('Mário', 'PER')]
Tokens [('meu', '', 2), ('nome', '', 2), ('é', '', 2), ('Mário', 'PER', 3), ('e', '', 2), ('hoje', '', 2), ('eu', '', 2), ('vou', '', 2), ('pra', '', 2), ('academia', '', 2)]
Run Code Online (Sandbox Code Playgroud)
好的,马里奥是一个名字,它是正确的。但我希望模型将“hoje(今天)”识别为 DATE,然后我运行了下面的脚本。
运行脚本后,我尝试了相同的设置并得到了这个:
Entities [('hoje', 'DATE')]
Tokens [('meu', '', 2), ('nome', '', 2), ('é', '', 2), ('Mário', '', 2), ('e', '', 2), ('hoje', 'DATE', 3), ('eu', '', 2), ('vou', '', 2), ('pra', '', 2), ('academia', …
Run Code Online (Sandbox Code Playgroud) python nlp machine-learning spacy natural-language-processing
我已经完成了pytorch交叉熵损失函数的自定义实现(因为我需要更多的灵活性稍后介绍)。我打算用这个训练的模型需要相当长的时间来训练,而且可用的资源不能仅仅用来测试函数是否正确实现。我已经实现了矢量化实现,因为它运行起来会更快。
以下是我的代码:
def custom_cross(my_pred,true,batch_size=BATCH_SIZE):
loss= -torch.mean(torch.sum(true.view(batch_size, -1) * torch.log(my_pred.view(batch_size, -1)), dim=1))
return loss
Run Code Online (Sandbox Code Playgroud)
如果您能建议更优化的实现,或者我在当前的实现中犯了错误,我将非常感激。该模型将使用 Nvidia Tesla K-80 进行训练。
artificial-intelligence machine-learning cross-entropy pytorch
我想在与特定领域(在我的情况下与工程相关)相关的文本上微调 BERT。培训应该是无人监督的,因为我没有任何标签或任何东西。这可能吗?
我想在填充序列上进行反向 LSTM,这需要在没有填充的情况下反转输入序列。
对于这样的批次(其中_
代表填充):
a b c _ _ _
d e f g _ _
h i j k l m
Run Code Online (Sandbox Code Playgroud)
如果想得到:
c b a _ _ _
g f e d _ _
m l k j i h
Run Code Online (Sandbox Code Playgroud)
TensorFlow 有一个函数tf.reverse_sequence
,它获取输入张量和批次中序列的长度并返回反向批次。在 Pytorch 中是否有一种简单的方法可以做到这一点?
我使用 Chris McCormick 关于 BERT 的教程来pytorch-pretained-bert
获得句子嵌入,如下所示:
tokenized_text = tokenizer.tokenize(marked_text)
indexed_tokens = tokenizer.convert_tokens_to_ids(tokenized_text)
segments_ids = [1] * len(tokenized_text)
tokens_tensor = torch.tensor([indexed_tokens])
segments_tensors = torch.tensor([segments_ids])
model = BertModel.from_pretrained('bert-base-uncased')
model.eval()
with torch.no_grad():
encoded_layers, _ = model(tokens_tensor, segments_tensors)
# Holds the list of 12 layer embeddings for each token
# Will have the shape: [# tokens, # layers, # features]
token_embeddings = []
# For each token in the sentence...
for token_i in range(len(tokenized_text)):
# Holds 12 layers of hidden states for …
Run Code Online (Sandbox Code Playgroud) 我正在 PyTorch 中使用线性回归示例。我知道我在 'with torch.no_grad():' 中包含 'loss.backward()' 是错误的,但是为什么它与我的代码运行良好?
根据pytorch docs,torch.autograd.no_grad
是一个禁用梯度计算的上下文管理器。所以我真的很困惑。
代码在这里:
import torch
import torch.nn as nn
import numpy as np
import matplotlib.pyplot as plt
# Toy dataset
x_train = np.array([[3.3], [4.4], [5.5], [6.71], [6.93], [4.168],
[9.779], [6.182], [7.59], [2.167], [7.042],
[10.791], [5.313], [7.997], [3.1]], dtype=np.float32)
y_train = np.array([[1.7], [2.76], [2.09], [3.19], [1.694], [1.573],
[3.366], [2.596], [2.53], [1.221], [2.827],
[3.465], [1.65], [2.904], [1.3]], dtype=np.float32)
input_size = 1
output_size = 1
epochs = 100
learning_rate = 0.05 …
Run Code Online (Sandbox Code Playgroud)