手把手教你通过 tensorflow-2.10 使用 BERT 实现 Semantic Similarity

news2024/11/20 20:27:35

前言

本文详细解释了在 tensorflow-gpu 基础上,实现用 BERT + BILSTM 计算文本相似度的过程,主要的配置如下:

tensorflow-gpu == 2.10.0
python == 3.10
transformers == 4.26.1

数据处理

这里导入了后续步骤需要用到的库,包括 NumPy、Pandas、TensorFlow 和 Transformers。同时设置了几个重要的参数。其中,max_length 表示输入文本的最大长度,batch_size 表示每个批次训练的样本数量,epochs 表示训练集训练次数,labels 列表包含了三个分类标签,分别为“矛盾”、“蕴含” 和 “中性”。

import numpy as np
import pandas as pd
import tensorflow as tf
import transformers

max_length = 128   
batch_size = 32
epochs = 2
labels = ["contradiction", "entailment", "neutral"]

这里使用 Pandas 库读取了 SNLI 数据集中的训练集、验证集和测试集。其中,训练集只读取了前 30 万条数据。接着打印了各数据集的样本数。然后,打印了训练集中的三组样本,每组样本包括两个句子和分类标签。

train_df = pd.read_csv("SNLI_Corpus/snli_1.0_train.csv", nrows=300000)
valid_df = pd.read_csv("SNLI_Corpus/snli_1.0_dev.csv")
test_df = pd.read_csv("SNLI_Corpus/snli_1.0_test.csv")
print(f"训练集样本数 : {train_df.shape[0]}")
print(f"验证集样本数: {valid_df.shape[0]}")
print(f"测试集样本数: {test_df.shape[0]}")

print()
print(f"句子一: {train_df.loc[5, 'sentence1']}")
print(f"句子二: {train_df.loc[5, 'sentence2']}")
print(f"相似度: {train_df.loc[5, 'similarity']}")

print()
print(f"句子一: {train_df.loc[3, 'sentence1']}")
print(f"句子二: {train_df.loc[3, 'sentence2']}")
print(f"相似度: {train_df.loc[3, 'similarity']}")

print()
print(f"句子一: {train_df.loc[4, 'sentence1']}")
print(f"句子二: {train_df.loc[4, 'sentence2']}")
print(f"相似度: {train_df.loc[4, 'similarity']}")	

打印:

训练集样本数 : 300000
验证集样本数: 10000
测试集样本数: 10000

句子一: Children smiling and waving at camera
句子二: The kids are frowning
相似度: contradiction

句子一: Children smiling and waving at camera
句子二: They are smiling at their parents
相似度: neutral

句子一: Children smiling and waving at camera
句子二: There are children present
相似度: entailment

首先使用 dropna 函数删除训练集中的缺失数据。然后对训练集、验证集和测试集中的分类标签为“-”的数据进行了删除操作。接着使用 sample 函数进行了打乱处理,并使用 reset_index 函数重置了索引。最后,打印了处理后的各个数据集样本数。

train_df.dropna(axis=0, inplace=True)
train_df = ( train_df[train_df.similarity != "-"].sample(frac=1.0, random_state=30).reset_index(drop=True) )
valid_df = ( valid_df[valid_df.similarity != "-"].sample(frac=1.0, random_state=30).reset_index(drop=True) )
test_df  = ( test_df[test_df.similarity != "-"].sample(frac=1.0, random_state=30).reset_index(drop=True) )
print(f"处理后训练集样本数 : {train_df.shape[0]}")
print(f"处理后验证集样本数: {valid_df.shape[0]}")
print(f"处理后测试集样本数: {test_df.shape[0]}")

打印:

处理后训练集样本数 : 299616
处理后验证集样本数: 9842
处理后测试集样本数: 9824

这里将训练集、验证集和测试集中的分类标签转换为数字,并将标签转换为 one-hot 编码格式。具体来说就是使用 apply 函数将 “contradiction” 标签转换为数字 0,将 “entailment” 标签转换为数字 1,将 “neutral” 标签转换为数字 2。然后,使用 to_categorical 函数将数字标签转换为 one-hot 编码格式。最终使用 y_train、y_val 和 y_test 存储了训练集、验证集和测试集的 one-hot 编码标签结果。

