我正在尝试学习 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) 我尝试在运行 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
.
我该如何解决这个问题?
transformers
Ps.:从anaconda 变压器安装对我来说不起作用,因为它使用的是旧版本(我的意思是,安装有效,但该版本没有我需要的东西)。
我想执行句子相似度任务并尝试了以下操作:
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)
谁能告诉我,我做错了什么?有更好的方法吗?
将 BERT 模型中的标记化范例更改为其他内容是否有意义?也许只是简单的单词标记化或字符级标记化?
我最近一直在尝试堆叠语言模型,并注意到一些有趣的事情: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
背景:
遵循这个问题,当使用 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
我目前正在使用 Huggingface 的 Trainer 类来训练 Distillbert,以解决使用自定义损失函数的回归问题。由于计算/意外错误的短暂性,我正在使用他们的检查点来恢复训练。
我面临的问题是,每次我通过方法model_path
中的 Trainer 类从检查点恢复训练Trainer.train()
时,我注意到该类会迭代数据加载器,直到达到检查点中保存的迭代计数(请参阅Trainer 类中与问题匹配的行)。
这通常可能不是问题,但由于我的数据加载器的整理功能的性质和数据集的大小,在没有任何训练的情况下迭代这样的持续时间是相当昂贵的,并且会减慢整体训练的速度。
我计划利用一个自定义采样器类,带有一个参数,以从给定位置恢复索引,但这对于给定问题来说似乎也很有效。
我可以尝试节省这些浪费的计算周期的替代方案是什么?
我正在按照本教程来了解训练器 API。\n https://huggingface.co/transformers/training.html
\n我复制了如下代码:
\nfrom 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) 我感兴趣的是如何从 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 相似度。
在此先感谢您的任何建议!
所以我编写了一个 Transformers 神经网络,它可以用作 ASR,它可以工作,它训练得很好,并将模型保存为......
\nmodel.save("savedmodel.model")\n
Run Code Online (Sandbox Code Playgroud)\n问题是当我想预测时,我会这样做..
\nspeech_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)