当前位置: 首页 > news >正文

nlp任务之预测中间词-huggingface

目录

1.加载编码器

1.1编码试算 

2.加载数据集 

3.数据集处理 

3.1 map映射:只对数据集中的'sentence'数据进行编码

3.2用filter()过滤 单词太少的句子过滤掉

3.3截断句子 

4.创建数据加载器Dataloader 

5. 下游任务模型 

6.测试预测代码 

7.训练代码

 8.保存与加载模型


 

1.加载编码器

from transformers import AutoTokenizertokenizer = AutoTokenizer.from_pretrained(r'../data/model/distilroberta-base/')
print(tokenizer)

 

RobertaTokenizerFast(name_or_path='../data/model/distilroberta-base/', vocab_size=50265, model_max_length=512, is_fast=True, padding_side='right', truncation_side='right', special_tokens={'bos_token': '<s>', 'eos_token': '</s>', 'unk_token': '<unk>', 'sep_token': '</s>', 'pad_token': '<pad>', 'cls_token': '<s>', 'mask_token': '<mask>'}, clean_up_tokenization_spaces=False),  added_tokens_decoder={0: AddedToken("<s>", rstrip=False, lstrip=False, single_word=False, normalized=True, special=True),1: AddedToken("<pad>", rstrip=False, lstrip=False, single_word=False, normalized=True, special=True),2: AddedToken("</s>", rstrip=False, lstrip=False, single_word=False, normalized=True, special=True),3: AddedToken("<unk>", rstrip=False, lstrip=False, single_word=False, normalized=True, special=True),50264: AddedToken("<mask>", rstrip=False, lstrip=True, single_word=False, normalized=False, special=True),
}

1.1编码试算 

tokenizer.batch_encode_plus(['hide new secretions from the parental units','this moive is great'  
])

 

{'input_ids': [[0, 37265, 92, 3556, 2485, 31, 5, 20536, 2833, 2], [0, 9226, 7458, 2088, 16, 372, 2]], 'attention_mask': [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1]]}

# 'input_ids'中的0:表示 'bos_token': '<s>'
#'input_ids'中的2:表示 'eos_token': '</s>'
#Bert模型有特殊字符!!!!!!! 

2.加载数据集 

from datasets import load_from_disk  #从本地加载已经下载好的数据集dataset_dict = load_from_disk('../data/datasets/glue_sst2/')
dataset_dict

 

DatasetDict({train: Dataset({features: ['sentence', 'label', 'idx'],num_rows: 67349})validation: Dataset({features: ['sentence', 'label', 'idx'],num_rows: 872})test: Dataset({features: ['sentence', 'label', 'idx'],num_rows: 1821})
})

#若是从网络下载(国内容易网络错误,下载不了,最好还是先去镜像网站下载,本地加载)
# from datasets import load_dataset


# dataset_dict2 = load_dataset(path='glue', name='sst2')
# dataset_dict2

 

3.数据集处理 

3.1 map映射:只对数据集中的'sentence'数据进行编码

#预测中间词任务:只需要'sentence' ,不需要'label'和'idx'
#用map()函数,映射:只对数据集中的'sentence'数据进行编码
def f_1(data, tokenizer):return tokenizer.batch_encode_plus(data['sentence'])dataset_dict = dataset_dict.map(f_1, batched=True,batch_size=16,drop_last_batch=True,remove_columns=['sentence', 'label', 'idx'],fn_kwargs={'tokenizer': tokenizer},num_proc=8)  #8个进程, 查看任务管理器>性能>逻辑处理器dataset_dict

 

DatasetDict({train: Dataset({features: ['input_ids', 'attention_mask'],num_rows: 67328})validation: Dataset({features: ['input_ids', 'attention_mask'],num_rows: 768})test: Dataset({features: ['input_ids', 'attention_mask'],num_rows: 1792})
})

3.2用filter()过滤 单词太少的句子过滤掉

#处理句子,让每一个句子的都至少有9个单词,单词太少的句子过滤掉
#用filter()过滤
def f_2(data):return [len(i) >= 9 for i in data['input_ids']]dataset_dict = dataset_dict.filter(f_2, batched=True, batch_size=1000, num_proc=8)
dataset_dict
DatasetDict({train: Dataset({features: ['input_ids', 'attention_mask'],num_rows: 44264})validation: Dataset({features: ['input_ids', 'attention_mask'],num_rows: 758})test: Dataset({features: ['input_ids', 'attention_mask'],num_rows: 1747})
})
tokenizer.vocab['<mask>']tokenizer.get_vocab()['<mask>']#两句输出都是:
#50264