train_df["label"] = train_df["similarity"].apply(lambda x: 0 if x == "contradiction" else 1 if x == "entailment" else 2)
y_train = tf.keras.utils.to_categorical(train_df.label, num_classes=3)

valid_df["label"] = valid_df["similarity"].apply(lambda x: 0 if x == "contradiction" else 1 if x == "entailment" else 2)
y_val = tf.keras.utils.to_categorical(valid_df.label, num_classes=3)

test_df["label"] = test_df["similarity"].apply(lambda x: 0 if x == "contradiction" else 1 if x == "entailment" else 2)
y_test = tf.keras.utils.to_categorical(test_df.label, num_classes=3)	

模型搭建

这里定义了一个继承自 tf.keras.utils.Sequence 的类 BertSemanticDataGenerator ,用于生成 BERT 模型训练所需的数据。

在初始化时,需要传入句子对的数组 sentence_pairs 和对应的标签 labels,同时可以指定批次大小 batch_size ,shuffle 表示是否要打乱数据, include_targets 表示是否包含标签信息。类中还定义了一个 BERT 分词器 tokenizer,使用了 bert-base-uncased 预训练模型。

同时实现了 __len__ 、 __getitem__ 、on_epoch_end 三个方法, __len__ 用于获取数据集可以按照 batch_size 均分的批次数量 ,__getitem__ 首先使用索引从 self.sentence_pairs 中获取批数据,然后使用指定的编码器对这些句子对进行编码,使其适用于 BERT 模型的输入,最后返回输入和标签。on_epoch_end 方法在每轮训练之后判断是否需要打乱数据集。

class BertSemanticDataGenerator(tf.keras.utils.Sequence):
    def __init__( self, sentence_pairs, labels, batch_size=batch_size, shuffle=True, include_targets=True ):
        self.sentence_pairs = sentence_pairs
        self.labels = labels
        self.shuffle = shuffle
        self.batch_size = batch_size
        self.include_targets = include_targets
        self.tokenizer = transformers.BertTokenizer.from_pretrained("bert-base-uncased", do_lower_case=True )
        self.indexes = np.arange(len(self.sentence_pairs))
        self.on_epoch_end()

    def __len__(self):
        return len(self.sentence_pairs) // self.batch_size

    def __getitem__(self, idx):
        indexes = self.indexes[idx * self.batch_size : (idx + 1) * self.batch_size]
        sentence_pairs = self.sentence_pairs[indexes]

        encoded = self.tokenizer.batch_encode_plus( sentence_pairs.tolist(), add_special_tokens=True,
            max_length=max_length, return_attention_mask=True, return_token_type_ids=True,
            pad_to_max_length=True, return_tensors="tf")

        input_ids = np.array(encoded["input_ids"], dtype="int32")
        attention_masks = np.array(encoded["attention_mask"], dtype="int32")
        token_type_ids = np.array(encoded["token_type_ids"], dtype="int32")

        if self.include_targets:
            labels = np.array(self.labels[indexes], dtype="int32")
            return [input_ids, attention_masks, token_type_ids], labels
        else:
            return [input_ids, attention_masks, token_type_ids]

    def on_epoch_end(self):
        if self.shuffle:
            np.random.RandomState(30).shuffle(self.indexes)


这里使用 TensorFlow2 和 Transformers 库实现了一个基于 BERT 的文本分类模型。以下是代码的主要步骤。

首先,定义了三个输入张量:input_ids、attention_masks 和 token_type_ids ,这些张量的形状都是 (max_length,) ,其中 max_length 是预处理后的文本序列的最大长度。

接下来,定义了一个 BERT 模型 bert_model 。通过调用 TFBertModel.from_pretrained 方法,该模型从预先训练好的 BERT 模型中加载参数。同时,将 bert_model.trainable 设置为 False ,以避免在训练过程中更新 BERT 模型的参数。

