from datasets import load_dataset, Audio from transformers import WhisperProcessor,WhisperForConditionalGeneration from transformers.models.whisper.tokenization_whisper import TO_LANGUAGE_CODE #可查看whisper支持语言 import soundfile as sf import io from typing importAny, Dict, List, Union from dataclasses import dataclass import torch from torch.utils.data import DataLoader from torch.optim import AdamW from transformers import get_scheduler from tqdm import tqdm
for epoch inrange(num_epochs): model.train() train_loop = tqdm(enumerate(train_dataloader), total=len(train_dataloader), desc=f'Train_Epoch {epoch + 1}/{num_epochs}', unit='batch') for idx, batch in train_loop: batch = {k: v.to(device) for k, v in batch.items()}
# 计算普通的 WER wer_ortho = 100 * metric.compute(predictions=pred_str, references=label_str)
# 计算标准化的 WER pred_str_norm = [normalizer(pred) for pred in pred_str] label_str_norm = [normalizer(label) for label in label_str] # 过滤,从而在评估时只计算 reference 非空的样本 pred_str_norm = [ pred_str_norm[i] for i inrange(len(pred_str_norm)) iflen(label_str_norm[i]) > 0 ] label_str_norm = [ label_str_norm[i] for i inrange(len(label_str_norm)) iflen(label_str_norm[i]) > 0 ]
wer = 100 * metric.compute(predictions=pred_str_norm, references=label_str_norm)
model = WhisperForConditionalGeneration.from_pretrained("openai/whisper-small").to("cuda") optimizer = torch.optim.AdamW(model.parameters(), lr=1e-5)
# 初始化梯度缩放器,防止 FP16 梯度下溢 scaler = GradScaler()
for batch in dataloader: optimizer.zero_grad() # 1. 在 autocast 上下文中运行前向传播 with autocast(dtype=torch.float16): outputs = model(input_features=batch["input_features"], labels=batch["labels"]) loss = outputs.loss
decoder的交叉注意力:由于”我“这个中文语义中缺失谓语,因此在Q与K的计算中,”love“这个表示谓语的词语会得到更高的关注度(只是举例,实际上不只有这一个原因,但具体训练过程其实我们人类是难以理解的);将关注度进行softmax后与V相乘,最终会输出一个与”love”强相关的”I love you”的深层语义表达(可以理解为:decoder当前需要翻译“love”,并且考虑了“I”和“you”在全文中的含义)。
例如,当要将”I love you”翻译为中文时,encoder接收的便是”I love you”全文,decoder则是按顺序依次生成“我”,“爱”,“你”,而当生成“爱”时,decoder会将”我”与对”I love you“的特征进行attention计算,在训练优异的情况下,”love“这个谓语会被重点关注(被认为是下一个被翻译的对象),decoder会生成一个基于”I“和”you“的”love“深层语义表达,在decoder的最后,该语义表达会与中文”爱“的匹配度最高
from transformers import AutoTokenizer, AutoModelForSequenceClassification
checkpoint = "distilbert-base-uncased-finetuned-sst-2-english" tokenizer = AutoTokenizer.from_pretrained(checkpoint) model = AutoModelForSequenceClassification.from_pretrained(checkpoint) sequences = ["I've been waiting for a HuggingFace course my whole life.", "So have I!"]
data_collator = DataCollatorWithPadding(tokenizer=tokenizer) samples = tokenized_datasets["train"][:8] samples = {k: v for k, v in samples.items() if k notin ["idx", "sentence1", "sentence2"]} batch = data_collator(samples)
from datasets import load_dataset from transformers import AutoTokenizer, DataCollatorWithPadding, AutoModelForSequenceClassification from transformers import TrainingArguments, Trainer
在使用AutoModelForSequenceClassification实例化模型时,会收到一个警告,这是因为 BERT 没有在句子对分类方面进行过预训练,所以预训练模型的 head 已经被丢弃,而是添加了一个适合句子序列分类的新头部。这些警告表明一些权重没有使用(对应于被放弃的预训练头的权重),而有些权重被随机初始化(对应于新 head 的权重)。
for epoch inrange(num_epoch): model.train() for batch in train_dataloader: batch = {k: v.to(device) for k, v in batch.items()} outputs = model(**batch) loss = outputs.loss loss.backward()
optimizer.step() lr_scheduler.step() optimizer.zero_grad() model.eval() for batch in eval_loader: batch = {k: v.to(device) for k, v in batch.items()} with torch.no_grad(): outputs = model(**batch) logits = outputs.logits ...
joint_states = p.getJointStates(robotId,controllable_joints) q_actual = np.array([state[0] for state in joint_states]) qd_actual = np.array([state[1] for state in joint_states])
q_e = q[n] - q_actual qd_e = qd[n] - qd_actual
aq = qdd[n] + 400 * q_e + 40 * qd_e
tau = p.calculateInverseDynamics(robotId,list(q_actual),list(qd_actual),list(aq)) p.setJointMotorControlArray(robotId,controllable_joints,p.TORQUE_CONTROL, forces = tau, )