3.3截断句子 

#截断句子, 同时将数据集的句子整理成预训练模型需要的格式
def f_3(data):b = len(data['input_ids'])data['labels'] = data['attention_mask'].copy()  #复制,不影响原数据for i in range(b):#将句子长度就裁剪到9data['input_ids'][i] = data['input_ids'][i][:9]data['attention_mask'][i] = [1] * 9data['labels'][i] = [-100] * 9#使用的distilroberta-base是基于Bert模型的,每个句子de 'input_ids'最后一个单词需要设置成2data['input_ids'][i][-1] = 2#每一个句子的第四个词需要被预测,赋值给‘labels’,成为标签真实值data['labels'][i][4] = data['input_ids'][i][4]#每一个句子的第四个词为mask
#         data['input_ids'][i][4] = tokenizer.vocab['<mask>']data['input_ids'][i][4] = 50264return data#map()函数是对传入数据的下一层级的数据进行操作
#dataset_dict是一个字典, map函数会直接对dataset_dict['train']下的数据操作
dataset_dict = dataset_dict.map(f_3, batched=True, batch_size=1000, num_proc=12)
dataset_dict

 

DatasetDict({train: Dataset({features: ['input_ids', 'attention_mask', 'labels'],num_rows: 44264})validation: Dataset({features: ['input_ids', 'attention_mask', 'labels'],num_rows: 758})test: Dataset({features: ['input_ids', 'attention_mask', 'labels'],num_rows: 1747})
})
dataset_dict['train'][0]

 

{'input_ids': [0, 37265, 92, 3556, 50264, 31, 5, 20536, 2],'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1],'labels': [-100, -100, -100, -100, 2485, -100, -100, -100, -100]}
dataset_dict['train']['input_ids']

 

输出太多,部分展示
[[0, 37265, 92, 3556, 50264, 31, 5, 20536, 2],[0, 10800, 5069, 117, 50264, 2156, 129, 6348, 2],[0, 6025, 6138, 63, 50264, 8, 39906, 402, 2],[0, 5593, 5069, 19223, 50264, 7, 1091, 5, 2],[0, 261, 5, 2373, 50264, 12, 1116, 12, 2],[0, 6025, 128, 29, 50264, 350, 8805, 7, 2],[0, 34084, 6031, 1626, 50264, 5, 736, 9, 2],

。。。。。]]

4.创建数据加载器Dataloader 

import torch
from transformers.data.data_collator import default_data_collator  #将从一条一条数据传输变成一批批数据传输loader = torch.utils.data.DataLoader(dataset=dataset_dict['train'],batch_size=8, shuffle=True,collate_fn=default_data_collator,drop_last=True  #最后一批数据不满足一批的数据量batch_size,就删掉
)for data in loader:break   #遍历赋值,不输出
len(loader), data#'labels'中的-100就是占个位置,没有其他含义, 后面用交叉熵计算损失时, -100的计算结果接近0,损失没有用

 