然后,将 input_ids、attention_masks 和 token_type_ids 作为输入传入 bert_model ,得到 bert_output 。获取 BERT 模型的最后一个隐藏状态(last_hidden_state),作为 LSTM 层的输入。

接着,使用 Bi-LSTM 层对 sequence_output 进行处理,生成一个具有 64 个输出单元的 LSTM 层,返回整个序列。然后,将 Bi-LSTM 层的输出分别进行全局平均池化和全局最大池化,得到 avg_pool 和 max_pool 。将这两个输出连接起来,形成一个维度为 128 的向量,通过 Dropout 层后,经过一个 Dense 层输出最终的分类结果。

最后,使用 tf.keras.models.Model 方法,将 input_ids、attention_masks 和 token_type_ids 作为输入,output 作为输出,定义一个完整的神经网络模型。并使用 model.compile 方法编译模型,指定了优化器 Adam 、损失函数为 categorical_crossentropy 、评估指标为 acc 。

input_ids = tf.keras.layers.Input(shape=(max_length,), dtype=tf.int32, name="input_ids")
attention_masks = tf.keras.layers.Input(shape=(max_length,), dtype=tf.int32, name="attention_masks")
token_type_ids = tf.keras.layers.Input(shape=(max_length,), dtype=tf.int32, name="token_type_ids")
bert_model = transformers.TFBertModel.from_pretrained("bert-base-uncased")
bert_model.trainable = False
bert_output = bert_model.bert(input_ids, attention_mask=attention_masks, token_type_ids=token_type_ids)
sequence_output = bert_output.last_hidden_state
bi_lstm = tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(64, return_sequences=True))(sequence_output)
avg_pool = tf.keras.layers.GlobalAveragePooling1D()(bi_lstm)
max_pool = tf.keras.layers.GlobalMaxPooling1D()(bi_lstm)
concat = tf.keras.layers.concatenate([avg_pool, max_pool])
dropout = tf.keras.layers.Dropout(0.5)(concat)
output = tf.keras.layers.Dense(3, activation="softmax")(dropout)
model = tf.keras.models.Model(inputs=[input_ids, attention_masks, token_type_ids], outputs=output)
model.compile( optimizer=tf.keras.optimizers.Adam(), loss="categorical_crossentropy", metrics=["acc"],)
model.summary()	


打印模型结构可以看到, BERT 的参数都被冻结了:

Model: "model"
__________________________________________________________________________________________________
 Layer (type)                   Output Shape         Param #     Connected to                     
==================================================================================================
 input_ids (InputLayer)         [(None, 128)]        0           []                               
                                                                                                  
 attention_masks (InputLayer)   [(None, 128)]        0           []                               
                                                                                                  
 token_type_ids (InputLayer)    [(None, 128)]        0           []                               
                                                                                                  
 bert (TFBertMainLayer)         TFBaseModelOutputWi  109482240   ['input_ids[0][0]',              
                                thPoolingAndCrossAt               'attention_masks[0][0]',        
                                tentions(last_hidde               'token_type_ids[0][0]']         
                                n_state=(None, 128,                                               
                                 768),                                                            
                                 pooler_output=(Non                                               
                                e, 768),                                                          
                                 past_key_values=No                                               
                                ne, hidden_states=N                                               
                                one, attentions=Non                                               
                                e, cross_attentions                                               
                                =None)                                                            
                                                                                                  
 bidirectional (Bidirectional)  (None, 128, 128)     426496      ['bert[0][0]']                   
                                                                                                  
 global_average_pooling1d (Glob  (None, 128)         0           ['bidirectional[0][0]']          
 alAveragePooling1D)                                                                              
                                                                                                  
 global_max_pooling1d (GlobalMa  (None, 128)         0           ['bidirectional[0][0]']          
 xPooling1D)                                                                                      
                                                                                                  
 concatenate (Concatenate)      (None, 256)          0           ['global_average_pooling1d[0][0]'
                                                                 , 'global_max_pooling1d[0][0]']  
                                                                                                  
 dropout_37 (Dropout)           (None, 256)          0           ['concatenate[0][0]']            
                                                                                                  
 dense (Dense)                  (None, 3)            771         ['dropout_37[0][0]']             
                                                                                                  
