小编Jin*_*ich的帖子

使用tf.function的Tensorflow 2.0模型非常慢,并且每次火车数量变化时都会重新编译。渴望的速度快大约4倍

我有从未编译的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方法。

keras tensorflow2.0

9
推荐指数
1
解决办法
1010
查看次数

如何在 spaCy 中正确更新模型?

我想用新实体更新模型。我正在加载“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

5
推荐指数
1
解决办法
1700
查看次数

pytorch 中的自定义交叉熵损失

我已经完成了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

5
推荐指数
1
解决办法
2894
查看次数

为特定领域微调 Bert(无监督)

我想在与特定领域(在我的情况下与工程相关)相关的文本上微调 BERT。培训应该是无人监督的,因为我没有任何标签或任何东西。这可能吗?

python nlp neural-network deep-learning bert-language-model

4
推荐指数
1
解决办法
583
查看次数

Pytorch 相当于“tf.reverse_sequence”?

我想在填充序列上进行反向 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 中是否有一种简单的方法可以做到这一点?

python tensorflow pytorch

3
推荐指数
1
解决办法
2261
查看次数

通过对最后 4 层求和来嵌入 BERT 句子

我使用 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)

python nlp neural-network pytorch

3
推荐指数
1
解决办法
4559
查看次数

为什么当我在 'with torch.no_grad():' 中包含 'loss.backward()' 时,反向传播过程仍然可以工作?

我正在 PyTorch 中使用线性回归示例。我知道我在 'with torch.no_grad():' 中包含 'loss.backward()' 是错误的,但是为什么它与我的代码运行良好?

根据pytorch docstorch.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)

backpropagation pytorch

0
推荐指数
1
解决办法
705
查看次数