(5533,{'input_ids': tensor([[    0,  2962,     5, 20577, 50264,    31, 36331,     7,     2],[    0,   627,  2471,    16, 50264,    15,     8,  1437,     2],[    0,  6968,   192,    24, 50264,   209, 26757, 11641,     2],[    0,   405,   128,    29, 50264, 25306,  9438, 15796,     2],[    0,  8344,  6343,     8, 50264,  1342,  7790, 38984,     2],[    0, 10800,  5069,     5, 50264,  2156, 34934,  2156,     2],[    0,   102,  1531,   284, 50264,    14,   128,    29,     2],[    0,     6,  3007,   648, 50264, 38854,   480,  1437,     2]]),'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1, 1],[1, 1, 1, 1, 1, 1, 1, 1, 1],[1, 1, 1, 1, 1, 1, 1, 1, 1],[1, 1, 1, 1, 1, 1, 1, 1, 1],[1, 1, 1, 1, 1, 1, 1, 1, 1],[1, 1, 1, 1, 1, 1, 1, 1, 1],[1, 1, 1, 1, 1, 1, 1, 1, 1],[1, 1, 1, 1, 1, 1, 1, 1, 1]]),'labels': tensor([[ -100,  -100,  -100,  -100,  1182,  -100,  -100,  -100,  -100],[ -100,  -100,  -100,  -100,  1514,  -100,  -100,  -100,  -100],[ -100,  -100,  -100,  -100,    11,  -100,  -100,  -100,  -100],[ -100,  -100,  -100,  -100,   372,  -100,  -100,  -100,  -100],[ -100,  -100,  -100,  -100, 33572,  -100,  -100,  -100,  -100],[ -100,  -100,  -100,  -100, 12073,  -100,  -100,  -100,  -100],[ -100,  -100,  -100,  -100,  1569,  -100,  -100,  -100,  -100],[ -100,  -100,  -100,  -100,  2156,  -100,  -100,  -100,  -100]])})

5. 下游任务模型 

 

from transformers import AutoModelForCausalLM, RobertaModelclass Model(torch.nn.Module):def __init__(self):super().__init__()#相当于encoderself.pretrained_model = RobertaModel.from_pretrained(r'../data/model/distilroberta-base/')#decoder:就是一层全连接层(线性层)#bert-base模型输出是768decoder = torch.nn.Linear(768, tokenizer.vocab_size)#全连接线性层有bias, 初始化为0 , size=tokenizer.vocab_sizedecoder.bias = torch.nn.Parameter(torch.zeros(tokenizer.vocab_size))#全连接self.fc = torch.nn.Sequential(#全连接索引0层torch.nn.Linear(768, 768),#全连接索引1层torch.nn.GELU(),  #激活函数,把线性的变成非线性的#一般 线性层+激活函数+BN层标准化#在NLP中,一般为: 线性层+激活函数+LN层标准化#全连接索引2层torch.nn.LayerNorm(768, eps=1e-5),#全连接索引3层decoder)   #输出层:一层全连接,不用加激活函数 #加载预训练模型的参数pretrained_parameters_model = AutoModelForCausalLM.from_pretrained(r'../data/model/distilroberta-base/')self.fc[0].load_state_dict(pretrained_parameters_model.lm_head.dense.state_dict())self.fc[2].load_state_dict(pretrained_parameters_model.lm_head.layer_norm.state_dict())self.fc[3].load_state_dict(pretrained_parameters_model.lm_head.decoder.state_dict())self.criterion = torch.nn.CrossEntropyLoss()#forward拼写错误将无法接收传入的参数!!!def forward(self, input_ids, attention_mask, labels=None):#labels算损失时再传入logits = self.pretrained_model(input_ids, attention_mask)logits = logits.last_hidden_state   #最后一层的hidden_statelogits = self.fc(logits)#计算损失loss = Noneif labels is not None: #若传入了labels#distilroberta-base这个模型本身做的任务是:根据上一个词预测下一个词#在这个模型里会有一个偏移量,#我么需要对labels和logits都做一个shift偏移#logits的shape是(batch_Size, 一句话的长度, vocab_size) shifted_logits = logits[:, :-1].reshape(-1, tokenizer.vocab_size)   #三维tensor数组变成二维#labels是二维tensor数组, shape(batch_size, 一句话的长度)shifted_labels = labels[:,1:].reshape(-1)   #二维变成一维  #计算损失loss = self.criterion(shifted_logits, shifted_labels)return {'loss': loss, 'logits': logits}   #logits是预测值
model = Model()#参数量
#for i in model.parameters()  获取一层的参数 i, 是一个tensor()
# i.numel()是用于返回一个数组或矩阵中元素的数量。函数名称“numel”是“number of elements”的缩写
print(sum(i.numel() for i in model.parameters()))
121364313   #1.2多亿的参数量,6G显存还可以跑
#未训练之前,先看一下加载的预训练模型的效果
out = model(**data)
out['loss'], out['logits'].shape
#out['logits']的shape(batch_size, 每个句子的长度, vocab_size)
#8:就是一批中8个句子,每个句子有9个单词, 每个单词有50265个类别
(tensor(19.4897, grad_fn=<NllLossBackward0>), torch.Size([8, 9, 50265]))

6.测试预测代码 

def test(model):model.eval()  #调回评估模式,适用于预测#创建测试数据的加载器loader_test = torch.utils.data.DataLoader(dataset=dataset_dict['test'],batch_size=8,collate_fn = default_data_collator,  #默认的批量取数据shuffle=True,drop_last=True)correct = 0total = 0for i, data in enumerate(loader_test):#克隆data['labels']中索引为4的元素,取出来label = data['labels'][:, 4].clone()#从数据中抹掉label, 防止模型作弊data['labels'] = None#计算with torch.no_grad():  #不求导,不进行梯度下降#out:下游任务模型的输出结果,是一个字典,包含loss和logitsout = model(**data)  #**data直接把data这个字典解包成关键字参数#计算出logits最大概率##out['logits']的shape(batch_size, 每个句子的长度, vocab_size)#argmax()之后,shape变成(8, 9)out = out['logits'].argmax(dim=2)[:, 4]  #取出第四个才是我们的预测结果correct += (label == out).sum().item()total += 8  #batch_size=8, 每一批数据处理完,处理的数据总量+8#每隔10次输出信息if i % 10 == 0:print(i)print(label)print(out)if i == 50:breakprint('accuracy:', correct / total)for i in range(8):  #输出8句话的预测与真实值的对比print(tokenizer.decode(data['input_ids'][i]))print(tokenizer.decode(label[i]), tokenizer.decode(out[i]))print()
test(model)
0
tensor([ 5466,  3136,    10,  1397,    19, 16362,   281, 11398])
tensor([ 1617, 26658,    10,  1545,    30,  5167,   281, 11398])
10
tensor([   10,  4891,  3156, 14598, 21051,  2156,  6707,    25])
tensor([   10,  1910, 12774,  2156, 16801,    77, 31803,    25])
20
tensor([ 9635, 15305,  2441,   197, 22364,  2156,     9,   203])
tensor([ 9635, 43143,  3021,   939,  1363,    14,     9,  9712])
30
tensor([6717,   19, 1073,  364,   67,  710,   14, 3739])
tensor([ 6717, 17428, 23250, 30842,   350,  4712,    14,  3739])
40
tensor([ 998, 3117, 4132, 1318,    9,   99,    5, 3834])
tensor([ 6545,  1049, 41407, 27931,   263,  5016,     5, 13295])
50
tensor([   10,    53,    98,  5393,  6373, 19255,   236, 35499])
tensor([   10,     8,    98,  4521, 17626, 14598,   236,  3374])
accuracy: 0.3088235294117647
<s>the picture is<mask> primer on what</s>a  a<s>well-shot<mask> badly written tale</s>but  and<s>some actors have<mask> much charisma that</s>so  so<s>so few movies<mask> religion that it</s>explore  mention<s>this delicately<mask> story , deeply</s>observed  crafted<s>awkward but<mask> and , ultimately</s>sincere  hilarious<s>you might not<mask> to hang out</s>want  want<s>the film often<mask> a mesmerizing</s>achieves  becomes

7.训练代码

device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')device

 device(type='cuda', index=0)

from transformers import AdamW
from transformers.optimization import get_scheduler#训练代码
def train():optimizer = AdamW(model.parameters(), lr=2e-5)#学习率下降计划scheduler = get_scheduler(name='linear',  num_warmup_steps=0,  #从一开始就预热,没有缓冲区num_training_steps=len(loader),optimizer=optimizer)model.to(device)  #将模型设置到设备上model.train()  #调到训练模式for i,data in enumerate(loader):   #一个loader的数据传完算一个epoch,NLP中很少写epoch,因为文本样本数太大#接收数据input_ids, attention_mask, labels = data['input_ids'], data['attention_mask'], data['labels']#将数据都传送到设备上input_ids, attention_mask, labels  = input_ids.to(device), attention_mask.to(device), labels.to(device)#将出入设备的数据再次传入到设备上的模型中#out是一个字典,包括‘loss’和‘logits’预测的每个类别的概率out = model(input_ids=input_ids, attention_mask=attention_mask, labels=labels)#从返回结果中获取损失loss = out['loss']#反向传播loss.backward()#为了稳定训练, 进行梯度裁剪torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0)  #让公式中的c=1.0#梯度更新optimizer.step()scheduler.step()#梯度清零optimizer.zero_grad()model.zero_grad()if i % 50 == 0 :#训练时,data['labels']不需要抹除掉设置成空#只需要把每句话第四个单词取出来,赋值给label做为真实值即可label = data['labels'][:, 4].to(device)#获取预测的第4个单词字符out = out['logits'].argmax(dim=2)[:, 4]#计算预测准确的数量correct = (label == out).sum().item()#一批次计算处理的句子总量total = 8#计算准确率accuracy = correct / totallr = optimizer.state_dict()['param_groups'][0]['lr']print(i, loss.item(), accuracy, lr)        
train()  #相当于训练了一个epoch
#8G显存一次跑两亿参数就差不多,再多放不下跑不了
#我的是6G,一次跑1.3亿左右就行 

 输出太多,显示部分:

0 19.273836135864258 0.125 1.9996385324417135e-05
50 5.71422004699707 0.25 1.9815651545273814e-05
100 5.9950056076049805 0.25 1.9634917766130493e-05
150 3.5554256439208984 0.25 1.945418398698717e-05
200 3.5855653285980225 0.375 1.9273450207843848e-05
250 3.3996706008911133 0.125 1.9092716428700527e-05

。。。。

5200 2.7103517055511475 0.5 1.2000722935116574e-06
5250 2.340709686279297 0.75 1.0193385143683355e-06
5300 2.316523551940918 0.375 8.386047352250136e-07
5350 2.541797399520874 0.5 6.578709560816917e-07
5400 1.3354747295379639 0.625 4.771371769383698e-07
5450 2.276153326034546 0.75 2.964033977950479e-07
5500 1.8481557369232178 0.75 1.1566961865172602e-07

 8.保存与加载模型

#保存模型
torch.save(model, '../data/model/预测中间词.model')#加载模型   需要加载到cpu,不然会报错
model_2 = torch.load('../data//model/预测中间词.model', map_location='cpu')
test(model_2)

 

0
tensor([ 2156,   562,    23,  1372,   128,    41,  7078, 13836])
tensor([ 2156,   562,    30, 13074,   128,    41, 23460, 13836])
10
tensor([  615,  1239, 15369, 30340,  1224, 39913,    32,     7])
tensor([ 3159,  1239, 15369, 30340,  1447, 13938,  2156,     7])
20
tensor([   29,    47,  3739, 21051,     9,    10,    98,  9599])
tensor([   29, 17504,  3739,  7580,     9,    10,    98,  9599])
30
tensor([3668,   29,  172,  147,    8, 1630,   10, 2156])
tensor([  98, 2696,   53,   14, 2156, 1630,   10, 6269])
40
tensor([ 213,   16, 3541, 1081,  117,  352,    5,   65])
tensor([213,  16,  24, 480, 117, 352,   5,  65])
50
tensor([35402,    19,   101,  4356,  1085,    45,   615,  5313])
tensor([35966,    19,    95,  4356,  1085,    45,   615,   676])
accuracy: 0.5122549019607843
<s>accuracy and<mask> are terrific ,</s>realism  pacing<s>a film made<mask> as little wit</s>with  with<s>the film is<mask> a series of</s>like  just<s>this is what<mask>ax was made</s>im  im<s>there 's<mask> provocative about this</s>nothing  nothing<s>the story may<mask> be new ,</s>not  not<s>there are just<mask> twists in the</s>enough  enough<s>a pleasant enough<mask> that should have</s>comedy  experience

 

 

相关文章:

nlp任务之预测中间词-huggingface

目录 1.加载编码器 1.1编码试算 2.加载数据集 3.数据集处理 3.1 map映射&#xff1a;只对数据集中的sentence数据进行编码 3.2用filter()过滤 单词太少的句子过滤掉 3.3截断句子 4.创建数据加载器Dataloader 5. 下游任务模型 6.测试预测代码 7.训练代码 8.保…...

《程序猿之Redis缓存实战 · Redis 与数据库一致性》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…...

【无标题】observer: error while loading shared libraries: libmariadb.so.3处理办法

文章目录 1.记录新装的oceanbase,使用observer帮助时&#xff0c;出现lib文件无法找到的处理过程 ./observer --help ./observer: error while loading shared libraries: libmariadb.so.3: cannot open shared object file: No such file or directory2.做一个strace跟踪&…...

极客兔兔Gee-Cache Day1

极客兔兔7Days GeeCache - Day1 interface{}&#xff1a;任意类型 缓存击穿&#xff1a;一个高并发的请求查询一个缓存中不存在的数据项&#xff0c;因此这个请求穿透缓存直接到达后端数据库或数据源来获取数据。如果这种请求非常频繁&#xff0c;就会导致后端系统的负载突然…...

[MAUI]数据绑定和MVVM:MVVM的属性验证

一、MVVM的属性验证案例 Toolkit.Mvvm框架中的ObservableValidator类,提供了属性验证功能,可以使用我们熟悉的验证特性对属性的值进行验证,并将错误属性提取和反馈给UI层。以下案例实现对UI层的姓名和年龄两个输入框,进行表单提交验证。实现效果如下所示 View<ContentP…...

2024年水利水电安全员考试题库及答案

一、判断题 1.采用水下钻孔爆破方案时&#xff0c;侧面应采用预裂爆破&#xff0c;并严格控制单响药量以保护附近建&#xff08;构&#xff09;筑物的安全。 答案&#xff1a;正确 2.围堰爆破拆除工程的实施应成立爆破指挥机构&#xff0c;并应按设计确定的安全距离设置警戒。…...

【快速删除 node_modules 】rimraf

目录 1. 什么是node_modules 2. 卸载一个npm包 3. 删除 node_modules 为什么这么慢 4. rimraf 5. 为什么rimraf 这么快 作为前端开发&#xff0c;无论我们关注不关注&#xff0c;每天都能接触到node_modules。通常产生于一个npm install命令&#xff0c;之后就不会多加关注…...

毕业设计选题:基于ssm+vue+uniapp的教学辅助小程序

开发语言&#xff1a;Java框架&#xff1a;ssmuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;M…...

13-指针和动态内存-内存泄漏

一、视频笔记&#xff1a; C语言通过malloc&#xff0c;来获取堆上的内存。 动态调用内存&#xff1a; malloc 和 free &#xff1b;new 和 delete 都行。 内存泄漏指的是我们动态申请了内存&#xff0c;但是即是是使用完了之后&#xff08;从来都不去释放它&#xff09;。只…...

基于深度学习的视频摘要生成

基于深度学习的视频摘要生成是一种通过自动化方式从长视频中提取关键片段&#xff0c;生成简洁且有代表性的视频摘要的技术。其目的是在保留视频主要内容的基础上&#xff0c;大幅缩短视频的播放时长&#xff0c;方便用户快速理解视频的核心信息。以下是视频摘要生成的主要方法…...

适合初学者的[JAVA]: 基础面试题

目录 说明 前言 String/StringBuffer/StringBuilder区别 第一点: 第二点: 总结&#xff1a; 反射机制 JVM内存结构 运行时数据区域被划分为5个主要组件&#xff1a; 方法区&#xff08;Method Area&#xff09; 堆区&#xff08;Heap Area&#xff09; 栈区&#x…...

internal.KaptWithoutKotlincTask$KaptExecutionWorkAction 问题 ---Room数据库

Caused by: java.lang.Exception: No native library is found for os.nameMac and os.archaarch64. path/org/sqlite/native/Mac/aarch64 m3 目前使用的是MAC M3芯片的配置会出现这个问题。M1就应该就有这个问题 解决&#xff1a; 在project层级的build.gradle中的allprojec…...

Frequency-aware Feature Fusion for Dense Image Prediction 论文阅读

摘要:密集图像预测任务要求具有强类别信息和高分辨率精确空间边界细节的特征。为了实现这一点&#xff0c;现代分层模型通常利用特征融合&#xff0c;直接添加来自深层的上采样粗特征和来自较低层次的高分辨率特征。在本文中&#xff0c;我们观察到融合特征值在对象内的快速变化…...

Springboot + netty + rabbitmq + myBatis

目录 0.为什么用消息队列1.代码文件创建结构2.pom.xml文件3.三个配置文件开发和生产环境4.Rabbitmq 基础配置类 TtlQueueConfig5.建立netty服务器 rabbitmq消息生产者6.建立常规队列的消费者 Consumer7.建立死信队列的消费者 DeadLetterConsumer8.建立mapper.xml文件9.建立map…...

电磁兼容(EMC):整改案例(四)人体对EFT测试影响有多大?

目录 1. 异常现象 2. 原因分析 3. 整改方案 4. 总结 1. 异常现象 某产品按GB/T 17626.4标准进行电快速瞬变脉冲群测试&#xff0c;测试条件为&#xff1a;频率5kHz/100kHz&#xff0c;测试电压L&#xff0c;N线间2kV&#xff0c;L&#xff0c;N线对PE线4kV。测试过程中需要…...

数据可视化基础:让数据说话

一、引言 在信息洪流中&#xff0c;数据可视化如同灯塔&#xff0c;照亮了数据的海洋&#xff0c;让我们能够洞察数据背后的意 义。 下面是对数据可视化的详细介绍&#xff0c;包括定义、作用、类型、原则、工具方法以及应用场景&#xff0c; 并附上具体的代码示例。 二、数…...

有哪些优化数据库性能的方法?如何定位慢查询?数据库性能优化全攻略:从慢查询定位到高效提升

在现代应用程序开发中&#xff0c;数据库的性能对于整体系统的响应能力至关重要。随着用户数量的增加和数据量的增长&#xff0c;如何优化数据库性能、定位慢查询成了每一个开发者面临的重要挑战。今天&#xff0c;我想和大家分享一些实用的数据库性能优化方法&#xff0c;以及…...

C语言 | Leetcode C语言题解之第450题删除二叉搜索树中的节点

题目&#xff1a; 题解&#xff1a; struct TreeNode* deleteNode(struct TreeNode* root, int key){struct TreeNode *cur root, *curParent NULL;while (cur && cur->val ! key) {curParent cur;if (cur->val > key) {cur cur->left;} else {cur c…...

智慧防灾,科技先行:EasyCVR平台助力地质灾害视频监测系统建设

随着科技的飞速发展&#xff0c;视频监控技术已成为地质灾害监测与预警的重要手段之一。在众多视频监控平台中&#xff0c;EasyCVR视频汇聚平台凭借其强大的视频整合、实时传输、视频处理及分发等能力&#xff0c;在地质灾害场景中展现出显著的应用优势。 一、实时监测与远程监…...

掌握C#核心概念:类、继承、泛型等

C# 是一门功能强大且灵活的面向对象编程语言&#xff0c;它结合了许多现代编程语言的特点和特性。无论你是编程新手&#xff0c;还是有经验的开发者&#xff0c;理解C#中的核心概念都是非常重要的。本文将介绍C#中的类与对象、构造函数和析构函数、方法的重载与重写、继承与多态…...

[VULFOCUS刷题]tomcat-pass-getshell 弱口令

tomcat-pass-getshell 弱口令 启动容器&#xff0c;打开网站 点开manageapp&#xff0c;输入弱口令 tomcat/tomcat 之后在下面上传jsp大马&#xff0c;首先生成一个jsp马 这里我直接使用github别人生成好的 tennc/webshell: This is a webshell open source project (github.…...

golang rpc

RPC&#xff08;Remote Procedure Call&#xff09;远程过程调用&#xff0c;简单的理解是一个节点请求另一个节点提供的服务&#xff0c;对应rpc的是本地过程调用&#xff0c;函数调用是最常用的本地过程调用&#xff0c;将本地过程调用变成远程调用会面临着各种问题。 以两数…...

A Learning-Based Approach to Static Program Slicing —— 论文笔记

A Learning-Based Approach to Static Program Slicing OOPLSA’2024 文章目录 A Learning-Based Approach to Static Program Slicing1. Abstract2. Motivation(1) 为什么需要能处理不完整代码(2) 现有方法局限性(3) 验证局限性: 初步实验研究实验设计何为不完整代码实验结果…...

掌握 C# 中的委托与事件机制

C# 中的委托和事件为开发者提供了处理回调、异步编程以及发布订阅模式的强大工具。委托与事件机制在实际应用中非常常见&#xff0c;特别是在事件驱动编程和 GUI 应用中。本文将带你深入理解委托的定义、匿名方法、Lambda 表达式、事件机制以及多播委托的使用。 1. 委托&#x…...

使用微服务Spring Cloud集成Kafka实现异步通信(消费者)

1、本文架构 本文目标是使用微服务Spring Cloud集成Kafka实现异步通信。其中Kafka Server部署在Ubuntu虚拟机上&#xff0c;微服务部署在Windows 11系统上&#xff0c;Kafka Producer微服务和Kafka Consumer微服务分别注册到Eureka注册中心。Kafka Producer和Kafka Consumer之…...

docker pull 超时Timeout失败的解决办法

当国内开发者docker pull遇到如下提示时&#xff0c;不要惊讶 [rootvm /]# docker pull postgres Using default tag: latest Error response from daemon: Get "https://registry-1.docker.io/v2/": dial tcp 128.121.146.235:443: i/o timeout [rootvm /]# 自2024…...

YOLOv7改进之主干DAMOYOLO结构,结合 CReToNeXt 结构,打造高性能检测器

一、DAMOYOLO理论部分 论文地址:2211.15444 (arxiv.org) 在本报告中,我们提出了一种快速准确的对象检测方法,称为 DAMO-YOLO,它实现了比最先进的 YOLO 系列更高的性能。DAMO-YOLO 是从 YOLO 扩展而来的,具有一些新技术,包括神经架构搜索 (NAS)、高效的重新参数化广义 …...

进度条(倒计时)Linux

\r回车(回到当前行开头) \n换行 行缓冲区概念 什么现象&#xff1f; 什么现象&#xff1f;&#xff1f; 什么现象&#xff1f;&#xff1f;&#xff1f; 自己总结&#xff1a; #pragma once 防止头文件被重复包含 倒计时 在main.c中&#xff0c;windows.h是不可以用的&…...

[每周一更]-(第117期):硬盘分区表类型:MBR和GPT区别

文章目录 1. **支持的磁盘容量**2. **分区数量**3. **引导方式**4. **冗余和数据恢复**5. **兼容性**6. **安全性**7. **操作系统支持**8. 对比 国庆假期前补一篇 在一次扫描机械硬盘故障的问题&#xff0c;发现我本机SSD和机械硬盘的分类型不一样&#xff0c;分别是GPT和MBR&a…...

河南移动:核心营业系统稳定运行超300天,数据库分布式升级实践|OceanBase案例

河南移动&#xff0c;作为电信全业务运营企业&#xff0c;不仅拥有庞大的客户群体和业务规模&#xff0c;还引领着业务产品与服务体系的创新发展。河南移动的原有核心营业系统承载着超过6000万的庞大用户量&#xff0c;管理着超过80TB的海量数据&#xff0c;因此也面临着数据规…...

wordpress首页位置/做一个电商平台大概需要多少钱

java异常 throwable 分为 exception、error error错误 程序无法处理的错误 exception异常 程序本身可以处理的异常 exception 分为 运行时异常、非运行异常 [运行时异常、error] 为 不可检查异常 可不做处理 编译器不做强制 没有异常处理 也能编译通过 [非运行时常] 为…...

做首饰网站/襄阳网站seo

第一步&#xff1a;创建工程 FirstSpringJAVA 第二步&#xff1a;新建dao层类 Dao.java package com.xuzhiwen.spring10;public class Dao {public void save(){System.out.println("Dao.save()...");} } 第三步&#xff1a;新建service类,将dao通过set的方式注入到…...

网站建设推销话术/百度贴吧首页

1. 问题描述 在给redis设置密码的时候&#xff08;修改完 redis-windows.conf 和 redis-windows-service.conf 的 requirespass 之后&#xff09;&#xff0c;输入一下指令安装服务 redis-server.exe --service-install redis.windows.conf 报错&#xff1a; 2. 解决方案 停…...

网站建设 拖欠尾款/外链工具

酷夏过后&#xff0c;迎来了凉爽的金秋。2010年10月9日&#xff0c;伴着徐徐秋风&#xff0c;延展咨询组织公司员工来到了美丽的杭州&#xff0c;开始了为期2天的休闲假期。 西湖湖畔微风习习&#xff0c;西溪湿地丛林鸟语&#xff0c;美丽的杭州从古至今都是享誉盛名的旅游佳地…...

武汉 网站制作/陕西网站seo

文章目录1 公式编号设置2 插入公式3 公式编号怎么自动更新3.1 正常插入公式 编号自动更新3.2 文章中 增加公式 编号自动更新3.3 文章中 删除公式 编号自动更新3.4 文中 引用的公式编号 及 自动更新以插入下面公式为例&#xff0c; 假如现在在第二单元&#xff0c;插入第一公式&…...

网站规划/重庆网站优化

需求&#xff1a;后端返回数据流&#xff0c;前端进行下载。 1.定义js文件&#xff0c;包含所有的blobType export const blobType {xls: application/vnd.ms-excel,xlsx: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,csv: text/csv,doc: applicatio…...