==================================================================================================
Total params: 109,909,507
Trainable params: 427,267
Non-trainable params: 109,482,240	

模型训练

首先,将训练集和验证集传入 BertSemanticDataGenerator 对象中,创建一个训练数据生成器 train_data 和一个验证数据生成器 valid_data。然后,通过调用 model.fit() 方法,对模型进行训练。其中,训练数据为 train_data,验证数据为 valid_data。 use_multiprocessing 和 workers 参数用于指定在训练期间使用的进程数,以加快训练速度。

最后,训练历史记录存储在 history 变量中,可以使用这些历史数据来分析模型的训练效果。

train_data = BertSemanticDataGenerator( train_df[["sentence1", "sentence2"]].values.astype("str"), y_train, batch_size=batch_size, shuffle=True)
valid_data = BertSemanticDataGenerator( valid_df[["sentence1", "sentence2"]].values.astype("str"), y_val, batch_size=batch_size, shuffle=False)
history = model.fit( train_data, validation_data=valid_data, epochs=epochs, use_multiprocessing=True,  workers=-1 )

Epoch 1/2
	11/9363 [..............................] - ETA: 16:31 - loss: 1.1949 - acc: 0.3580
	31/9363 [..............................] - ETA: 13:51 - loss: 1.1223 - acc: 0.3831

	...
Epoch 2/2

	...

	9363/9363 [==============================] - ETA: 0s - loss: 0.5691 - acc: 0.7724
	9363/9363 [==============================] - 791s 84ms/step - loss: 0.5691 - acc: 0.7724 - val_loss: 0.4635 - val_acc: 0.8226

微调模型

这里是对训练好的 BERT 模型进行 fine-tuning,即对其进行微调以适应新任务。具体来说就是通过将 bert_model.trainable 设置为 True ,可以使得 BERT 模型中的参数可以在 fine-tuning 过程中进行更新。然后使用 tf.keras.optimizers.Adam(1e-5) 作为优化器,以较小的学习率进行微调。同时使用 categorical_crossentropy 作为损失函数,用来评估模型输出的预测分布与实际标签分布之间的差异。最后,通过 model.summary() 函数查看模型的结构和参数信息,可以发现所有的参数现在都可以训练了。

bert_model.trainable = True
model.compile( optimizer=tf.keras.optimizers.Adam(1e-5), loss="categorical_crossentropy",  metrics=["accuracy"] )
model.summary()

打印:

Model: "model"
__________________________________________________________________________________________________
 Layer (type)                   Output Shape         Param #     Connected to                     
==================================================================================================
 input_ids (InputLayer)         [(None, 128)]        0           []                               
                                                                                                  
 attention_masks (InputLayer)   [(None, 128)]        0           []                               
                                                                                                  
 token_type_ids (InputLayer)    [(None, 128)]        0           []                               
                                                                                                  
 bert (TFBertMainLayer)         TFBaseModelOutputWi  109482240   ['input_ids[0][0]',              
                                thPoolingAndCrossAt               'attention_masks[0][0]',        
                                tentions(last_hidde               'token_type_ids[0][0]']         
                                n_state=(None, 128,                                               
                                 768),                                                            
                                 pooler_output=(Non                                               
                                e, 768),                                                          
                                 past_key_values=No                                               
                                ne, hidden_states=N                                               
                                one, attentions=Non                                               
                                e, cross_attentions                                               
                                =None)                                                            
                                                                                                  
 bidirectional (Bidirectional)  (None, 128, 128)     426496      ['bert[0][0]']                   
                                                                                                  
 global_average_pooling1d (Glob  (None, 128)         0           ['bidirectional[0][0]']          
 alAveragePooling1D)                                                                              
                                                                                                  
 global_max_pooling1d (GlobalMa  (None, 128)         0           ['bidirectional[0][0]']          
 xPooling1D)                                                                                      
                                                                                                  
 concatenate (Concatenate)      (None, 256)          0           ['global_average_pooling1d[0][0]'
                                                                 , 'global_max_pooling1d[0][0]']  
                                                                                                  
 dropout_37 (Dropout)           (None, 256)          0           ['concatenate[0][0]']            
                                                                                                  
 dense (Dense)                  (None, 3)            771         ['dropout_37[0][0]']             
                                                                                                  
