标签: transformer-model

嵌入层输出 nan

我正在尝试学习 seq2seq 模型。嵌入层位于编码器中,有时在一些迭代后输出 nan 值。我无法确定原因。我该如何解决这个问题?问题出在下面代码中的forward函数中的第一个emb_layer。


class TransformerEncoder(nn.Module):
    def __init__(self, vocab_size, hidden_size=1024, num_layers=6, dropout=0.2, input_pad=1, batch_first=False, embedder=None, init_weight=0.1):
        super(TransformerEncoder, self).__init__()
        self.input_pad = input_pad
        self.vocab_size = vocab_size
        self.num_layers = num_layers
        self.embedder = embedder

        if embedder is not None:
            self.emb_layer = embedder
        else:
            self.emb_layer = nn.Embedding(vocab_size, hidden_size, padding_idx=1)

        self.positional_encoder = PositionalEncoder()
        self.transformer_layers = nn.ModuleList()
        for _ in range(num_layers):
            self.transformer_layers.append(
                    TransformerEncoderBlock(num_heads=8, embedding_dim=1024, dropout=dropout))

    def set_mask(self, inputs):
        self.input_mask = (inputs == self.input_pad).unsqueeze(1)

    def forward(self, inputs):
        x = self.emb_layer(inputs)
        x = self.positional_encoder(x)
Run Code Online (Sandbox Code Playgroud)

transformer-model deep-learning pytorch seq2seq

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

无法安装 pip 包(未找到元数据)

我尝试在运行 TensorFlow 2.1.0 的 Anaconda 环境中安装Transformer ,出现以下错误pip install transformers

WARNING: No metadata found in c:\users\gamer\anaconda3\envs\tensorflow\lib\site-packages
ERROR: Could not install packages due to an EnvironmentError: [Errno 2] No such file or directory: 'c:\\users\\gamer\\anaconda3\\envs\\tensorflow\\lib\\site-packages\\chardet-3.0.4.dist-info\\METADATA'
Run Code Online (Sandbox Code Playgroud)

该目录中有一个metadata.json文件。

