nlp任务之预测中间词-huggingface

news2024/10/1 2:16:44

目录

1.加载编码器

1.1编码试算 

2.加载数据集 

3.数据集处理 

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

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

3.3截断句子 

4.创建数据加载器Dataloader 

5. 下游任务模型 

6.测试预测代码 

7.训练代码

 8.保存与加载模型


 

1.加载编码器

from transformers import AutoTokenizer


tokenizer = 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):
        #将句子长度就裁剪到9
        data['input_ids'][i] = data['input_ids'][i][:9]
        data['attention_mask'][i] = [1] * 9
        data['labels'][i] = [-100] * 9
        
        #使用的distilroberta-base是基于Bert模型的,每个句子de 'input_ids'最后一个单词需要设置成2
        data['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] = 50264
    return 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, RobertaModel


class Model(torch.nn.Module):
    def __init__(self):
        super().__init__()
        #相当于encoder
        self.pretrained_model = RobertaModel.from_pretrained(r'../data/model/distilroberta-base/')
        
        #decoder:就是一层全连接层(线性层)
        #bert-base模型输出是768
        decoder = torch.nn.Linear(768, tokenizer.vocab_size)
        #全连接线性层有bias, 初始化为0 , size=tokenizer.vocab_size
        decoder.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_state
        logits = self.fc(logits)
        
        #计算损失
        loss = None
                
        if 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 = 0
    total = 0
    
    for i, data in enumerate(loader_test):
        #克隆data['labels']中索引为4的元素,取出来
        label = data['labels'][:, 4].clone()
        
        #从数据中抹掉label, 防止模型作弊
        data['labels'] = None
        
        #计算
        with torch.no_grad():  #不求导,不进行梯度下降
            #out:下游任务模型的输出结果,是一个字典,包含loss和logits
            out = 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:
            break
            
    print('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 / total
                
                lr = 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

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2181279.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MKV转MP4丨FFmpeg的简单命令使用——视频格式转换

MKV是一种视频封装格式&#xff0c;很好用&#xff0c;也是OBS的默认推荐录制格式&#xff0c;因为不会突然断电关机而导致整个视频录制文件丢失。 但是MKV无法直接导入PR中剪辑&#xff0c;最直接的方法是将MKV转换为MP4格式&#xff0c;最方便且安全无损的转换方法便是用FFmp…

AD软件的分屏显示功能

1.鼠标右键点击上面的窗格&#xff0c;选择“垂直分布”&#xff0c;即可以将AD软件分屏&#xff0c;左边选择原理图&#xff0c;右边选择PCB即可以方便去设计PCB的布局。实现原理图和pcb文件的同时查看。 还可以建立起2个图之间的联动关系。 比如我们在电路图里面选择stm32 m…

Threejs中使用A*算法寻路导航

<!DOCTYPE html> <html><head><title>Threejs中使用A*算法寻路导航&#xff0c;Threejs室内室外地图导航</title><script type"text/javascript" src"libs/three.js"></script><script type"text/javas…

MySQL | union all 和union(去重和不去重)

题1&#xff1a; 现在运营想要分别查看学校为山东大学或者性别为男性的用户的device_id、gender、age和gpa数据&#xff0c;请取出相应结果&#xff0c;结果不去重。 示例&#xff1a;user_profile 根据示例&#xff0c;你的查询应返回以下结果&#xff1a; UNION&#xff08…

【C/C++】 秋招常考面试题最全总结(让你有一种相见恨晚的感觉)

目录 1.C程序编译链接过程 2.浅拷贝和move有区别吗 3.深拷贝和浅拷贝的区别 4.空类的大小 5.类的继承有几种方式&#xff0c;区别是什么&#xff1f; 六、extern 关键字的作用 七、static关键字的作用 八、指针和引用的区别 九、C内存分配方式 十、结构体对齐…

manim中的桌面设计和实现转换

在这段代码中&#xff0c;我们实现了一系列富有创意和动态效果的数学表达式展示。这种展示方式不仅能够吸引观众的注意力&#xff0c;还能有效地传达复杂的数学概念。代码主要围绕一个点 dot 展开&#xff0c;它逐步转变为不同的数学公式和符号&#xff0c;每个转变过程都伴随着…

JUC高并发编程5:多线程锁

1 锁的八个问题演示 标准访问&#xff0c;先打印短信还是邮件 class Phone{public synchronized void sendSMS() throws InterruptedException {System.out.println("----------sendSMS");}public synchronized void sendEmail(){System.out.println("-------…

AndroidStudio导入so文件

点击app 右键依次选择New-Floder-JNI Floder 创建jni目录 将需要的so文件拷贝到jni目录 在app目录下&#xff0c;build.gradle文件的android{}中添加&#xff1a; sourceSets {main{jniLibs.srcDirs [src/main/jni]}}点击一下Sync Project with Gradle Files 然后编译生成AP…

第7届医联赛圆满举行,鱼跃医疗连续6年保障赛事安全

9月22日-26日&#xff0c;第7届医联赛戈壁群英会在甘肃瓜州举行&#xff0c;来自全国各地的3000名医药行业企业家代表齐聚一堂&#xff0c;开启为期3天的身心极限挑战——徒步穿越81公里的戈壁滩。鱼跃医疗连续6年全程保障参赛者的生命安全&#xff0c;助力赛事圆满完成。 鱼跃…

大模型初学者指南:笔记本电脑上用 ollama 运行大模型!

之前国外有一初学者小哥在Google Colab&#xff08;A100 40G&#xff09;利用DPO微调Mistral 7B&#xff0c;微调后的模型在基准测试中取得不错的成绩&#xff0c;从那时起&#xff0c;我觉得在笔记本电脑上运行/微调大模型并非遥不可及的。 对于初学者而言&#xff0c;如果能…

[论文精读]Multi-Channel Graph Neural Network for Entity Alignment

论文网址&#xff1a;Multi-Channel Graph Neural Network for Entity Alignment (aclanthology.org) 论文代码&#xff1a;https:// github.com/thunlp/MuGNN 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&a…

插上网线无法连接网络,控制面板以太网消失 | 如何重装网络驱动

如果你确定你的网线没问题&#xff0c;网线插口没问题&#xff0c;那你大概率就是驱动问题&#xff0c;可以试一下本方法。 0 以太网消失 事情是这样的&#xff0c;我工作时候需要接内网&#xff0c;插网线&#xff0c;摸鱼时候连外网&#xff0c;我就把网线关了。 每次插网线…

飞致云开源社区月度动态报告(2024年9月)

自2023年6月起&#xff0c;中国领先的开源软件公司FIT2CLOUD飞致云以月度为单位发布《飞致云开源社区月度动态报告》&#xff0c;旨在向广大社区用户同步飞致云旗下系列开源软件的发展情况&#xff0c;以及当月主要的产品新版本发布、社区运营成果等相关信息。 飞致云开源运营…

STM32F1+HAL库+FreeTOTS学习13——二值信号量

STM32F1HAL库FreeTOTS学习13——二值信号量 1. 信号量2. 二值信号量3. 相关API函数3.1 创建二值信号量3.2 获取信号量3.3 释放信号量3.4 删除信号量 4. 二值信号量操作实验1. 实验内容2. 代码实现&#xff1a;3. 运行结果 上一期我们学习了FreeRTOS中的队列&#xff0c;这一期我…

【Linux探索学习】第二弹——Linux的基础指令(中)——夯实基础第二篇

Linux基础指令&#xff08;上&#xff09;&#xff1a;【Linux探索学习】第一弹——Linux的基本指令&#xff08;上&#xff09;——开启Linux学习第一篇-CSDN博客 前言&#xff1a; 在前面我们已经讲解了一些常用的Linux的基础指令&#xff0c;那些当然是远远不够的&#xff…

舵机在无人机中的应用

一、舵机工作原理 舵机是一种位置&#xff08;角度&#xff09;伺服的驱动器&#xff0c;由电子控制与机械控制部分组成。当控制信号输入时&#xff0c;电子控制部分会根据控制器的指令调节直流电机输出的旋转角度和速度&#xff0c;由机械部分转化为控制面的位移以及相应的角…

基于SpringBoot+Vue的个人健康管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

基于Python可视化的学习系统的设计与实现(源码+文档+调试+答疑)

文章目录 一、项目介绍二、视频展示三、开发环境四、系统展示五、代码展示六、项目文档展示七、项目总结 大家可以帮忙点赞、收藏、关注、评论啦 &#x1f447;&#x1f3fb; 一、项目介绍 随着计算机技术发展&#xff0c;计算机系统的应用已延伸到社会的各个领域&#xff0c…

小程序原生-利用setData()对不同类型的数据进行增删改

1. 声明和绑定数据 wxml文件 <view> {{school}} </view> <view>{{obj.name}}</view> <view id"{{id}}" > 绑定属性值 </view> <checkbox checked"{{isChecked}}"/> <!--算数运算--> <view>{{ id …

TS系列(7):知识点汇总

你好&#xff0c;我是沐爸&#xff0c;欢迎点赞、收藏、评论和关注。 一、TS是什么&#xff1f; TypeScript 由微软开发&#xff0c;是基于 JavaScript 的一个扩展语言。TypeScript 包含 JavaScript 的所有内容&#xff0c;是 JavaScript 的超集。TypeScript 增加了静态类型检…