==================================================================================================
Total params: 109,909,507
Trainable params: 109,909,507
Non-trainable params: 0

接着上面的模型,继续进行微调训练,我们可以看到这次的准确率比之前有所提升。

history = model.fit( train_data, validation_data=valid_data, epochs=epochs, use_multiprocessing=True, workers=-1,)

打印:

Epoch 1/2
   7/9363 [..............................] - ETA: 24:41 - loss: 0.5716 - accuracy: 0.7946
...
Epoch 2/2
...
	9363/9363 [==============================] - 1500s 160ms/step - loss: 0.3201 - accuracy: 0.8845 - val_loss: 0.2933 - val_accuracy: 0.8974

模型评估

使用测试数据对模型的性能进行评估。

test_data = BertSemanticDataGenerator(  test_df[["sentence1", "sentence2"]].values.astype("str"), y_test, batch_size=batch_size, shuffle=False)
model.evaluate(test_data, verbose=1)

307/307 [==============================] - 18s 57ms/step - loss: 0.2916 - accuracy: 0.8951

推理测试

这里定义了一个名为 check_similarity 的函数,该函数可以用来检查两个句子的语义相似度。传入的参数是两个句子 sentence1 和 sentence2 。首先将这两个句子组成一个 np.array 格式方便处理,然后通过 BertSemanticDataGenerator 函数创建一个数据生成器生成模型需要的测试数据格式,使用训练好的函数返回句子对的预测概率,最后取预测概率最高的类别作为预测结果。

def check_similarity(sentence1, sentence2):
    sentence_pairs = np.array([[str(sentence1), str(sentence2)]])
    test_data = BertSemanticDataGenerator( sentence_pairs, labels=None, batch_size=1, shuffle=False, include_targets=False )
    proba = model.predict(test_data[0])[0]
    idx = np.argmax(proba)
    proba = f"{proba[idx]: .2f}%"
    pred = labels[idx]
    return pred, proba
    
sentence1 = "Male in a blue jacket decides to lay in the grass"
sentence2 = "The guy wearing a blue jacket is laying on the green grass"
check_similarity(sentence1, sentence2)

如何系统的去学习大模型LLM ?

作为一名热心肠的互联网老兵,我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。

但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的 AI大模型资料 包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来

😝有需要的小伙伴,可以V扫描下方二维码免费领取🆓

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

img

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

img

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

img

在这里插入图片描述

四、AI大模型商业化落地方案

img

阶段1:AI大模型时代的基础理解

  • 目标:了解AI大模型的基本概念、发展历程和核心原理。
  • 内容
    • L1.1 人工智能简述与大模型起源
    • L1.2 大模型与通用人工智能
    • L1.3 GPT模型的发展历程
    • L1.4 模型工程
    • L1.4.1 知识大模型
    • L1.4.2 生产大模型
    • L1.4.3 模型工程方法论
    • L1.4.4 模型工程实践
    • L1.5 GPT应用案例

阶段2:AI大模型API应用开发工程

  • 目标:掌握AI大模型API的使用和开发,以及相关的编程技能。
  • 内容
    • L2.1 API接口
    • L2.1.1 OpenAI API接口
    • L2.1.2 Python接口接入
    • L2.1.3 BOT工具类框架
    • L2.1.4 代码示例
    • L2.2 Prompt框架
    • L2.2.1 什么是Prompt
    • L2.2.2 Prompt框架应用现状
    • L2.2.3 基于GPTAS的Prompt框架
    • L2.2.4 Prompt框架与Thought
    • L2.2.5 Prompt框架与提示词
    • L2.3 流水线工程
    • L2.3.1 流水线工程的概念
    • L2.3.2 流水线工程的优点
    • L2.3.3 流水线工程的应用
    • L2.4 总结与展望