安装其他软件包(例如pip install tf-nightly.

我已尝试按照 Could not install packages due to an EnvironmentError: [Errno 2] No such file or directory \METADATA 中的建议启用长路径。

我该如何解决这个问题?

transformersPs.:从anaconda 变压器安装对我来说不起作用,因为它使用的是旧版本(我的意思是,安装有效,但该版本没有我需要的东西)。

python pip transformer-model anaconda tensorflow

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

如何用XLNet做句子相似度?

我想执行句子相似度任务并尝试了以下操作:

from transformers import XLNetTokenizer, XLNetModel
import torch
import scipy
import torch.nn as nn
import torch.nn.functional as F

tokenizer = XLNetTokenizer.from_pretrained('xlnet-large-cased')
model = XLNetModel.from_pretrained('xlnet-large-cased')

input_ids = torch.tensor(tokenizer.encode("Hello, my animal is cute", add_special_tokens=False)).unsqueeze(0)
outputs = model(input_ids)
last_hidden_states = outputs[0]

input_ids = torch.tensor(tokenizer.encode("I like your cat", add_special_tokens=False)).unsqueeze(0) 

outputs1 = model(input_ids)
last_hidden_states1 = outputs1[0]

cos = nn.CosineSimilarity(dim=1, eps=1e-6)
output = cos(last_hidden_states, last_hidden_states1)
Run Code Online (Sandbox Code Playgroud)

但是,我收到以下错误:

RuntimeError: The size of tensor a (7) must match the size of tensor b (4) at non-singleton dimension 1
Run Code Online (Sandbox Code Playgroud)

谁能告诉我,我做错了什么?有更好的方法吗?

python nlp embedding transformer-model cosine-similarity

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

使用字符嵌入进行 BERT 训练

将 BERT 模型中的标记化范例更改为其他内容是否有意义?也许只是简单的单词标记化或字符级标记化?

nlp transformer-model tokenize pytorch

5
推荐指数
2
解决办法
2663
查看次数

如何恢复 BERT/XLNet 嵌入?

我最近一直在尝试堆叠语言模型,并注意到一些有趣的事情:BERT 和 XLNet 的输出嵌入与输入嵌入不同。例如,这个代码片段:

bert = transformers.BertForMaskedLM.from_pretrained("bert-base-cased")
tok = transformers.BertTokenizer.from_pretrained("bert-base-cased")

sent = torch.tensor(tok.encode("I went to the store the other day, it was very rewarding."))
enc = bert.get_input_embeddings()(sent)
dec = bert.get_output_embeddings()(enc)

print(tok.decode(dec.softmax(-1).argmax(-1)))
Run Code Online (Sandbox Code Playgroud)

为我输出这个:

,,,,,,,,,,,,,,,,,
Run Code Online (Sandbox Code Playgroud)

我本来期望返回(格式化的)输入序列,因为我的印象是输入和输出令牌嵌入是绑定的。

有趣的是,大多数其他模型没有表现出这种行为。例如,如果您在 GPT2、Albert 或 Roberta 上运行相同的代码片段,它将输出输入序列。

这是一个错误吗?或者是 BERT/XLNet 的预期?

python nlp transformer-model pytorch huggingface-transformers

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

BertForSequenceClassification 如何在 CLS 向量上进行分类?

背景:

遵循这个问题,当使用 bert 对序列进行分类时,模型使用表示分类任务的“[CLS]”标记。据该论文称:

每个序列的第一个标记始终是一个特殊的分类标记([CLS])。与该标记对应的最终隐藏状态用作分类任务的聚合序列表示。

查看 Huggingfaces 存储库,他们的 BertForSequenceClassification 使用 bert pooler 方法:

class BertPooler(nn.Module):
    def __init__(self, config):
        super().__init__()
        self.dense = nn.Linear(config.hidden_size, config.hidden_size)
        self.activation = nn.Tanh()

    def forward(self, hidden_states):
        # We "pool" the model by simply taking the hidden state corresponding
        # to the first token.
        first_token_tensor = hidden_states[:, 0]
        pooled_output = self.dense(first_token_tensor)
        pooled_output = self.activation(pooled_output)
        return pooled_output
Run Code Online (Sandbox Code Playgroud)

我们可以看到他们采用第一个标记(CLS)并将其用作整个句子的表示。具体来说,他们执行的操作hidden_states[:, 0]看起来很像从每个状态中获取第一个元素,而不是获取第一个标记隐藏状态?

我的问题:

我不明白的是他们如何将整个句子的信息编码到这个标记中?CLS 标记是一个常规标记,它有自己的嵌入向量来“学习”句子级别表示吗?为什么我们不能只使用隐藏状态的平均值(编码器的输出)并用它来分类?

编辑:经过一番思考:因为我们使用 CLS 令牌隐藏状态来预测,所以 CLS 令牌嵌入是否正在接受分类任务的训练,因为这是用于分类的令牌(因此是导致错误的主要因素)哪个会传播到它的权重?)

python transformer-model bert-language-model huggingface-transformers

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

在 Huggingface Trainer 类中恢复训练时如何避免迭代 Dataloader?

我目前正在使用 Huggingface 的 Trainer 类来训练 Distillbert,以解决使用自定义损失函数的回归问题。由于计算/意外错误的短暂性,我正在使用他们的检查点来恢复训练。

我面临的问题是,每次我通过方法model_path中的 Trainer 类从检查点恢复训练Trainer.train()时,我注意到该类会迭代数据加载器,直到达到检查点中保存的迭代计数(请参阅Trainer 类中与问题匹配的行)。

这通常可能不是问题,但由于我的数据加载器的整理功能的性质和数据集的大小,在没有任何训练的情况下迭代这样的持续时间是相当昂贵的,并且会减慢整体训练的速度。

我计划利用一个自定义采样器类,带有一个参数,以从给定位置恢复索引,但这对于给定问题来说似乎也很有效。

我可以尝试节省这些浪费的计算周期的替代方案是什么?

transformer-model pytorch huggingface-transformers

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

为什么培训师在教程中培训时不报告评估指标?

我正在按照本教程来了解训练器 API。\n https://huggingface.co/transformers/training.html

\n

我复制了如下代码:

\n
from datasets import load_dataset\n\nimport numpy as np\nfrom datasets import load_metric\n\nmetric = load_metric("accuracy")\n\ndef compute_metrics(eval_pred):\n    logits, labels = eval_pred\n    predictions = np.argmax(logits, axis=-1)\n    return metric.compute(predictions=predictions, references=labels)\n\nprint(\'Download dataset ...\')\nraw_datasets = load_dataset("imdb")\nfrom transformers import AutoTokenizer\n\nprint(\'Tokenize text ...\')\ntokenizer = AutoTokenizer.from_pretrained("bert-base-cased")\ndef tokenize_function(examples):\n    return tokenizer(examples["text"], padding="max_length", truncation=True)\ntokenized_datasets = raw_datasets.map(tokenize_function, batched=True)\n\nprint(\'Prepare data ...\')\nsmall_train_dataset = tokenized_datasets["train"].shuffle(seed=42).select(range(500))\nsmall_eval_dataset = tokenized_datasets["test"].shuffle(seed=42).select(range(500))\nfull_train_dataset = tokenized_datasets["train"]\nfull_eval_dataset = tokenized_datasets["test"]\n\nprint(\'Define model ...\')\nfrom transformers import AutoModelForSequenceClassification\nmodel = AutoModelForSequenceClassification.from_pretrained("bert-base-cased", num_labels=2)\n\nprint(\'Define trainer ...\')\nfrom transformers import TrainingArguments, Trainer\ntraining_args = TrainingArguments("test_trainer", evaluation_strategy="epoch")\ntrainer = Trainer(\n    model=model,\n    args=training_args,\n …
Run Code Online (Sandbox Code Playgroud)

python transformer-model huggingface-transformers

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

如何从 BERT 模型中获取词嵌入的余弦相似度

我感兴趣的是如何从 BERT 模型中获取不同句子中词嵌入的相似度(实际上,这意味着词在不同场景下具有不同的含义)。

例如:

sent1 = 'I like living in New York.'
sent2 = 'New York is a prosperous city.'
Run Code Online (Sandbox Code Playgroud)

我想从sent1和sent2中获取cos(纽约,纽约)的值,即使短语“纽约”相同,但它出现在不同的句子中。我从https://discuss.huggingface.co/t/generate-raw-word-embeddings-using-transformer-models-like-bert-for-downstream-process/2958/2得到了一些直觉

但我仍然不知道我需要提取哪一层的嵌入以及如何计算上面示例的 cos 相似度。

在此先感谢您的任何建议!

python transformer-model word-embedding bert-language-model

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

ValueError:调用层“transformer”时遇到异常(类型 Transformer)

所以我编写了一个 Transformers 神经网络,它可以用作 ASR,它可以工作,它训练得很好,并将模型保存为......

\n
model.save("savedmodel.model")\n
Run Code Online (Sandbox Code Playgroud)\n

问题是当我想预测时,我会这样做..

\n
speech_model = load_model('D:\\DOT\\Speechrecognition\\speechrecognitionE.model')\n\npath = "D:\\DOT\\Speechrecognition\\Data\\LJSpeech-1.1\\wavs\\LJ001-0001.wav"\n\ndef path_to_audio(path):\n    # spectrogram using stft\n    audio = tf.io.read_file(path)\n    audio, _ = tf.audio.decode_wav(audio, 1)\n    audio = tf.squeeze(audio, axis=-1)\n    stfts = tf.signal.stft(audio, frame_length=200, frame_step=80, fft_length=256)\n    x = tf.math.pow(tf.abs(stfts), 0.5)\n    # normalisation\n    means = tf.math.reduce_mean(x, 1, keepdims=True)\n    stddevs = tf.math.reduce_std(x, 1, keepdims=True)\n    x = (x - means) / stddevs\n    audio_len = tf.shape(x)[0]\n    # padding to 10 seconds\n    pad_len = 2754\n    paddings = tf.constant([[0, pad_len], [0, 0]])\n    x = tf.pad(x, …
Run Code Online (Sandbox Code Playgroud)

python transformer-model tensorflow

5
推荐指数
0
解决办法
1086
查看次数