阶段3:AI大模型应用架构实践

  • 目标:深入理解AI大模型的应用架构,并能够进行私有化部署。
  • 内容
    • L3.1 Agent模型框架
    • L3.1.1 Agent模型框架的设计理念
    • L3.1.2 Agent模型框架的核心组件
    • L3.1.3 Agent模型框架的实现细节
    • L3.2 MetaGPT
    • L3.2.1 MetaGPT的基本概念
    • L3.2.2 MetaGPT的工作原理
    • L3.2.3 MetaGPT的应用场景
    • L3.3 ChatGLM
    • L3.3.1 ChatGLM的特点
    • L3.3.2 ChatGLM的开发环境
    • L3.3.3 ChatGLM的使用示例
    • L3.4 LLAMA
    • L3.4.1 LLAMA的特点
    • L3.4.2 LLAMA的开发环境
    • L3.4.3 LLAMA的使用示例
    • L3.5 其他大模型介绍

阶段4:AI大模型私有化部署

  • 目标:掌握多种AI大模型的私有化部署,包括多模态和特定领域模型。
  • 内容
    • L4.1 模型私有化部署概述
    • L4.2 模型私有化部署的关键技术
    • L4.3 模型私有化部署的实施步骤
    • L4.4 模型私有化部署的应用场景

学习计划:

  • 阶段1:1-2个月,建立AI大模型的基础知识体系。
  • 阶段2:2-3个月,专注于API应用开发能力的提升。
  • 阶段3:3-4个月,深入实践AI大模型的应用架构和私有化部署。
  • 阶段4:4-5个月,专注于高级模型的应用和部署。
这份完整版的大模型 LLM 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

😝有需要的小伙伴,可以Vx扫描下方二维码免费领取🆓

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

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

相关文章

通用Mapper基础学习

一、引入 二、快速入门 1.创建测试数据 2.搭建MyBatis+Spring 开发环境 3.集成Mapper 4.第一个操作 Mapper接口源码介绍: 创建测试类: 三、常见操作

电阻常见失效模式

电阻常见失效模式: 电阻器由于结构较为简单,工艺成熟,通常失效率相对较低。器失效主要表现为以下几种: 阻值漂移:老化后通常发生;(通过老化试验进行筛选,规避该问题) …

SLT简介【简单介绍SLT】

SLT简介 在c的学习当中STL的学习是一个很重要的一环,但是STL又是一个庞大的章节,因此这里我们先简单介绍一下STL,有助于后面我们对STL的学习,这里就是做一个简单的介绍,并无干货。 1.什么是STL STL(standard templa…

如何用R语言ggplot2画折线图

文章目录 前言一、数据集二、ggplot2画图1、全部代码2、细节拆分1)导包2)创建图形对象3)主题设置4)轴设置5)图例设置6)颜色7)保存图片 前言 一、数据集 数据下载链接见文章顶部 数据&#xff1a…

CentOS Stream 9 磁盘扩容

当Linux系统磁盘被占满且资料无法删除,需要新添加磁盘,并将新磁盘扩容到相应的满载磁盘中 查看现有磁盘分区 [rootwcg-lvm-001 ~]# fdisk -l Disk /dev/sda:180 GiB,193273528320 字节,377487360 个扇区 磁盘型号&am…

数据的加密解密——https协议

回顾http协议: http协议发送的请求或者响应里的2正文数据是不做任何加密的,数据是裸的(原数据是什么样,发送过去的护具就是怎么样),但是在客户端到服务器之间是要通过中间运营商,路由器等中间人…

从初级到专业级,百度打破了AI的天花板

文|王一粟、艺思 大模型爆火一年,超级应用在哪里? 相比在ChatGPT问世时,人们对于“AI问答产品”寄予的超高期待,AI在办公场景中率先展现出来的能量,超出了所有人的预期。 6月7日,“AI产品榜”…

mmdetection使用未定义backbone训练

首先找到你需要用到的 backbone,一般有名的backbone 都会在github有相应的代码开源和预训练权重提供 本文以mobilenetv3 fastercnn 作为举例,在mmdetection中并未提供 mobilenetv3,提供的仅有 mobilenetv2; 在github上找到 mobil…

【设计模式】结构型-桥接模式

当抽象与实现,各自独立, 桥接模式,如彩虹桥,连接两岸。 文章目录 一、类爆炸与代码重复二、桥接模式三、桥接模式的核心组成四、运用桥接模式五、桥接模式的应用场景六、小结推荐阅读 一、类爆炸与代码重复 场景假设&#xff1a…

C++第二十六弹---stack和queue的基本操作详解与模拟实现

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】 目录 1. stack的介绍和使用 1.1 stack的介绍 ​1.2 stack的使用 1.3 stack 模拟实现 2. queue的介绍和使用 2.1 queue的介绍 2.2 queue的使用 2…

5.31.15 使用图像到图像转换和 YOLO 技术对先前的乳房 X 光检查结果中的异常进行早期检测和分类

在本研究中,我们研究了基于 You-Only-Look-Once (YOLO) 架构的端到端融合模型的有效性,该模型可同时检测和分类数字乳房 X 光检查中的可疑乳腺病变。包括四类病例:肿块、钙化、结构扭曲和正常,这些病例来自包含 413 个病例的私人数…

一次曝 9 个大模型,「字节 AI」这一年都在做什么?

字节跳动的大模型家族,会长出下一个抖音吗? 整个 2023 年,字节并没有对外官宣其内部自研的大模型。外界一度认为,大模型这一技术变革,字节入场晚了。梁汝波在去年底的年会上也提到了这一点,他表示「字节对…

【全开源】露营地管理系统小程序源码(ThinkPHP+FastAdmin+UniApp)

专为露营业务设计开发小程序应用。平台拥有多角色管理,同时具有营位预定、门票购买等功能模块。 🔥露营地管理系统小程序:轻松掌控你的露营帝国🏕️ 📌一、引言:露营地管理的新时代 随着露营文化的兴起&a…

❤vue2项目webpack打包的优化策略

❤ vue2项目webpack打包的优化策略 (优化前) 现在我们的打包时间为: >打包体积大小为: 1、去除开发环境和生产环境提示以及日志 开发环境和生产环境的打印处理 生产环境去除console.log打印的两种方式 通过环境变量控制co…

知识图谱的应用---社交网络

文章目录 社交网络典型应用 社交网络 社交网络已成为发展最快的互联网应用,社交网络用户不仅仅是信息的接受者,也成为了信息的制造、加工和传播者,通过关注、被关注的方式形成了一张张庞杂繁复的用户关系网。随着社交网络中用户及信息急速增长…

数新网络签单国泰君安:利用数据服务平台提升金融业务用数能力

近日,数新网络与国泰君安证券股份有限公司(以下简称“国泰君安”)达成了数据服务平台升级项目的签约。这一项目的推进将更好地服务于国泰君安内部业务部门的数据需求,帮助数据平台更加有效地实现提升业务响应效率的目标&#xff0…

【Linux文件篇】系统文件、文件描述符与重定向的实用指南

W...Y的主页 😊 代码仓库分享💕 前言:相信大家对文件都不会太陌生、也不会太熟悉。在没有学习Linux操作系统时,我们在学习C或C时都学过如何去创建、打开、读写等待文件的操作,知道一些语言级别的一些接口与函数。但…

怎样把便签里的内容移到桌面?桌面便签软件使用方法

每次打开电脑,我总是被满屏的文件和图标弄得眼花缭乱。那些记录在各式各样便签里的重要事项,经常被埋没在这信息的海洋中,找起来真是头疼。想必很多人都有过这样的困扰:如何在繁杂的桌面环境中,一眼就看到自己需要提醒…

问题:以下被纳入代理资产风险分类管理的业务包括() #媒体#知识分享

问题:以下被纳入代理资产风险分类管理的业务包括() A.非标准化理财投资业务 B.特定债权投资业务 C.委托债权代理业务 D.非标准化代理销售业务 参考答案如图所示

HTML静态网页成品作业(HTML+CSS)—— 兰蔻化妆品网页(1个页面)

🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有1个页面。 二、作品演示 三、代…